背景
我正在尝试从计算机中获取唯一标识符,并且希望每次都能可靠地返回相同的 MAC 地址。相信我,我有使用 MAC 地址的理由,并且阅读了许多关于替代唯一 id 方法的帖子(是的,我考虑过他们是否没有任何网卡)。
Problem
问题出在 .NET 中,无论如何我都无法判断特定的 NetworkInterface 是否是来自“Nortel IPSECSHM 适配器 - 数据包调度程序微型端口”之类的物理硬件网卡,当您连接到某些 VPN 或 WiFi 网络时会添加该网卡。
我知道如何使用类似于以下的代码来获取 Mac 地址:
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
log.Debug("NIC " + nic.OperationalStatus + " " + nic.NetworkInterfaceType + " " + nic.Speed + " " + nic.GetPhysicalAddress() + " " + nic.Description);
}
可以理解的是,没有 100% 的方法可以确保我获得内部网卡,但是我想选择要返回给定机器的 MAC 地址,该地址最不可能更改。独立于诸如是否连接到 wifi...通过某种类型的系绳连接进行连接...或者他们安装一些新的 VPN 软件来添加新接口等因素。
考虑的策略
1) 选择第一个“Up”接口。这在我的笔记本电脑上失败了,因为“数据包微型端口”始终处于打开状态。此外,如果我将手机连接到笔记本电脑,这也会显示为第一张卡。
2)选择最合适的类型...这失败了,因为基本上所有内容都显示为“以太网”,包括 WiFi 适配器和我的 iPhone 网络共享互联网连接。
3) 选择有IP 地址的NIC。失败有多种原因:1) 网卡可能未连接到 LAN 2) 多个网卡可能具有 IP 地址。
4) 只需发送所有 MAC 地址...问题是列表会根据安装的软件而变化,并且很难进行比较。
5) 选择速度最快的mac地址。我想这可能是我最好的选择。我认为可以肯定地说,最快的界面通常是最持久的。
或者,可能还有其他方法来检测 .NET 中的物理卡,或者如果您可以推荐一种能够提供不同信息的方法,我会考虑调用其他 API 调用。
还有其他想法吗?
这里演示的是当我的 iPhone 被连接时上面示例代码的输出:
DEBUG - NIC Down Ethernet 500000 0021E98BFBEF Apple Mobile Device Ethernet - Packet Scheduler Miniport
DEBUG - NIC Up Ethernet 10000000 444553544200 Nortel IPSECSHM Adapter - Packet Scheduler Miniport
DEBUG - NIC Down Ethernet 54000000 00166FAC94C7 Intel(R) PRO/Wireless 2200BG Network Connection - Packet Scheduler Miniport
DEBUG - NIC Down Ethernet 1000000000 0016D326E957 Broadcom NetXtreme Gigabit Ethernet - Packet Scheduler Miniport
DEBUG - NIC Up Loopback 10000000 MS TCP Loopback interface
未连接 iPhone 时:
DEBUG - NIC Up Ethernet 10000000 444553544200 Nortel IPSECSHM Adapter - Packet Scheduler Miniport
DEBUG - NIC Down Ethernet 54000000 00166FAC94C7 Intel(R) PRO/Wireless 2200BG Network Connection - Packet Scheduler Miniport
DEBUG - NIC Down Ethernet 1000000000 0016D326E957 Broadcom NetXtreme Gigabit Ethernet - Packet Scheduler Miniport
DEBUG - NIC Up Loopback 10000000 MS TCP Loopback interface