通过来宾VM检索主机VM MAC地址

时间:2014-02-14 16:28:50

标签: c# virtual-machine

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

我目前正在为我们的软件开发内部许可证管理系统。它没什么特别的 - 只要它能够唯一地识别用户,它就足够了。我们的机制目前依赖于用户登录+密码+ MAC地址。

到目前为止,99%的用户都没有遇到任何问题,但有一小部分用户(1%)已经回归问题。这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...";
}

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

方法2:

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 VM上的Windows 8.1企业评估版(免费90天试用,是!),测试确认通过来宾VM和主机VM返回的MAC地址存在重大差异。

根据我的research,在大多数情况下,每次启动虚拟机时都会为其分配相同的MAC地址,只要虚拟机未移动且没有更改配置文件中的某些设置。话虽如此,这是坏消息......客户VM MAC可以是任何东西。所以看起来,这是用作唯一标识符时MAC地址不一致的原因之一,这是我在一些用户在他们的公司虚拟机上时发现的问题。我从来不知道这是人们的工作方式,但我们现在就是这样,所以现在不要为此感到沮丧。

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

此时我没有看到任何理由为什么有人不会为每台客户机分配相同的MAC来绕过我们的浮动许可机制。检索主机VM MAC将解决此问题,因为它将显示为一个MAC。

0 个答案:

没有答案