以下是收集的几种C#程序读取MAC地址的方法,示例中是读取所有网卡的MAC地址,如果仅需要读取其中一个,稍作修改即可。
1 通过IPConfig命令读取MAC地址
///<summary> /// 根据截取ipconfig /all命令的输出流获取网卡Mac ///</summary> ///<returns></returns> publicstatic List<string> GetMacByIPConfig() { List<string> macs =new List<string>();
ProcessStartInfo startInfo = new ProcessStartInfo("ipconfig", "/all"); startInfo.UseShellExecute = false; startInfo.RedirectStandardInput = true; startInfo.RedirectStandardOutput = true; startInfo.RedirectStandardError = true; startInfo.CreateNoWindow = true; Process p = Process.Start(startInfo); //截取输出流 StreamReader reader = p.StandardOutput; string line = reader.ReadLine(); while (!reader.EndOfStream) { if (!string.IsNullOrEmpty(line)) { line = line.Trim();
if (line.StartsWith("Physical Address")) { macs.Add(line); } }
if (line.StartsWith("Physical Address")) { macs.Add(line); } }
line = reader.ReadLine(); }
//等待程序执行完退出进程 p.WaitForExit(); p.Close(); reader.Close(); return macs; }
//等待程序执行完退出进程 p.WaitForExit(); p.Close(); reader.Close(); return macs; }
2 通过WMI读取MAC地址
1)该方法依赖WMI的系统服务,该服务一般不会被关闭;但如果系统服务缺失或者出现问题,该方法无法取得MAC地址。
///<summary> /// 通过WMI读取系统信息里的网卡MAC ///</summary> ///<returns></returns> publicstatic List<string> GetMacByWMI() { List<string> macs =new List<string>(); try { string mac =""; ManagementClass mc =new ManagementClass("Win32_NetworkAdapterConfiguration"); ManagementObjectCollection moc = mc.GetInstances(); foreach (ManagementObject mo in moc) { if ((bool)mo["IPEnabled"]) { mac = mo["MacAddress"].ToString(); macs.Add(mac); } } moc =null; mc =null; } catch { }
return macs; }
return macs; }
3 通过NetworkInterface读取MAC地址
1)如果当前的网卡是禁用状态(硬件处于硬关闭状态),取不到该网卡的MAC地址,(您可以通过禁用网卡进行试验)。
2)如果当前启用了多个网卡,最先返回的地址是最近启用的网络连接的信息
//返回描述本地计算机上的网络接口的对象(网络接口也称为网络适配器)。 publicstatic NetworkInterface[] NetCardInfo() { return NetworkInterface.GetAllNetworkInterfaces(); }
///<summary> /// 通过NetworkInterface读取网卡Mac ///</summary> ///<returns></returns> publicstatic List<string> GetMacByNetworkInterface() { List<string> macs =new List<string>(); NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface ni in interfaces) { macs.Add(ni.GetPhysicalAddress().ToString()); } return macs; }
///<summary> /// 通过NetworkInterface读取网卡Mac ///</summary> ///<returns></returns> publicstatic List<string> GetMacByNetworkInterface() { List<string> macs =new List<string>(); NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface ni in interfaces) { macs.Add(ni.GetPhysicalAddress().ToString()); } return macs; }
4 通过SendARP读取MAC地址
///<summary> /// 通过SendARP获取网卡Mac /// 网络被禁用或未接入网络(如没插网线)时此方法失灵 ///</summary> ///<param name="remoteIP"></param> ///<returns></returns> publicstaticstring GetMacBySendARP(string remoteIP) { StringBuilder macAddress =new StringBuilder();
try { Int32 remote = inet_addr(remoteIP);
Int64 macInfo =new Int64(); Int32 length =6; SendARP(remote, 0, ref macInfo, ref length);
string temp = Convert.ToString(macInfo, 16).PadLeft(12, '0').ToUpper();
int x =12; for (int i =0; i <6; i++) { if (i ==5) { macAddress.Append(temp.Substring(x -2, 2)); } else { macAddress.Append(temp.Substring(x -2, 2) +"-"); } x -=2; }
return macAddress.ToString(); } catch { return macAddress.ToString(); } }
[DllImport("Iphlpapi.dll")] privatestaticexternint SendARP(Int32 dest, Int32 host, ref Int64 mac, ref Int32 length); [DllImport("Ws2_32.dll")] privatestaticextern Int32 inet_addr(string ip);
try { Int32 remote = inet_addr(remoteIP);
Int64 macInfo =new Int64(); Int32 length =6; SendARP(remote, 0, ref macInfo, ref length);
string temp = Convert.ToString(macInfo, 16).PadLeft(12, '0').ToUpper();
int x =12; for (int i =0; i <6; i++) { if (i ==5) { macAddress.Append(temp.Substring(x -2, 2)); } else { macAddress.Append(temp.Substring(x -2, 2) +"-"); } x -=2; }
return macAddress.ToString(); } catch { return macAddress.ToString(); } }
[DllImport("Iphlpapi.dll")] privatestaticexternint SendARP(Int32 dest, Int32 host, ref Int64 mac, ref Int32 length); [DllImport("Ws2_32.dll")] privatestaticextern Int32 inet_addr(string ip);
5 从注册表读取MAC地址
常规用户可通过读取注册表项Windows Genuine Advantage获取到物理网卡地址。
1)如果注册表项被修改,则无法取得该MAC地址
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Genuine Advantage