背景
我试图从计算机中获取唯一的标识符,并希望每次都能够可靠地返回相同的MAC地址。相信我,我有我使用MAC地址的理由,并且读过许多关于其他独特的id方法的文章(是的,如果他们没有任何网卡,我也考虑过了)。
问题
问题在于,在.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地址返回给给定的机器,这是最不可能改变的。不受任何因素的影响,比如--它是否与无线网络有关.通过某种系绳连接.或者他们安装了一些新的vpn软件,增加了一个新的接口。
考虑的战略
1)选择“向上”的第一个接口。这在我的笔记本电脑上失败了,因为“包迷你端口”总是开着的。此外,如果我把我的手机与我的笔记本电脑,这也显示为第一张卡。
2)选择最合适的类型.这使b/c失败,基本上所有东西都显示为“以太网”,包括WiFi适配器和我的iPHone绑定互联网连接。
3)选择具有IP地址的网卡。由于以下几个原因而失败: 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发布于 2010-08-20 11:23:01
这是我的方法:它使用物理卡连接到PCI接口的事实。
ManagementObjectSearcher searcher = new ManagementObjectSearcher
("Select MACAddress,PNPDeviceID FROM Win32_NetworkAdapter WHERE MACAddress IS NOT NULL AND PNPDeviceID IS NOT NULL");
ManagementObjectCollection mObject = searcher.Get();
foreach (ManagementObject obj in mObject)
{
string pnp = obj["PNPDeviceID"].ToString();
if (pnp.Contains("PCI\\"))
{
string mac = obj["MACAddress"].ToString();
mac = mac.Replace(":", string.Empty);
return mac;
}
}发布于 2009-10-14 22:31:39
MAC地址的前三个字节是制造商ID。您可以将已知不适合您的特定制造商ID列入黑名单,并忽略这些接口。
依赖速度不太可能是一个好主意,因为没有理由VPN接口不能报告自己有千兆字节的速度。
发布于 2009-10-14 18:43:36
MAC地址是物理硬件地址。我无法在这台pc上进行测试,但我认为如果添加虚拟连接,您将不会得到一个新的MAC地址,因为它不是一个实际的硬件。这将是另一个连接,而不是另一个MAC地址。
因此,保证每次获得相同的MAC地址取决于连接到机器的相同硬件块,并且使用相同的算法从硬件中选择。
https://stackoverflow.com/questions/1567377
复制相似问题