背景
我正在尝试从计算机中获取唯一标识符,并希望能够可靠地返回相同的MAC地址。请相信我有使用MAC地址的原因,并阅读了许多关于替代唯一ID方法的帖子(是的,我已考虑过如果它们没有任何网络卡的情况)。
问题
问题在于,在.NET中,我看不到任何方法可以判断特定的NetworkInterface是否是物理硬件网络卡,例如连接到某些VPN或WiFi网络时会添加“Nortel IPSECSHM Adapter - Packet Scheduler Miniport”类似的东西。
我知道如何使用类似以下代码获取MAC地址:
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
{
log.Debug("NIC " + nic.OperationalStatus + " " + nic.NetworkInterfaceType + " " + nic.Speed + " " + nic.GetPhysicalAddress() + " " + nic.Description);
}
理解上,没有办法百分之百地确定我会得到一张内部网络卡,但我想选择要返回的MAC地址,该地址针对于一个给定的机器是最不容易改变的,与其是否连接到wifi之类的因素无关,也无论它是通过某种类型的绑定连接还是安装了新的VPN软件添加了新接口。
考虑的策略
1)选择“已启动”的第一个接口。这在我的笔记本电脑上失败了,因为“Packet Miniport”始终处于启动状态。此外,如果我将手机绑定到笔记本电脑上,它也会显示为第一张卡。
2)选择最适当的类型...这种方法失败了,因为基本上所有设备都显示为“以太网”,包括WiFi适配器和我的iPhone绑定的互联网连接。
3)选择具有IP地址的NIC。由于以下几个原因而失败:1)网络卡可能未连接到局域网2)存在多个可能具有IP地址的网络接口卡。
4)只发送所有MAC地址...问题是列表将根据安装的软件而改变,并且很难进行比较。
5)选择速度最快的MAC地址。我认为这可能是最好的选择。我认为可以肯定的是,最快的接口通常会是最常驻的。
或者,可能有其他方法在.NET中检测物理卡,如果您能推荐一个提供不同信息的API调用,我会考虑调用它。
还有其他想法吗?
为了演示,在我将手机与笔记本电脑绑定时,这里是我的示例代码的输出:
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