首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定实际物理网卡的MAC地址??不是由VPN (.NET C#)创建的虚拟网络接口。

如何确定实际物理网卡的MAC地址??不是由VPN (.NET C#)创建的虚拟网络接口。
EN

Stack Overflow用户
提问于 2009-10-14 16:13:03
回答 5查看 17.6K关注 0票数 21

背景

我试图从计算机中获取唯一的标识符,并希望每次都能够可靠地返回相同的MAC地址。相信我,我有我使用MAC地址的理由,并且读过许多关于其他独特的id方法的文章(是的,如果他们没有任何网卡,我也考虑过了)。

问题

问题在于,在.NET中,我看不出一个特定的NetworkInterface是否是物理硬件网卡,它是一个"Nortel IPSECSHM适配器-数据包调度器小端口“,当您连接到特定的VPN或WiFi网络时,它会被添加进来。

我知道如何使用类似于以下代码的代码获取Mac地址:

代码语言:javascript
复制
    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捆绑在一起时,下面是示例代码的输出:

代码语言:javascript
复制
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连接:

代码语言:javascript
复制
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
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-08-20 11:23:01

这是我的方法:它使用物理卡连接到PCI接口的事实。

代码语言:javascript
复制
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;
    }
}
票数 12
EN

Stack Overflow用户

发布于 2009-10-14 22:31:39

MAC地址的前三个字节是制造商ID。您可以将已知不适合您的特定制造商ID列入黑名单,并忽略这些接口。

依赖速度不太可能是一个好主意,因为没有理由VPN接口不能报告自己有千兆字节的速度。

票数 2
EN

Stack Overflow用户

发布于 2009-10-14 18:43:36

MAC地址是物理硬件地址。我无法在这台pc上进行测试,但我认为如果添加虚拟连接,您将不会得到一个新的MAC地址,因为它不是一个实际的硬件。这将是另一个连接,而不是另一个MAC地址。

因此,保证每次获得相同的MAC地址取决于连接到机器的相同硬件块,并且使用相同的算法从硬件中选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1567377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档