C#获取计算机MAC的方法

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执行命令

猜你喜欢

转载自blog.csdn.net/Iron_Ye/article/details/82731697