【问题标题】:Two MAC address retrieval methods return two different MAC addresses两种 MAC 地址检索方法返回两个不同的 MAC 地址
【发布时间】:2023-03-14 02:12:01
【问题描述】:

我目前在我的 Windows 7 Bootcamp(在 Macbook Pro 上运行)上使用两种方法来检索 MAC 地址。我目前正在调查人们在虚拟机上运行我的 C# 编写的应用程序的一些问题,他们无法通过我的 MAC 地址身份验证机制进行身份验证。我手头没有虚拟机构建,所以我选择了最接近的替代方案 - 我的新手训练营。

第一种方法根据物理卡连接到 PCI 接口的事实检索 MAC 地址。

public static string returnMAC1()
{
    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;
        }
    }
    return "Nothing happened...";
}

第二种方法是 MSDN 文档中的标准方法:

public static string returnMAC2()
{
    string mac = string.Empty;
    foreach (System.Net.NetworkInformation.NetworkInterface nic in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces())
    {
        if (nic.OperationalStatus == System.Net.NetworkInformation.OperationalStatus.Up)
        {
            macAddresses += nic.GetPhysicalAddress().ToString();
            break;
        }
    }
    return mac;
}

使用这两种方法,我得到两个完全不同的结果:

以下是我的两种方法中打印的内容:

当我从Network and Sharing Center -> Wireless Network Connection 中检查 MAC 地址时,它对应于method 2 的结果。

我得到两个完全不同的结果是否与方法 #1 给我的结果不是无线卡的 MAC,而是实际 PCI 卡的 MAC 的事实有关?这似乎是最简单的解释,但却是可能的。

【问题讨论】:

    标签: c# mac-address bootcamp


    【解决方案1】:

    看来我的假设是正确的。

    我使用了一个 LAN 端口(不知道为什么我之前没有这样做)并将其插入 MAC。再次运行脚本,这次检查Local Area Connection的地址,这次显示method 1的地址。

    经验教训:

    1. 本地连接 MAC =/= 无线网络连接。无线网卡和网卡使用的MAC地址不同。

    2. 不同的 C# MAC 地址检索方法从不同的硬件连接中检索 MAC 地址。在我们的例子中,两种不同的方法应该会得到相同的结果,从无线端口检索一个 MAC,从 LAN 端口检索一个。

    【讨论】:

    • 我很高兴您得出了自己的结论。你是对的,每个物理设备都有不同的 MAC / 物理地址。尽管您的 returnMAC2returnMAC1 方法执行不同的操作,但这就是它们返回不同结果的原因。最有可能的是,returnMAC2 方法在机器启动时按照设置的设备就绪状态的顺序检索设备。 returnMAC1 方法可能只是按照设备 ID 或一些物理排列的顺序抓取它们。
    • 谢谢迈克尔。您会发现在虚拟机上运行上述脚本有什么不同吗?我目前打算在明天的 Windows 8.1 试用版上设置 Visual Studio 来测试这个。
    • 是的,虚拟机变得棘手。如果你在虚拟机上运行它,它可能会连接到各种虚拟集线器、网桥、交换机和其他奇怪的东西。这可能会扭曲操作系统认为您的主要界面。我写了一个类,它基本上根据已发送、接收的数据、接口类型确定最可能的接口,确保它不是环回或隧道接口,并检查它是否处于启动状态。如果这是您的目标,您可以使用 NetworkInterface 编写类似的内容。
    • 嗨迈克尔。你介意分享上述课程吗?具体来说,是否可以通过 C# 代码在来宾 VM 中检索主机 VM 的 MAC 地址?
    • 您无法可靠地检索主机 VM 的 MAC 地址,因为它们位于不同的虚拟接口上。我的班级只是按照我上面所说的来挑选给定系统上最有可能成为主要班级的班级。
    猜你喜欢
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 2013-09-13
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    相关资源
    最近更新 更多