这是我一直在寻找两天的问题。我将分享我的发现。
我目前正在为我们的软件开发内部许可证管理系统。它没什么特别的 - 只要它能够唯一地识别用户,它就足够了。我们的机制目前依赖于用户登录+密码+ 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。