首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C#中获取机器MAC地址的可靠方法

在C#中获取机器MAC地址的可靠方法
EN

Stack Overflow用户
提问于 2009-05-12 00:29:29
回答 13查看 245.1K关注 0票数 148

我需要一种方法来获得机器的MAC地址,而不管它运行的是什么操作系统,通过使用C#。

该应用程序将需要在XP/Vista/Win7 32位和64位,以及这些操作系统上,但与外语默认。此外,许多C#命令和操作系统查询并不能在所有操作系统上运行。

你有什么想法吗?

我一直在抓取ipconfig /all的输出,但这是非常不可靠的,因为每台机器上的输出格式都不同。

EN

回答 13

Stack Overflow用户

发布于 2011-10-05 21:12:41

更干净的解决方案

代码语言:javascript
复制
var macAddr = 
    (
        from nic in NetworkInterface.GetAllNetworkInterfaces()
        where nic.OperationalStatus == OperationalStatus.Up
        select nic.GetPhysicalAddress().ToString()
    ).FirstOrDefault();

或者:

代码语言:javascript
复制
String firstMacAddress = NetworkInterface
    .GetAllNetworkInterfaces()
    .Where( nic => nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback )
    .Select( nic => nic.GetPhysicalAddress().ToString() )
    .FirstOrDefault();
票数 152
EN

Stack Overflow用户

发布于 2018-08-13 20:02:01

IMHO返回第一个mac地址不是一个好主意,尤其是在托管虚拟机的情况下。因此,我检查了发送/接收字节总数并选择了最常用的连接,这并不完美,但应该是正确的9/10次。

代码语言:javascript
复制
public string GetDefaultMacAddress()
{
    Dictionary<string, long> macAddresses = new Dictionary<string, long>();
    foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
    {
        if (nic.OperationalStatus == OperationalStatus.Up)
            macAddresses[nic.GetPhysicalAddress().ToString()] = nic.GetIPStatistics().BytesSent + nic.GetIPStatistics().BytesReceived;
    }
    long maxValue = 0;
    string mac = "";
    foreach(KeyValuePair<string, long> pair in macAddresses)
    {
        if (pair.Value > maxValue)
        {
            mac = pair.Key;
            maxValue = pair.Value;
        }
    }
    return mac;
}
票数 9
EN

Stack Overflow用户

发布于 2012-06-21 20:30:46

我们使用WMI来获取具有最低度量的接口的mac地址,例如,接口窗口将首选使用,如下所示:

代码语言:javascript
复制
public static string GetMACAddress()
{
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration where IPEnabled=true");
    IEnumerable<ManagementObject> objects = searcher.Get().Cast<ManagementObject>();
    string mac = (from o in objects orderby o["IPConnectionMetric"] select o["MACAddress"].ToString()).FirstOrDefault();
    return mac;
}

或者在Silverlight中(需要更高的信任):

代码语言:javascript
复制
public static string GetMACAddress()
{
    string mac = null;
    if ((Application.Current.IsRunningOutOfBrowser) && (Application.Current.HasElevatedPermissions) && (AutomationFactory.IsAvailable))
    {
        dynamic sWbemLocator = AutomationFactory.CreateObject("WbemScripting.SWBemLocator");
        dynamic sWbemServices = sWbemLocator.ConnectServer(".");
        sWbemServices.Security_.ImpersonationLevel = 3; //impersonate

        string query = "SELECT * FROM Win32_NetworkAdapterConfiguration where IPEnabled=true";
        dynamic results = sWbemServices.ExecQuery(query);

        int mtu = int.MaxValue;
        foreach (dynamic result in results)
        {
            if (result.IPConnectionMetric < mtu)
            {
                mtu = result.IPConnectionMetric;
                mac = result.MACAddress;
            }
        }
    }
    return mac;
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/850650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档