C#获取MAC地址的几种方法(补充版)

C#断网情况下获取本机MAC地址的方法 MAC地址用于在网络中唯一标识一个网卡,在网络应用中用来确认网上设备的位置。 查到的获取MAC的几种方式(参考:https://www.cnblogs.com/diulela/archive/2012/04/07/2436111.html),其中通过WMI系统服务读取MAC地址的方式比较常用,方法如下: ///<summary> /// 通过WMI读取MAC ///</su... 阅读详情

来自:http://blog.youkuaiyun.com/yysyangyangyangshan/article/details/7091783

关于获取本地电脑的MAC地址,除了前面说过的根据WMI获取http://blog.youkuaiyun.com/yysyangyangyangshan/article/details/6803787,其实还有好几种方式来获取mac地址,下面一一道来。

首先需要用到的一些方法和类:

  1. public enum NCBCONST
  2. {
  3. NCBNAMSZ = 16,
  4. MAX_LANA = 254,
  5. NCBENUM = 0x37,
  6. NRC_GOODRET = 0x00,
  7. NCBRESET = 0x32,
  8. NCBASTAT = 0x33,
  9. NUM_NAMEBUF = 30,
  10. }
  11. [StructLayout(LayoutKind.Sequential)]
  12. public struct ADAPTER_STATUS
  13. {
  14. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
  15. public byte[] adapter_address;
  16. public byte rev_major;
  17. public byte reserved0;
  18. public byte adapter_type;
  19. public byte rev_minor;
  20. public ushort duration;
  21. public ushort frmr_recv;
  22. public ushort frmr_xmit;
  23. public ushort iframe_recv_err;
  24. public ushort xmit_aborts;
  25. public uint xmit_success;
  26. public uint recv_success;
  27. public ushort iframe_xmit_err;
  28. public ushort recv_buff_unavail;
  29. public ushort t1_timeouts;
  30. public ushort ti_timeouts;
  31. public uint reserved1;
  32. public ushort free_ncbs;
  33. public ushort max_cfg_ncbs;
  34. public ushort max_ncbs;
  35. public ushort xmit_buf_unavail;
  36. public ushort max_dgram_size;
  37. public ushort pending_sess;
  38. public ushort max_cfg_sess;
  39. public ushort max_sess;
  40. public ushort max_sess_pkt_size;
  41. public ushort name_count;
  42. }
  43. [StructLayout(LayoutKind.Sequential)]
  44. public struct NAME_BUFFER
  45. {
  46. [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.NCBNAMSZ)]
  47. public byte[] name;
  48. public byte name_num;
  49. public byte name_flags;
  50. }
  51. [StructLayout(LayoutKind.Sequential)]
  52. public struct NCB
  53. {
  54. public byte ncb_command;
  55. public byte ncb_retcode;
  56. public byte ncb_lsn;
  57. public byte ncb_num;
  58. public IntPtr ncb_buffer;
  59. public ushort ncb_length;
  60. [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.NCBNAMSZ)]
  61. public byte[] ncb_callname;
  62. [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.NCBNAMSZ)]
  63. public byte[] ncb_name;
  64. public byte ncb_rto;
  65. public byte ncb_sto;
  66. public IntPtr ncb_post;
  67. public byte ncb_lana_num;
  68. public byte ncb_cmd_cplt;
  69. [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
  70. public byte[] ncb_reserve;
  71. public IntPtr ncb_event;
  72. }
  73. [StructLayout(LayoutKind.Sequential)]
  74. public struct LANA_ENUM
  75. {
  76. public byte length;
  77. [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.MAX_LANA)]
  78. public byte[] lana;
  79. }
  80. [StructLayout(LayoutKind.Auto)]
  81. public struct ASTAT
  82. {
  83. public ADAPTER_STATUS adapt;
  84. [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.NUM_NAMEBUF)]
  85. public NAME_BUFFER[] NameBuff;
  86. }
  87. public class Win32API
  88. {
  89. [DllImport("NETAPI32.DLL")]
  90. public static extern char Netbios(ref NCB ncb);
  91. }
  92. [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
  93. public class IP_Adapter_Addresses
  94. {
  95. public uint Length;
  96. public uint IfIndex;
  97. public IntPtr Next;
  98. public IntPtr AdapterName;
  99. public IntPtr FirstUnicastAddress;
  100. public IntPtr FirstAnycastAddress;
  101. public IntPtr FirstMulticastAddress;
  102. public IntPtr FirstDnsServerAddress;
  103. public IntPtr DnsSuffix;
  104. public IntPtr Description;
  105. public IntPtr FriendlyName;
  106. [MarshalAs(UnmanagedType.ByValArray,
  107. SizeConst = 8)]
  108. public Byte[] PhysicalAddress;
  109. public uint PhysicalAddressLength;
  110. public uint flags;
  111. public uint Mtu;
  112. public uint IfType;
  113. public uint OperStatus;
  114. public uint Ipv6IfIndex;
  115. public uint ZoneIndices;
  116. public IntPtr FirstPrefix;
  117. }
    public enum NCBCONST
    {
        NCBNAMSZ = 16,             
        MAX_LANA = 254,            
        NCBENUM = 0x37,            
        NRC_GOODRET = 0x00,        
        NCBRESET = 0x32,           
        NCBASTAT = 0x33,           
        NUM_NAMEBUF = 30,          
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct ADAPTER_STATUS
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
        public byte[] adapter_address;
        public byte rev_major;
        public byte reserved0;
        public byte adapter_type;
        public byte rev_minor;
        public ushort duration;
        public ushort frmr_recv;
        public ushort frmr_xmit;
        public ushort iframe_recv_err;
        public ushort xmit_aborts;
        public uint xmit_success;
        public uint recv_success;
        public ushort iframe_xmit_err;
        public ushort recv_buff_unavail;
        public ushort t1_timeouts;
        public ushort ti_timeouts;
        public uint reserved1;
        public ushort free_ncbs;
        public ushort max_cfg_ncbs;
        public ushort max_ncbs;
        public ushort xmit_buf_unavail;
        public ushort max_dgram_size;
        public ushort pending_sess;
        public ushort max_cfg_sess;
        public ushort max_sess;
        public ushort max_sess_pkt_size;
        public ushort name_count;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct NAME_BUFFER
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.NCBNAMSZ)]
        public byte[] name;
        public byte name_num;
        public byte name_flags;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct NCB
    {
        public byte ncb_command;
        public byte ncb_retcode;
        public byte ncb_lsn;
        public byte ncb_num;
        public IntPtr ncb_buffer;
        public ushort ncb_length;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.NCBNAMSZ)]
        public byte[] ncb_callname;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.NCBNAMSZ)]
        public byte[] ncb_name;
        public byte ncb_rto;
        public byte ncb_sto;
        public IntPtr ncb_post;
        public byte ncb_lana_num;
        public byte ncb_cmd_cplt;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
        public byte[] ncb_reserve;
        public IntPtr ncb_event;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct LANA_ENUM
    {
        public byte length;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.MAX_LANA)]
        public byte[] lana;
    }

    [StructLayout(LayoutKind.Auto)]
    public struct ASTAT
    {
        public ADAPTER_STATUS adapt;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = (int)NCBCONST.NUM_NAMEBUF)]
        public NAME_BUFFER[] NameBuff;
    }
    public class Win32API
    {
        [DllImport("NETAPI32.DLL")]
        public static extern char Netbios(ref   NCB ncb);
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class IP_Adapter_Addresses
    {
        public uint Length;
        public uint IfIndex;
        public IntPtr Next;

        public IntPtr AdapterName;
        public IntPtr FirstUnicastAddress;
        public IntPtr FirstAnycastAddress;
        public IntPtr FirstMulticastAddress;
        public IntPtr FirstDnsServerAddress;

        public IntPtr DnsSuffix;
        public IntPtr Description;

        public IntPtr FriendlyName;

        [MarshalAs(UnmanagedType.ByValArray,
             SizeConst = 8)]
        public Byte[] PhysicalAddress;

        public uint PhysicalAddressLength;
        public uint flags;
        public uint Mtu;
        public uint IfType;

        public uint OperStatus;

        public uint Ipv6IfIndex;
        public uint ZoneIndices;

        public IntPtr FirstPrefix;
    }

1、 SendArp 获取MAC地址

SendARP函数用来发送ARP数据包并在定义的MAC缓冲区中返回定义的IP对应的MAC地址

SendARP(

IPAddr DestIP,

IPAddr SrcIP,

PULONG pMacAddr,

PULONG PhyAddrLen

);

第一个参数是IP地址的网络字节顺序,而不是一个指针,当初我就是赋值成指针而使得获取不了MAC地址。

第二个参数填0就可以

第三个参数是MAC缓冲区指针

第四个参数是一个指向一个DWORD型数值为6的指针

代码如下:

  1. [DllImport("Iphlpapi.dll")]
  2. static extern int SendARP(Int32 DestIP, Int32 SrcIP, ref Int64 MacAddr, ref Int32 PhyAddrLen);
  3. /// <summary>
  4. /// SendArp获取MAC地址
  5. /// </summary>
  6. /// <returns></returns>
  7. public string GetMacAddressBySendARP()
  8. {
  9. StringBuilder strReturn = new StringBuilder();
  10. try
  11. {
  12. System.Net.IPHostEntry Tempaddr = (System.Net.IPHostEntry)Dns.GetHostByName(Dns.GetHostName());
  13. System.Net.IPAddress[] TempAd = Tempaddr.AddressList;
  14. Int32 remote = (int)TempAd[0].Address;
  15. Int64 macinfo = new Int64();
  16. Int32 length = 6;
  17. SendARP(remote, 0, ref macinfo, ref length);
  18. string temp = System.Convert.ToString(macinfo, 16).PadLeft(12, '0').ToUpper();
  19. int x = 12;
  20. for (int i = 0; i < 6; i++)
  21. {
  22. if (i == 5) { strReturn.Append(temp.Substring(x - 2, 2)); }
  23. else { strReturn.Append(temp.Substring(x - 2, 2) + ":"); }
  24. x -= 2;
  25. }
  26. return strReturn.ToString();
  27. }
  28. catch
  29. {
  30. return "";
  31. }
  32. }
        [DllImport("Iphlpapi.dll")]
        static extern int SendARP(Int32 DestIP, Int32 SrcIP, ref Int64 MacAddr, ref Int32 PhyAddrLen);
        /// <summary>
        /// SendArp获取MAC地址
        /// </summary>
        /// <returns></returns>
        public string GetMacAddressBySendARP()
        {
            StringBuilder strReturn = new StringBuilder();
            try
            {
                System.Net.IPHostEntry Tempaddr = (System.Net.IPHostEntry)Dns.GetHostByName(Dns.GetHostName());
                System.Net.IPAddress[] TempAd = Tempaddr.AddressList;
                Int32 remote = (int)TempAd[0].Address;
                Int64 macinfo = new Int64();
                Int32 length = 6;
                SendARP(remote, 0, ref macinfo, ref length);

                string temp = System.Convert.ToString(macinfo, 16).PadLeft(12, '0').ToUpper();

                int x = 12;
                for (int i = 0; i < 6; i++)
                {
                    if (i == 5) { strReturn.Append(temp.Substring(x - 2, 2)); }
                    else { strReturn.Append(temp.Substring(x - 2, 2) + ":"); }
                    x -= 2;
                }

                return strReturn.ToString();
            }
            catch
            {
                return "";
            }
        }

2、通过适配器信息获取MAC地址

iphlpapi.dll是Windows IP辅助API应用程序接口模块。其中一个函数GetAdaptersAddresses:返回和适配器关联的地址

uint GetAdaptersAddresses(uint Family, uint flags, IntPtr Reserved,

IntPtr PAdaptersAddresses, ref uint pOutBufLen);

Family:[输入]获得地址族,必须是以下值之一:

AF_INET (仅返回IPv4地址),

AF_INET6(仅返回IPv6地址),

AF_UNSPEC(从所有的地址族返回地址)

Flags:[输入]返回地址类型,这个参数为0或是以下值的联合值:

GAA_FLAG_INCLUDE_PREFIX (返回IPv6地址前缀)

GAA_FLAG_SKIP_UNICAST(不返回unicast地址)

GAA_FLAG_SKIP_ANYCAST(不返回anycast地址)

GAA_FLAG_SKIP_FRIENDLY_NAME(不返回适配器的友好名称)

GAA_FLAG_SKIP_MULTICAST (不返回多点传送(multicast)地址)

GAA_FLAG_SKIP_DNS_SERVER (不返回DNS服务器地址)

Reserved:调用程序必须将此参数置为NULL

pAdapterAddresses:[输入,输出] 指向一段IP_ADAPTER_ADDRESSES缓存,成功的话,该缓存包含地址信息。

pOutBufLen:[输出] 返回pAdapterAddresses所在缓存的大小

返回值:成功,返回0;失败,返回错误代码。

代码如下:

  1. [DllImport("Iphlpapi.dll")]
  2. public static extern uint GetAdaptersAddresses(uint Family, uint flags, IntPtr Reserved,
  3. IntPtr PAdaptersAddresses, ref uint pOutBufLen);
  4. /// <summary>
  5. /// 通过适配器信息获取MAC地址
  6. /// </summary>
  7. /// <returns></returns>
  8. public string GetMacAddressByAdapter()
  9. {
  10. string macAddress = "";
  11. try
  12. {
  13. IntPtr PAdaptersAddresses = new IntPtr();
  14. uint pOutLen = 100;
  15. PAdaptersAddresses = Marshal.AllocHGlobal(100);
  16. uint ret =
  17. GetAdaptersAddresses(0, 0, (IntPtr)0, PAdaptersAddresses, ref pOutLen);
  18. if (ret == 111)
  19. {
  20. Marshal.FreeHGlobal(PAdaptersAddresses);
  21. PAdaptersAddresses = Marshal.AllocHGlobal((int)pOutLen);
  22. ret = GetAdaptersAddresses(0, 0, (IntPtr)0, PAdaptersAddresses, ref pOutLen);
  23. }
  24. IP_Adapter_Addresses adds = new IP_Adapter_Addresses();
  25. IntPtr pTemp = PAdaptersAddresses;
  26. while (pTemp != (IntPtr)0)
  27. {
  28. Marshal.PtrToStructure(pTemp, adds);
  29. string adapterName = Marshal.PtrToStringAnsi(adds.AdapterName);
  30. string FriendlyName = Marshal.PtrToStringAuto(adds.FriendlyName);
  31. string tmpString = string.Empty;
  32. for (int i = 0; i < 6; i++)
  33. {
  34. tmpString += string.Format("{0:X2}", adds.PhysicalAddress[i]);
  35. if (i < 5)
  36. {
  37. tmpString += ":";
  38. }
  39. }
  40. RegistryKey theLocalMachine = Registry.LocalMachine;
  41. RegistryKey theSystem
  42. = theLocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces");
  43. RegistryKey theInterfaceKey = theSystem.OpenSubKey(adapterName);
  44. if (theInterfaceKey != null)
  45. {
  46. macAddress = tmpString;
  47. break;
  48. }
  49. pTemp = adds.Next;
  50. }
  51. }
  52. catch
  53. { }
  54. return macAddress;
  55. }
        [DllImport("Iphlpapi.dll")]
        public static extern uint GetAdaptersAddresses(uint Family, uint flags, IntPtr Reserved,
            IntPtr PAdaptersAddresses, ref uint pOutBufLen);

        /// <summary>
        /// 通过适配器信息获取MAC地址
        /// </summary>
        /// <returns></returns>
        public string GetMacAddressByAdapter()
        {
            string macAddress = "";
            try
            {
                IntPtr PAdaptersAddresses = new IntPtr();

                uint pOutLen = 100;
                PAdaptersAddresses = Marshal.AllocHGlobal(100);

                uint ret =
                    GetAdaptersAddresses(0, 0, (IntPtr)0, PAdaptersAddresses, ref pOutLen);

                if (ret == 111)
                {
                    Marshal.FreeHGlobal(PAdaptersAddresses);
                    PAdaptersAddresses = Marshal.AllocHGlobal((int)pOutLen);
                    ret = GetAdaptersAddresses(0, 0, (IntPtr)0, PAdaptersAddresses, ref pOutLen);
                }

                IP_Adapter_Addresses adds = new IP_Adapter_Addresses();

                IntPtr pTemp = PAdaptersAddresses;

                while (pTemp != (IntPtr)0)
                {
                    Marshal.PtrToStructure(pTemp, adds);
                    string adapterName = Marshal.PtrToStringAnsi(adds.AdapterName);
                    string FriendlyName = Marshal.PtrToStringAuto(adds.FriendlyName);
                    string tmpString = string.Empty;

                    for (int i = 0; i < 6; i++)
                    {
                        tmpString += string.Format("{0:X2}", adds.PhysicalAddress[i]);

                        if (i < 5)
                        {
                            tmpString += ":";
                        }
                    }


                    RegistryKey theLocalMachine = Registry.LocalMachine;

                    RegistryKey theSystem
                        = theLocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces");
                    RegistryKey theInterfaceKey = theSystem.OpenSubKey(adapterName);

                    if (theInterfaceKey != null)
                    {
                        macAddress = tmpString;
                        break;
                    }

                    pTemp = adds.Next;
                }
            }
            catch 
            { }
            return macAddress;
        }

3、 通过NetBios获取MAC地址

NetBIOS(网络基本输入/输出系统)是一套用于网络通讯的调用接口,包含NetBIOS Name和MAC地址等信息。该方法获取MAC地址的效率较高。

代码如下:

  1. /// <summary>
  2. /// 通过NetBios获取MAC地址
  3. /// </summary>
  4. /// <returns></returns>
  5. public string GetMacAddressByNetBios()
  6. {
  7. string macAddress = "";
  8. try
  9. {
  10. string addr = "";
  11. int cb;
  12. ASTAT adapter;
  13. NCB Ncb = new NCB();
  14. char uRetCode;
  15. LANA_ENUM lenum;
  16. Ncb.ncb_command = (byte)NCBCONST.NCBENUM;
  17. cb = Marshal.SizeOf(typeof(LANA_ENUM));
  18. Ncb.ncb_buffer = Marshal.AllocHGlobal(cb);
  19. Ncb.ncb_length = (ushort)cb;
  20. uRetCode = Win32API.Netbios(ref Ncb);
  21. lenum = (LANA_ENUM)Marshal.PtrToStructure(Ncb.ncb_buffer, typeof(LANA_ENUM));
  22. Marshal.FreeHGlobal(Ncb.ncb_buffer);
  23. if (uRetCode != (short)NCBCONST.NRC_GOODRET)
  24. return "";
  25. for (int i = 0; i < lenum.length; i++)
  26. {
  27. Ncb.ncb_command = (byte)NCBCONST.NCBRESET;
  28. Ncb.ncb_lana_num = lenum.lana[i];
  29. uRetCode = Win32API.Netbios(ref Ncb);
  30. if (uRetCode != (short)NCBCONST.NRC_GOODRET)
  31. return "";
  32. Ncb.ncb_command = (byte)NCBCONST.NCBASTAT;
  33. Ncb.ncb_lana_num = lenum.lana[i];
  34. Ncb.ncb_callname[0] = (byte)'*';
  35. cb = Marshal.SizeOf(typeof(ADAPTER_STATUS)) + Marshal.SizeOf(typeof(NAME_BUFFER)) * (int)NCBCONST.NUM_NAMEBUF;
  36. Ncb.ncb_buffer = Marshal.AllocHGlobal(cb);
  37. Ncb.ncb_length = (ushort)cb;
  38. uRetCode = Win32API.Netbios(ref Ncb);
  39. adapter.adapt = (ADAPTER_STATUS)Marshal.PtrToStructure(Ncb.ncb_buffer, typeof(ADAPTER_STATUS));
  40. Marshal.FreeHGlobal(Ncb.ncb_buffer);
  41. if (uRetCode == (short)NCBCONST.NRC_GOODRET)
  42. {
  43. if (i > 0)
  44. addr += ":";
  45. addr = string.Format("{0,2:X}:{1,2:X}:{2,2:X}:{3,2:X}:{4,2:X}:{5,2:X}",
  46. adapter.adapt.adapter_address[0],
  47. adapter.adapt.adapter_address[1],
  48. adapter.adapt.adapter_address[2],
  49. adapter.adapt.adapter_address[3],
  50. adapter.adapt.adapter_address[4],
  51. adapter.adapt.adapter_address[5]);
  52. }
  53. }
  54. macAddress = addr.Replace(' ', '0');
  55. }
  56. catch
  57. {
  58. }
  59. return macAddress;
  60. }
        /// <summary>
        /// 通过NetBios获取MAC地址
        /// </summary>
        /// <returns></returns>
        public string GetMacAddressByNetBios()
        {
            string macAddress = "";
            try
            {
                string addr = "";
                int cb;
                ASTAT adapter;
                NCB Ncb = new NCB();
                char uRetCode;
                LANA_ENUM lenum;

                Ncb.ncb_command = (byte)NCBCONST.NCBENUM;
                cb = Marshal.SizeOf(typeof(LANA_ENUM));
                Ncb.ncb_buffer = Marshal.AllocHGlobal(cb);
                Ncb.ncb_length = (ushort)cb;
                uRetCode = Win32API.Netbios(ref   Ncb);
                lenum = (LANA_ENUM)Marshal.PtrToStructure(Ncb.ncb_buffer, typeof(LANA_ENUM));
                Marshal.FreeHGlobal(Ncb.ncb_buffer);
                if (uRetCode != (short)NCBCONST.NRC_GOODRET)
                    return "";

                for (int i = 0; i < lenum.length; i++)
                {
                    Ncb.ncb_command = (byte)NCBCONST.NCBRESET;
                    Ncb.ncb_lana_num = lenum.lana[i];
                    uRetCode = Win32API.Netbios(ref   Ncb);
                    if (uRetCode != (short)NCBCONST.NRC_GOODRET)
                        return "";

                    Ncb.ncb_command = (byte)NCBCONST.NCBASTAT;
                    Ncb.ncb_lana_num = lenum.lana[i];
                    Ncb.ncb_callname[0] = (byte)'*';
                    cb = Marshal.SizeOf(typeof(ADAPTER_STATUS)) + Marshal.SizeOf(typeof(NAME_BUFFER)) * (int)NCBCONST.NUM_NAMEBUF;
                    Ncb.ncb_buffer = Marshal.AllocHGlobal(cb);
                    Ncb.ncb_length = (ushort)cb;
                    uRetCode = Win32API.Netbios(ref   Ncb);
                    adapter.adapt = (ADAPTER_STATUS)Marshal.PtrToStructure(Ncb.ncb_buffer, typeof(ADAPTER_STATUS));
                    Marshal.FreeHGlobal(Ncb.ncb_buffer);

                    if (uRetCode == (short)NCBCONST.NRC_GOODRET)
                    {
                        if (i > 0)
                            addr += ":";
                        addr = string.Format("{0,2:X}:{1,2:X}:{2,2:X}:{3,2:X}:{4,2:X}:{5,2:X}",
                              adapter.adapt.adapter_address[0],
                              adapter.adapt.adapter_address[1],
                              adapter.adapt.adapter_address[2],
                              adapter.adapt.adapter_address[3],
                              adapter.adapt.adapter_address[4],
                              adapter.adapt.adapter_address[5]);
                    }
                }
                macAddress = addr.Replace(' ', '0');

            }
            catch
            {
            }
            return macAddress;
        }

4、 通过DOS命令获得MAC地址

这个就是使用ipconfig命令,并需要在程序中启用cmd,程序中使用cmd如下即可,或参见http://blog.youkuaiyun.com/yysyangyangyangshan/article/details/6799489,

代码如下:

  1. /// <summary>
  2. /// 通过DOS命令获得MAC地址
  3. /// </summary>
  4. /// <returns></returns>
  5. public string GetMacAddressByDos()
  6. {
  7. string macAddress = "";
  8. Process p = null;
  9. StreamReader reader = null;
  10. try
  11. {
  12. ProcessStartInfo start = new ProcessStartInfo("cmd.exe");
  13. start.FileName = "ipconfig";
  14. start.Arguments = "/all";
  15. start.CreateNoWindow = true;
  16. start.RedirectStandardOutput = true;
  17. start.RedirectStandardInput = true;
  18. start.UseShellExecute = false;
  19. p = Process.Start(start);
  20. reader = p.StandardOutput;
  21. string line = reader.ReadLine();
  22. while (!reader.EndOfStream)
  23. {
  24. if (line.ToLower().IndexOf("physical address") > 0 || line.ToLower().IndexOf("物理地址") > 0)
  25. {
  26. int index = line.IndexOf(":");
  27. index += 2;
  28. macAddress = line.Substring(index);
  29. macAddress = macAddress.Replace('-', ':');
  30. break;
  31. }
  32. line = reader.ReadLine();
  33. }
  34. }
  35. catch
  36. {
  37. }
  38. finally
  39. {
  40. if (p != null)
  41. {
  42. p.WaitForExit();
  43. p.Close();
  44. }
  45. if (reader != null)
  46. {
  47. reader.Close();
  48. }
  49. }
  50. return macAddress;
  51. }
        /// <summary>
        /// 通过DOS命令获得MAC地址
        /// </summary>
        /// <returns></returns>
        public string GetMacAddressByDos()
        {
            string macAddress = "";
            Process p = null;
            StreamReader reader = null;
            try
            {
                ProcessStartInfo start = new ProcessStartInfo("cmd.exe"); 

                start.FileName = "ipconfig";
                start.Arguments = "/all"; 

                start.CreateNoWindow = true; 

                start.RedirectStandardOutput = true; 

                start.RedirectStandardInput = true; 

                start.UseShellExecute = false; 

                p = Process.Start(start);

                reader = p.StandardOutput; 

                string line = reader.ReadLine(); 

                while (!reader.EndOfStream)
                {
                    if (line.ToLower().IndexOf("physical address") > 0 || line.ToLower().IndexOf("物理地址") > 0)
                    {
                        int index = line.IndexOf(":");
                        index += 2;
                        macAddress = line.Substring(index);
                        macAddress = macAddress.Replace('-', ':');
                        break;
                    }
                    line = reader.ReadLine();
                }
            }
            catch
            {

            }
            finally
            {
                if (p != null)
                {
                    p.WaitForExit(); 
                    p.Close(); 
                }
                if (reader != null)
                {
                    reader.Close(); 
                }
            }
            return macAddress;
        }

5、 NetworkInterface获取MAC地址

NetworkInterface,提供网络接口的配置和统计信息。NetworkInterface.GetAllNetworkInterfaces,返回描述本地计算机上的网络接口的对象。

代码如下:

  1. /// <summary>
  2. /// 通过网络适配器获取MAC地址
  3. /// </summary>
  4. /// <returns></returns>
  5. public string GetMacAddressByNetworkInformation()
  6. {
  7. string macAddress = "";
  8. try
  9. {
  10. NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
  11. foreach (NetworkInterface adapter in nics)
  12. {
  13. if (!adapter.GetPhysicalAddress().ToString().Equals(""))
  14. {
  15. macAddress = adapter.GetPhysicalAddress().ToString();
  16. for (int i = 1; i < 6; i++)
  17. {
  18. macAddress = macAddress.Insert(3 * i - 1, ":");
  19. }
  20. break;
  21. }
  22. }
  23. }
  24. catch
  25. {
  26. }
  27. return macAddress;
  28. }
        /// <summary>
        /// 通过网络适配器获取MAC地址
        /// </summary>
        /// <returns></returns>
        public string GetMacAddressByNetworkInformation()
        {
            string macAddress = "";
            try
            {
                NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
                foreach (NetworkInterface adapter in nics)
                {
                    if (!adapter.GetPhysicalAddress().ToString().Equals(""))
                    {
                        macAddress = adapter.GetPhysicalAddress().ToString();
                        for (int i = 1; i < 6; i++)
                        {
                            macAddress = macAddress.Insert(3 * i - 1, ":");
                        }
                        break;
                    }
                }

            }
            catch
            {
            }
            return macAddress;
        }

完整代码下载地址:http://download.youkuaiyun.com/download/yysyangyangyangshan/3949946


 

C#获取电脑网卡MAC地址和CPU序列号 然后,我们根据"IPEnabled"属性来判断网络适配器是否启用,若启用,则获取其对应的MAC地址。在上述代码中,我们首先分别调用GetMacAddress()和GetCpuSerialNumber()方法来获取网卡MAC地址和CPU序列号。在上述代码中,我们通过遍历"Win32_Processor"类的实例来获取CPU的信息。然后,我们直接获取"ProcessorId"属性的值作为CPU的序列号。以上是获取电脑网卡MAC地址和CPU序列号的代码实现,在C#编程中可以很方便地使用这些信息来完成各种任务。 阅读详情

相关推荐

3种方法轻松获取MAC地址:C#环境下全解析,新手也能秒懂

通过今天的介绍,相信你已经掌握了在 C# 环境下获取 MAC 地址的三种方法。无论是使用类、WMI 还是命令行,都有各自的适用场景和优缺点。希望这篇文章能帮助你在实际开发中更加得心应手。如果你有任何疑问或建议,欢迎在评论区留言,我们一起交流,共同进步!

java专栏 1205

c# 获取mac地址

这个方法首先获取本地计算机上所有网络接口,然后在这些接口中找到处于操作状态的接口(即连接着网络的接口),并返回该接口的物理地址(即MAC地址)。注意,如果计算机上没有连接到网络的接口,则该方法将返回空字符串。在C#中,可以使用NetworkInterface类来获取本地计算机的MAC地址。工作笔记20230328.

weixin_42538406的博客 5925

在C#中获取本机MAC地址的实践指南

本文还有配套的精品资源,点击获取 简介:本简介介绍了如何在C#中获取本机的MAC地址。MAC地址是网络设备的唯一物理地址,通常以六组两进制数表示。在C#中,可以使用.NET Framework的System.Net.NetworkInformation命名空间来访问操作系统底层的网络接口,并获取MAC地址。文章提供了简单的C#代码示例来演示如何实现这一功能,并解释了代码的工...

weixin_35639680的博客 2116

C#获取电脑MAC地址(物理地址)的几种方法

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Management; using System.Net.NetworkInformation; using Microsoft.Win32; using System.Diagnostics; namespace Common { /// <summary> /// MAC地址获.

qq_41464425的博客 1万+

C#实现获取MAC地址的方法

本文实例讲述了C#实现获取MAC地址的方法,是一个非常常见而且实用的功能,具体方法如下: 主要功能代码如下: /// <summary> /// 根据网卡类型来获取mac地址 /// </summary> /// <param name=networkType>网卡类型</param> /// <param name=macAddressFormatHanlder>格式化获取到的mac地址</param> /// <returns>获取到的mac地址</returns> public static string GetMacAddress(NetworkInterfaceType n

RuoYi(分离版) 使用代码生成器添加子模块(idea版)

文章目录准备一、使用代码生成器1.数据库2.导入表并生成代码二、导入代码文件1.新建一个模块2.导入zip代码文件3.模块环境配置添加菜单和访问地址总结 准备 前提要把系统启动起来,部分教程可以参考这边文章若依框架RuoYi前后端分离项目导入IDEA及运行启动 但是完全参考这篇文章还是不能把项目启动起来,因为这篇文章没有说明数据库。 我是用的是本地数据库,采用xampp+Navicat的组合来部署和访问数据库。打开Navicat,连接并创建数据库ry-vue并导入数据脚本ry_20191008.sql,q

dream_coke的博客 1万+

c# cmac算法_C#获取MAC地址的几种方法(补充版)

关于获取本地电脑的MAC地址,除了前面说过的根据WMI获取http://blog.youkuaiyun.com/yysyangyangyangshan/article/details/6803787,其实还有好几种方式来获取mac地址,下面一一道来。首先需要用到的一些方法和类:public enum NCBCONST{NCBNAMSZ = 16,MAX_LANA = 254,NCBENUM = 0x37,NR...

weixin_39600366的博客 456

帕德伯恩大学轴承数据集(PU)介绍

PU数据集介绍一、帕德伯恩大学轴承数据集故障类别说明二、关于损伤描述2.1 损伤组合:2.2 重复和多重损伤的安排:2.3 几何尺寸2.4 损伤程度2.5损伤特征数据集损伤类别三、人为损坏轴承3.1 最常用的人为损伤制造方法是:3.2 本数据集使用的人工损坏是由三种不同方法引起的四、通过加速寿命试验产生真正的轴承损坏样本 一、帕德伯恩大学轴承数据集 数据集下载地址 从帕德伯恩大学获得的PU数据集是一个6203轴承数据集,包括人为诱发的和真实的损害。采用压电加速度计采集轴承座的振动信号,采样频率为64 kHz

m0_47180208的博客 3万+

C#:获取本机的MAC地址与IP地址

网上可以找到很多使用C#语言获取本机MAC地址与IP地址的代码,在这里说一下我的使用心得。 在windows控制台中使用命令ipconfig /all可以查到本机的网络配置。但其中的网络有很多是不用的,可能你的电脑连接外网只用到了其中的一个网络。因此我们要获取的是实际连接外网的网络连接。 ...

2899

Matlab实现PSO-TCN-LSTM-Attention粒子群算法优化时间卷积长短期记忆神经网络融合注意力机制多变量时间序列预测的详细项目实例

这些数据包含了随时间变化她动态信息,具有显著她趋势她、周期她和季节她特征。该模型她核心优势在她其能够自适应地学习数据中她多层次时序信息,捕捉时间序列中她长短期依赖关系,从而提高预测她准确她和可靠她。本项目旨在实她一个基她PTO-TCN-LTTM-TFSttfntion她多变量时间序列预测模型,通过粒子群优化算法优化时间卷积长短期记忆神经网络,并融合注意力机制,提高模型她预测精度和稳定她。本项目模型她实她分为多个阶段,首先她数据预处理,接着她PTO优化,然后她TCN和LTTM网络她构建她训练。

优质创作者: 人工智能技术领域 对于有一定基础的 MATLAB和Python带具体需求都可以详谈 MATLAB和Python可以提供代码调试服务加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢 1078

Winform美化框架AntdUI中Table的使用方法

使用核心注意点: 数据模型中属性名需要完全与new Column里的列名一致否则添加数据源则无法读取到详细内容。

wevix的博客 3676

几种C#程序读取MAC地址的方法

转载自:https://www.cnblogs.com/diulela/archive/2012/04/07/2436111.html以下是收集的几种C#程序读取MAC地址的方法,示例中是读取所有网卡的MAC地址,如果仅需要读取其中一个,稍作修改即可。1通过IPConfig命令读取MAC地址///&lt;summary&gt;///根据截取ipconfig /all命令的输出流获取网卡Mac/...

milijiangjun的博客 3259

模型预测控制(MPC)解析(三):多输入多输出系统

本文为阅读笔记,仅供学习交流使用!!! 在之前的文章中,为了简单起见,以单输入单输出系统为例介绍了MPC控制的实现方法。因为使用的是状态空间方程作为系统模型,这种方法可以轻松的扩展到多输入多输出系统中。 ...

行者无疆的博客 1万+

C#环境下MAC地址获取方法解析

在C#中,获取MAC地址并不是直接支持的,因为出于安全和隐私的考虑,操作系统通常会限制对这类硬件信息的直接访问。不过,仍然可以通过一些方法间接地获取到本地网络接口(比如以太网接口)的MAC地址。

学习和分享 1749

YOLO11改进|YOLO11中引入注意力和卷积融合模块CAFMAttention

YOLO11改进|YOLO11中引入注意力和卷积融合模块CAFMAttention

A1983Z的博客 1218

AutoSAR EcuM系列01- EcuM模块的功能概述和变体类型

在【ECU的软硬件架构】文章中我们了解ECU的功能和组成,那么ECU具体是怎么启动的呢?我们知道,AutoSAR标准架构有三层,即APPL应用层、RTE层和BSW层。而这些层又被进一步划分为更多单独的组件,如BSW层可能有80多个组件。在ECU启动时,这些组件必须相互交互,有时也必须以某种顺序交互。这些组件的启动顺序由ECU管理器模块或EcuM处理。EcuM负责整个ECU的初始化和去初始化,包括对一些系统模块如。......

1765

C# 获取本地IP地址以及MAC地址

 C# 获取本地IP地址以及MAC地址 1、通过主机名获取局域网IP地址;            try            {                IPHostEntry ipHostEntry = Dns.GetHostEntry(txtHost.Text);//传递计算机名                if (ipHostEntry.Aliases.

pigDeity的专栏 3914

【k8s故障处理篇】calico-node启动失败“Felix is not live: Get “http://localhost:9099/liveness” 解决办法(V1.30.3版本)

【k8s故障处理篇】calico-node启动失败“Felix is not live: Get “http://localhost:9099/liveness” 解决办法(V1.30.3版本)

jks212454的博客 1090

C#获取MAC地址的几种方法

首先需要用到的一些方法和类: public enum NCBCONST { NCBNAMSZ = 16, MAX_LANA = 254, NCBENUM = 0x37, NRC_GOODRET = 0x00, ...

888

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C# 获取局域网IP和MAC地址

C#遍历局域网的几种方法及比较2009-07-03 10:08扫描局域网IP列表的几种方法很多软件都有获知局域网在线计算机IP的功能,但是在.net怎么实现呢,有好多方法,下面我给大家介绍几种,供大家参考。1、微软社区上介绍了使用Active Directory 来遍历局域网利用DirectoryEntry组件来查看网络网址:http://www.microsoft

Yao,Mane 6805

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

获取mac地址的方法

在百度中输入mac地址,可以查到更多内容,本人摘录和整理出一部分; 编程部分为根据网上其它资料,进行的个人整理。

WYZSC的专栏 1998

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C#中通过IP获取MAC地址,获取本机IP和MAC地址

  protected void Page_Load(object sender, EventArgs e)    {        Response.Write("MAC地址为:"+GetMACAddress()+"IP地址为:"+GetAddress()+"");        Response.Write("mac是:" + GetMACByIP("192.168.10.3")+"");        Response.Write("mac是:" + GetMACByIP(GetAddress()))

Queenie 4022

C#通过Web获取客户端的IP与Mac地址实现

一、思路(主要用于局域网内)     通过Web获取客户端的IP地址较简单,从客户端向web服务器发送的数据报中(Request对象)中即可解析出,但实际应用中,还要考虑代理服务器,路由器的转发等等。     而获取MAC的过程较复杂,因为客户端向服务器发送的请求对象中不包含MAC地址,因此得到两种思路来获取客户端MAC地址:   (1).在客户端来获取客户机的MAC地址,所以当请求到达客户

大鹏 3万+
上一篇: c#判断是否为NULL或空
下一篇: MongoHelper
ArvinStudy
博客等级 码龄15年 83粉丝 193原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值