c# - 如何确定实际物理网卡的 MAC 地址——而不是 VPN (.NET C#) 创建的虚拟网络接口(interface)

标签 c# .net networking uniqueidentifier mac-address

背景

我正在尝试从计算机中获取唯一标识符,并希望每次都能可靠地返回相同的 MAC 地址。相信我,我有使用 MAC 地址的理由,并且阅读了很多关于备用唯一 ID 方法的帖子(是的,我已经考虑过他们是否没有任何网卡)。

问题

问题出在 .NET 中,无论如何我看不到特定的网络接口(interface)是否是物理硬件网卡,来自诸如“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 地址以返回给定机器的最不可能更改的 MAC 地址.独立于以下因素——它是否连接到 wifi...通过某种类型的系绳连接...或者他们安装了一些新的 vpn 软件,它添加了一个新的界面。

考虑的策略

1) 选择第一个接口(interface)“Up”。这在我的笔记本电脑上失败了,因为“数据包微型端口”始终处于运行状态。此外,如果我将手机连接到笔记本电脑,这也会显示为第一张卡片。

2) 选择最合适的类型...这失败了 b/c 基本上一切都显示为“以太网”,包括 WiFi 适配器和我的 iPhone 网络共享互联网连接。

3) 选择有IP地址的网卡。失败有几个原因:1) 网卡可能没有连接到 LAN 2) 有多个网卡可能有 IP 地址。

4) 只需发送所有 MAC 地址...问题是列表会根据安装的软件而改变,并且很难比较。

5) 选择速度最快的mac地址。我认为这可能是我最好的选择。我认为可以肯定地说,最快的界面通常是最持久的。

或者,可能有一些其他方法可以在 .NET 中检测物理卡,或者如果您可以推荐一种可以提供不同信息的方法,我会考虑调用其他 API 调用。

还有其他想法吗?

此处演示的是我的 iPhone 绑定(bind)时上面示例代码的输出:

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

最佳答案

这是我的方法: 它利用物理卡连接到 PCI 接口(interface)这一事实

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;
    }
}

关于c# - 如何确定实际物理网卡的 MAC 地址——而不是 VPN (.NET C#) 创建的虚拟网络接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1567377/

相关文章:

c# - 使用 FormatConvertedBitmap 将位图转换为 Gray8 仅使用 4 位?

.net - 如何从powershell构建VS解决方案文件夹

perl - 模拟主机无法访问 - 如何实现/实现

c# - Web API 获取在 Controller 上进行 UrlEncoded 的请求参数

c# - 当鼠标位于任何 SDI 窗体上时如何检测窗体名称

.net - VB.Net 从任务管理器中隐藏进程

c# - 吗?运算符保证只运行一次左侧参数?

c++ - 在 C++ 应用程序 : gethostbyname() failing 中检查互联网连接的可靠方法

android - 通过 Android 应用程序连接到 WiFi

c# - 我该如何处理这个错误?