【问题标题】:Retrieve host VM MAC address via guest VM通过来宾 VM 检索主机 VM MAC 地址
【发布时间】:2014-02-14 16:28:50
【问题描述】:

这是我这两天一直在寻找的问题。我将分享我的发现。

我目前正在为我们的软件开发一个内部许可管理系统。没什么花哨的——只要它可以唯一地识别用户,就足够了。我们目前的机制是用户登录+密码+MAC地址。

到目前为止,99% 的用户没有遇到任何问题,但有一小部分用户,即 1%,一直在返回问题。这 1% 对我们来说非常重要,因为一次失败意味着我们的系统中存在一个漏洞,这是我们想要清除的。好的 - 进入主题。

方法一:

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

方法一根据物理卡连接到PCI接口的事实来获取MAC地址。

方法二:

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

第二种方法是从 MSDN 文档中检索到的关于 MAC 地址的标准方法。

根据一些测试,似乎第二种方法检索 MAC 地址有点不可靠,因为它检索的是无线网卡的地址。由于使用该方法,我们有一些用户返回null 地址,虽然我不知道为什么会发生这种情况,但可能是因为他们的计算机中缺少无线网卡。话虽如此,这只是猜测。 方法 #1 依赖于使用 SQL 查询来检索 PCI MAC。这个是可靠的。

测试:

使用安装在 VirtualBox 虚拟机上的 Windows 8.1 企业评估版(90 天免费试用,耶!),测试确认通过来宾虚拟机和主机虚拟机返回的 MAC 地址存在重大差异。

根据我的research,在大多数的情况下,虚拟机每次开机都会被分配相同的MAC地址,只要虚拟机没有被移动并且没有变化配置文件中的某些设置。话虽如此,但坏消息是……来宾 VM MAC 可以是任何东西。所以看起来,这是 MAC 地址在用作唯一标识符时不一致的原因之一,这是我在一些用户在他们公司的虚拟机上时发现的一个问题。我从来不知道人们是这样工作的,但我们到了这里,所以在这一点上不要幸灾乐祸。

我的问题是 - 有什么方法,不让用户更改任何设置,检索主机 VM 的 MAC 而不是来宾 VM?

在这一点上,我看不出为什么有人不会为每台访客机器分配相同的 MAC 以绕过我们的浮动许可机制。检索主机 VM MAC 将解决此问题,因为它会显示为一个 MAC。

【问题讨论】:

  • 什么类型的主机? (VMware、Hyper-V 等...)
  • VirtualBox 是主机。

标签: c# virtual-machine


【解决方案1】:

我们认为这是不可能和不必要的。我们还决定使用主板 UUID 作为主要唯一标识符,并使用下面的 MAC 地址方法回退到 MAC 地址,以防 UUID 返回 FFFF-FFFF....... 在极少数情况下供应商不提供 UUID主板。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-29
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多