2014-02-14 2 views
0

Это была проблема, которую я искал в течение двух дней. Я поделюсь своими выводами.Получить 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.

+0

Какой тип хоста? (VMware, Hyper-V и т. Д.) –

+0

VirtualBox - это хост. – theGreenCabbage

ответ

0

Мы решили, что это невозможно и не нужно.Мы также решили использовать 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..."; 
} 
Смежные вопросы