C# 获取计算机 MAC 的方法
软件在上报日志时,通常会带上一些硬件信息,以便于区分设备或用户,计算机物理地址(MAC)
便是首当其冲的选择。本文将介绍 .NET/C#
获取计算 MAC
的方法:
- NetworkInterface
- WMI (Windows Management Instrumentation)
- ipconfig/all
NetworkInterface
使用 System.Net.NetworkInformation
命名空间下的 NetworkInterface
可以获取本地计算机上的网络接口对象(网络适配器),然后通过类型过滤来筛选 MAC
。需要注意的是,如果网卡处于禁用状态,将获取不到网卡的 MAC 地址。
public static IList<string> GetMacsByNetworkInterface()
{
var macs = new List<string>();
var interfaces = NetworkInterface.GetAllNetworkInterfaces();
foreach (var @interface in interfaces)
{
var up = @interface.OperationalStatus == OperationalStatus.Up;
var loopback = @interface.NetworkInterfaceType == NetworkInterfaceType.Loopback;
if (up && !loopback)
{
var address = @interface.GetPhysicalAddress().ToString();
// insert ":" then remove the last ":"
var result = Regex.Replace(address, ".{2}", "$0:");
var mac = result.Remove(result.Length - 1);
macs.Add(mac);
}
}
return macs;
}
WMI
添加对 System.Management
的引用,然后使用 WMI (Windows Management Instrumentation)
来获取本地计算机的网络适配器配置。该方法依赖于系统的 WMI 服务,如果该服务未运行,将会获取失败。
public static IList<string> GetMacsByWmi()
{
var isManagerRunning = false;
var macs = new List<string>();
try
{
var serviceController = new ServiceController("Winmgmt");
isManagerRunning = serviceController.Status == ServiceControllerStatus.Running;
}
catch
{
// do nothing
}
if (isManagerRunning)
{
var mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
var moc = mc.GetInstances();
foreach (var o in moc)
{
var mo = (ManagementObject) o;
var address = mo["MacAddress"];
var enabled = (bool) mo["IPEnabled"];
if (address != null && enabled)
{
macs.Add(address.ToString().ToUpper());
}
mo.Dispose();
}
}
return macs;
}
ipconfig/all
除了前面的两种方法外,还可以通过在命令行中执行 ipconfig/all
命令来查询。后台调用 cmd.exe
来执行 ipconfig/all
命令,然后从输出中解析 Physical Address
所在行中的 MAC
值。编码非常简单,此处不展示源码,关于如何调用 CMD 执行命令,可参考 C#后台调用CMD执行命令。