Вот что я придумал (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. Я отправил его в надежде, что вы или кто-то еще сможете определить недостающие детали, которые позволят ему работать.