Получение MAC-адреса в Windows 7, когда сетевой адаптер отключен с помощью C # - PullRequest
2 голосов
/ 26 июля 2011

Мне нужен способ получить адрес MAC машины с помощью Windows 7, когда его Network Interface Card отключено и используется C#. Я искал в Интернете, а также ссылался на следующие ссылки. Используя ответ во 2-й ссылке, я мог бы получить необходимые данные успешно в Windows XP, но не в Windows 7, когда NIC отключен.

Получение MAC-адреса C #

Получить MAC-адрес, когда сетевой адаптер отключен?

Кто-нибудь знает, как выполнить эту задачу ???

Спасибо ...

Ответы [ 2 ]

1 голос
/ 02 сентября 2011

Я думаю, вам нужно кешировать MAC-адрес. Например, когда сетевая карта включена, вы можете обновить MAC-адрес в кеше для этой карты. Позже, когда он отключен и вы не можете получить MAC из Windows, вы можете получить его из своего кэша.

Вы не можете получить MAC-адрес от драйвера, который даже не загружен. А драйвер необходим для загрузки MAC-адреса из ПЗУ сетевой карты. Таким образом, кэширование MAC должно быть тем же способом, который использовала бы Windows, если бы у Windows был способ получить MAC-адрес от отключенной сетевой карты.

0 голосов
/ 26 июля 2011

Вот что я придумал (64-битная Win7):

var query = new SelectQuery("Win32_NetworkAdapter");
var scope = new ManagementScope("\\root\\cimv2");
scope.Connect();
var searcher = new ManagementObjectSearcher(scope, query);
var managementObjects = searcher.Get();
foreach (var mo in managementObjects)
{
    Debug.WriteLine("{0} : {1}", mo["Description"], mo["MACAddress"]);
}

Мой адаптер Bluetooth выглядит следующим образом:

Устройство Bluetooth (персональная сеть): 70: F3: 95: 88: F7: 7E

Однако, когда он отключен, MAC-адрес отображается пустым.

Вы должны иметь возможность включать / отключать адаптеры для запроса MAC через методы класса, но это немного хлопотно, так как вам нужно вручную обернуть класс Win32_NetworkAdapter.

Вам необходимо сгенерировать оболочку класса для объекта WMI с помощью инструмента SDK .Net Framework 'mgmtclassgen.exe'

Вызвать это так (сгенерированный файл 80k):

 mgmtclassgen Win32_NetworkAdapter -p NetworkAdapter.cs

Затем увеличьте код следующим образом:

var query = new SelectQuery("Win32_NetworkAdapter");
var scope = new ManagementScope("\\root\\cimv2");
scope.Connect();
var searcher = new ManagementObjectSearcher(scope, query);
var managementObjects = searcher.Get();
var adapters = managementObjects.Cast<ManagementBaseObject>().Select(s => new NetworkAdapter(s));
foreach (var adapter in adapters)
{
    adapter.Enable();
    Console.WriteLine("{0} : {1}", adapter.Name, adapter.MACAddress);
}

Но я не смог заставить его работать, так как ничего не произошло, когда я вызвал Enable (), а код возврата был 0. Я отправил его в надежде, что вы или кто-то еще сможете определить недостающие детали, которые позволят ему работать.

...