解决方案 »

  1.   

    http://download.csdn.net/detail/wawd74520/4467372
      

  2.   

    codeproject.com调用WMI或者dll的两种方法并提供源代码
    HostName, IP, and MAC Address(英文)
    获取局域网内的IP和Mac地址(英文)using System;
    using System.Runtime.InteropServices;
    using System.Collections.Generic;
    using System.Net;
    using System.Net.NetworkInformation;namespace LanIps
    {
    class Program
    {
    public static void Main(string[] args)
    {
    Console.WriteLine("Hello World!");

    // TODO: Implement Functionality Here
    // Get my PC IP address
    Console.WriteLine("My IP : {0}", GetIPAddress());
    // Get My PC MAC address
    Console.WriteLine("My MAC: {0}", GetMacAddress());
    // Get My PC HostName
    Console.WriteLine("My HostName: {0}", Dns.GetHostName());
    // Get all devices on network
    Dictionary<IPAddress, PhysicalAddress> all = GetAllDevicesOnLAN();
    foreach (KeyValuePair<IPAddress, PhysicalAddress> kvp in all)
    {
    Console.WriteLine("IP : {0}\n MAC {1}", kvp.Key, kvp.Value);
    }

    Console.Write("Press any key to continue . . . ");
    Console.ReadKey(true);
    }

    /// <summary>
    /// MIB_IPNETROW structure returned by GetIpNetTable
    /// DO NOT MODIFY THIS STRUCTURE.
    /// </summary>
    [StructLayout(LayoutKind.Sequential)]
    struct MIB_IPNETROW
    {
    [MarshalAs(UnmanagedType.U4)]
    public int dwIndex;
    [MarshalAs(UnmanagedType.U4)]
    public int dwPhysAddrLen;
    [MarshalAs(UnmanagedType.U1)]
    public byte mac0;
    [MarshalAs(UnmanagedType.U1)]
    public byte mac1;
    [MarshalAs(UnmanagedType.U1)]
    public byte mac2;
    [MarshalAs(UnmanagedType.U1)]
    public byte mac3;
    [MarshalAs(UnmanagedType.U1)]
    public byte mac4;
    [MarshalAs(UnmanagedType.U1)]
    public byte mac5;
    [MarshalAs(UnmanagedType.U1)]
    public byte mac6;
    [MarshalAs(UnmanagedType.U1)]
    public byte mac7;
    [MarshalAs(UnmanagedType.U4)]
    public int dwAddr;
    [MarshalAs(UnmanagedType.U4)]
    public int dwType;
    } /// <summary>
    /// GetIpNetTable external method
    /// </summary>
    /// <param name="pIpNetTable"></param>
    /// <param name="pdwSize"></param>
    /// <param name="bOrder"></param>
    /// <returns></returns>
    [DllImport("IpHlpApi.dll")]
    [return: MarshalAs(UnmanagedType.U4)]
    static extern int GetIpNetTable(IntPtr pIpNetTable,
                                    [MarshalAs(UnmanagedType.U4)] ref int pdwSize, bool bOrder); /// <summary>
    /// Error codes GetIpNetTable returns that we recognise
    /// </summary>
    const int ERROR_INSUFFICIENT_BUFFER = 122;
    /// <summary>
    /// Get the IP and MAC addresses of all known devices on the LAN
    /// </summary>
    /// <res>
    /// 1) This table is not updated often - it can take some human-scale time
    ///    to notice that a device has dropped off the network, or a new device
    ///    has connected.
    /// 2) This discards non-local devices if they are found - these are multicast
    ///    and can be discarded by IP address range.
    /// </res>
    /// <returns></returns>
    private static Dictionary<IPAddress, PhysicalAddress> GetAllDevicesOnLAN()
    {
    Dictionary<IPAddress, PhysicalAddress> all = new Dictionary<IPAddress, PhysicalAddress>();
    // Add this PC to the list...
    all.Add(GetIPAddress(), GetMacAddress());
    int spaceForNetTable = 0;
    // Get the space needed
    // We do that by requesting the table, but not giving any space at all.
    // The return value will tell us how much we actually need.
    GetIpNetTable(IntPtr.Zero, ref spaceForNetTable, false);
    // Allocate the space
    // We use a try-finally block to ensure release.
    IntPtr rawTable = IntPtr.Zero;
    try
    {
    rawTable = Marshal.AllocCoTaskMem(spaceForNetTable);
    // Get the actual data
    int errorCode = GetIpNetTable(rawTable, ref spaceForNetTable, false);
    if (errorCode != 0)
    {
    // Failed for some reason - can do no more here.
    throw new Exception(string.Format(
    "Unable to retrieve network table. Error code {0}", errorCode));
    }
    // Get the rows count
    int rowsCount = Marshal.ReadInt32(rawTable);
    IntPtr currentBuffer = new IntPtr(rawTable.ToInt64() + Marshal.SizeOf(typeof(Int32)));
    // Convert the raw table to individual entries
    MIB_IPNETROW[] rows = new MIB_IPNETROW[rowsCount];
    for (int index = 0; index < rowsCount; index++)
    {
    rows[index] = (MIB_IPNETROW)Marshal.PtrToStructure(new IntPtr(currentBuffer.ToInt64() +
                                                                  (index * Marshal.SizeOf(typeof(MIB_IPNETROW)))
                                                                 ),
                                                       typeof(MIB_IPNETROW));
    }
    // Define the dummy entries list (we can discard these)
    PhysicalAddress virtualMAC = new PhysicalAddress(new byte[] { 0, 0, 0, 0, 0, 0 });
    PhysicalAddress broadcastMAC = new PhysicalAddress(new byte[] { 255, 255, 255, 255, 255, 255 });
    foreach (MIB_IPNETROW row in rows)
    {
    IPAddress ip = new IPAddress(BitConverter.GetBytes(row.dwAddr));
    byte[] rawMAC = new byte[] { row.mac0, row.mac1, row.mac2, row.mac3, row.mac4, row.mac5 };
    PhysicalAddress pa = new PhysicalAddress(rawMAC);
    if (!pa.Equals(virtualMAC) && !pa.Equals(broadcastMAC) && !IsMulticast(ip))
    {
    //Console.WriteLine("IP: {0}\t\tMAC: {1}", ip.ToString(), pa.ToString());
    if (!all.ContainsKey(ip))
    {
    all.Add(ip, pa);
    }
    }
    }
    }
    finally
    {
    // Release the memory.
    Marshal.FreeCoTaskMem(rawTable);
    }
    return all;
    } /// <summary>
    /// Gets the IP address of the current PC
    /// </summary>
    /// <returns></returns>
    private static IPAddress GetIPAddress()
    {
    String strHostName = Dns.GetHostName();
    IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);
    IPAddress[] addr = ipEntry.AddressList;
    foreach (IPAddress ip in addr)
    {
    if (!ip.IsIPv6LinkLocal)
    {
    return (ip);
    }
    }
    return addr.Length > 0 ? addr[0] : null;
    } /// <summary>
    /// Gets the MAC address of the current PC.
    /// </summary>
    /// <returns></returns>
    private static PhysicalAddress GetMacAddress()
    {
    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
    {
    // Only consider Ethernet network interfaces
    if (nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet &&
        nic.OperationalStatus == OperationalStatus.Up)
    {
    return nic.GetPhysicalAddress();
    }
    }
    return null;
    } /// <summary>
    /// Returns true if the specified IP address is a multicast address
    /// </summary>
    /// <param name="ip"></param>
    /// <returns></returns>
    private static bool IsMulticast(IPAddress ip)
    {
    bool result = true;
    if (!ip.IsIPv6Multicast)
    {
    byte highIP = ip.GetAddressBytes()[0];
    if (highIP < 224 || highIP > 239)
    {
    result = false;
    }
    }
    return result;
    }
    }
    }