为啥当我尝试获取我的 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】:
有许多类型的网络适配器没有物理地址,例如 tunel
或 Loopback
过滤到Ethernet
类型:
where nic.OperationalStatus == OperationalStatus.Up &&
nic.NetworkInterfaceType == NetworkInterfaceType.Ethernet
【讨论】:
不幸的是,我得到了和以前一样的结果,macAddresses 的一个看似空的字符串。以上是关于为啥当我尝试获取我的 MAC 地址时得到一个空字符串?的主要内容,如果未能解决你的问题,请参考以下文章
当我尝试获取边界时,为啥 previewLayer 返回 nil?