【发布时间】: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