(同事无聊写的...)

由于网卡的MAC地址是可以改动的,所以很多情况下,正在使用的MAC地址和网卡硬件地址是不一样的,获取正在使用的MAC地址很容易,网上可以搜到很多方法,但却很少有谁提供获取网卡硬件地址的方法,本人提供这个方法,希望对大家能有帮助。
      先声明几个API函数
       [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool DeviceIoControl(
            IntPtr HDevice,
            uint dwIoControlCode,
            IntPtr lpInBuffer,
            uint nInBufferSize,
            IntPtr lpOutBuffer,
            uint nOutBufferSize,
            ref uint lpBytesReturned,
            IntPtr lpOverlapped);


        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]

        public static extern bool CloseHandle(IntPtr hObject);

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern IntPtr CreateFile(
            string lpFileName,
            uint dwDesiredAccess,
            uint dwShareMode,
            IntPtr lpSecurityAttributes,
            uint dwCreationDisposition,
            uint dwFlagsAndAttributes,
            IntPtr hTemplateFile);


     获取网卡地址的方法如下:
     

       string GetNicAddress(string NicId)
       {


           System.IntPtr hDevice = CreateFile("\\\\.\\"+NicId,
                                               0x80000000 | 0x40000000,
                                               0,
                                               IntPtr.Zero,
                                               3,
                                               4,
                                               IntPtr.Zero
                                               );





           if (hDevice.ToInt32() == -1)
           {
               return null;
           }

           uint Len = 0;
           IntPtr Buffer = Marshal.AllocHGlobal(256);

           Marshal.WriteInt32(Buffer, 0x01010101);


           if (!DeviceIoControl(hDevice,
                             0x170002,
                             Buffer,
                             4,
                             Buffer,
                             256,
                             ref Len,
                             IntPtr.Zero))
           {

               Marshal.FreeHGlobal(Buffer);
               CloseHandle(hDevice);
               return null;

           }

           byte[] macBytes = new byte[6];
           Marshal.Copy(Buffer, macBytes, 0, 6);

           Marshal.FreeHGlobal(Buffer);
           CloseHandle(hDevice);
           return new System.Net.NetworkInformation.PhysicalAddress(macBytes).ToString();
     
          
       }


该方法的形参是网卡的ID ,形式如:{B50027F7-7A42-4F2D-8935-7620F1DB632F} 这样的字符串。

         调用该函数的代码如下:
         string NicAddress = GetNicAddress("{B50027F7-7A42-4F2D-8935-7620F1DB632F}");

    
   
以下函数获取本机所有的以太网卡的ID

   public ArrayList GetAllNic()
       {
           NetworkInterface[] Nics = NetworkInterface.GetAllNetworkInterfaces();
           System.Collections.ArrayList EtherNics = new ArrayList(20);



           foreach (NetworkInterface nic in Nics)
           {

               if (nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet)
               {
                   EtherNics.Add(nic.Id);
               }
           }

           return EtherNics;
      
       }

     

       以下代码输出本机所有以太网卡的网卡地址:

        ArrayList allNics = GetAllNic();

            foreach (object Nicid in allNics)
            {

               Console.WriteLine( GetNicAddress(Nicid.ToString()));
           
            }