Это была проблема, которую я искал в течение двух дней. Я поделюсь своими выводами.Получить MAC-адрес хоста VM через гостевую VM
В настоящее время я работаю над собственной системой управления лицензиями для нашего программного обеспечения. Это ничего необычного - до тех пор, пока он может однозначно идентифицировать пользователя, это достаточно хорошо. Наш механизм в настоящее время опирается на вход пользователя + пароль + 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 извлекает адрес MAC, основанный на том, что физическая карта подключена к интерфейсу PCI.
Способ 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-адресов, поскольку он извлекает адрес беспроводной карты. У нас были некоторые пользователи, возвращающие адреса null
в результате использования этого метода, и хотя я не знаю, почему это произойдет, это может быть связано с отсутствием беспроводной карты на своих компьютерах. С учетом сказанного это только догадка. Метод # 1 основан на использовании SQL-запросов для извлечения PCI MAC. Этот был надежным.
Тесты:
Использование ОС Windows 8.1 Enterprise Evaluation Edition (! Бесплатно 90-дневная пробная версия, яй), установленные на VirtualBox VM, тесты подтвердили, что существуют значительные различия в МАС-адресов, возвращаемых с помощью гостевой виртуальной машины и виртуальной машины хоста.
Согласно моему research, в большинстве случаев, виртуальная машина присваивается тот же МАС-адрес каждый раз, когда он включен, пока виртуальная машина не двигается, и никакие изменения не внесены определенные настройки в файл конфигурации. С учетом сказанного, и вот плохие новости ... Гость VM MAC может быть чем угодно. Похоже, что это одна из причин, по которой MAC-адреса несовместимы при использовании в качестве уникальных идентификаторов, что является проблемой, о которой я узнал, когда некоторые пользователи были на своих виртуальных машинах. Я никогда не знал, что так работают люди, но мы здесь, поэтому в этот момент не злорадствовать.
Мой вопрос - есть ли способ, не делая пользователю изменять какие-либо настройки на их конце, для извлечения хоста виртуальной машины MAC, в отличие от гостя VM?
На данный момент я не вижу причин, по которым кто-то не будет назначать один и тот же MAC для каждой гостевой машины, чтобы обойти наш механизм с плавающей лицензией. Получение VM-узла хоста обойдет эту проблему, поскольку она будет отображаться как один MAC.
Какой тип хоста? (VMware, Hyper-V и т. Д.) –
VirtualBox - это хост. – theGreenCabbage