为啥当我尝试获取我的 MAC 地址时得到一个空字符串?

Posted

技术标签:

【中文标题】为啥当我尝试获取我的 MAC 地址时得到一个空字符串?【英文标题】:Why am I getting an empty string when I try to get my MAC address?为什么当我尝试获取我的 MAC 地址时得到一个空字符串? 【发布时间】:2017-11-22 01:09:10 【问题描述】:

我正在尝试以编程方式获取系统的 MAC 地址。我正在用 C# 编写,在 Windows 10 操作系统上使用 Visual Studios .NET 框架。我已经包含了 System.Net.NetworkInformation 命名空间(对于像我这样的其他 .NET 新手,必须手动将其添加到解决方案资源管理器下的“参考”部分,然后使用“使用”关键字)。要获取 MAC 地址,我使用以下代码:

try

    var macAddr =
        (
            from nic in NetworkInterface.GetAllNetworkInterfaces()
            where nic.OperationalStatus == OperationalStatus.Up
            select nic.GetPhysicalAddress().ToString()
        ).FirstOrDefault();
    Console.WriteLine("MAC address is: 0", macAddr);


catch (Exception e)

    Console.WriteLine("Could not collect MAC Address;\nERROR: 0", e);

我期望的输出是:

正在尝试收集 MAC 地址...

MAC 地址为:XXXXXXXXXXXX

其中 XXX.... 是 12 个字符的 MAC 地址,或者:

正在尝试收集 MAC 地址...

无法收集 MAC 地址;

错误:[此处插入错误报告]

然而,我得到的是:

正在尝试收集 MAC 地址...

MAC地址是:

macAddr 变量似乎收集了一个空字符串。

所以...我的问题是,为什么我得到一个明显为空的字符串,而不是我期望的 12 个字符的 MAC 地址?

【问题讨论】:

产生的异常是什么? 没有产生异常。 try 语句成功,但没有打印 MAC 地址。 【参考方案1】:

您获得了Software Loopback Interface 1 的空 MAC 地址。 在尝试运行此代码之前,请确保您与网络建立了活动连接。 活动意味着接口被激活(启动)并连接到具有 DHCP 给定 IP 地址或静态 IP 地址的网络。

要解决此问题,您只需通过以下方式从查询中删除所有 Loopback Interfaces

var macAddresses = from nic in NetworkInterface.GetAllNetworkInterfaces()
                   where nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback
                   select nic.GetPhysicalAddress().ToString();

编辑,无论您的 NIC 的 OperationalStatus 是什么,您都可以进行检查,并简单地“询问”非空 MAC 地址:

var macAddresses = from nic in NetworkInterface.GetAllNetworkInterfaces()
                   where !string.IsNullOrEmpty(nic.GetPhysicalAddress().ToString())
                   select nic.GetPhysicalAddress().ToString();

【讨论】:

啊。我正在使用没有 Internet 连接的 VM。我可以在 VM 上运行 ipconfig/all 并获取 12 位 MAC 地址以及其他值,并且我正在尝试以编程方式检索相同的地址。有没有办法说服代码跳过 Loopback 接口并搜索非空 MAC 地址? 无论OperationalStatus如何,您都可以对所有设备的PhysicalAddress进行字符串检查,我将相应地编辑答案,语法荧光笔在cmets中效果不佳。跨度> 不幸的是,该解决方案对我不起作用,而且我仍然为 macAddresses 得到一个空字符串。我还尝试了@Iomed 的解决方案将其过滤为以太网类型,但我在那里得到了相同的结果. 这很奇怪...你能发布你的ipconfig /all 的匿名副本吗?我访问了我的虚拟服务器(HyperV)并且没有任何问题。您使用的是哪种虚拟化技术? HyperV、ESXi、XEN? 抱歉,我在该编辑中没有看到第二个解决方案。第二种解决方案已正确返回预期的 MAC 地址。感谢您的帮助。【参考方案2】:

有许多类型的网络适配器没有物理地址,例如 tunelLoopback

过滤到Ethernet类型:

where nic.OperationalStatus == OperationalStatus.Up && 
nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet

【讨论】:

不幸的是,我得到了和以前一样的结果,macAddresses 的一个看似空的字符串。

以上是关于为啥当我尝试获取我的 MAC 地址时得到一个空字符串?的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试获取边界时,为啥 previewLayer 返回 nil?

在 BLE 中随机化 Mac 地址

为啥需要猫鼬填充?

cv2 python上的Mac照片亭,为啥我的代码会导致错误?

C#获取计算机的MAC地址“离线”

当我尝试在我的代码中使用 re.sub 表达式时,为啥会收到一个名为“预期字符串或类似对象的字节”的错误 [重复]