2008-10-09 3 views
12

Как я могу получить адрес BSSID/MAC (управление доступом к среде передачи данных) точки беспроводного доступа, с которой моя система подключена к C#?Получите BSSID (MAC-адрес) точки беспроводного доступа с C#

Обратите внимание, что меня интересует BSSID WAP. Это отличается от MAC-адреса сетевой части WAP.

+5

C# не работает на MAC. Я не мог сопротивляться. : P – 2008-10-09 15:23:53

ответ

21

Следующие должна быть выполнена программно:

netsh wlan show networks mode=Bssid | findstr "BSSID" 

выше показывает беспроводные адреса точки доступа MAC, который отличается от:

arp -a | findstr 192.168.1.254 

Этом потому что точка доступа имеет 2 MAC-адреса. Один для беспроводного устройства и один для сетевого устройства. Я хочу беспроводной MAC, но получаю MAC-адрес сети, используя arp.

Использование Managed Wifi API:

var wlanClient = new WlanClient(); 
foreach (WlanClient.WlanInterface wlanInterface in wlanClient.Interfaces) 
{ 
    Wlan.WlanBssEntry[] wlanBssEntries = wlanInterface.GetNetworkBssList(); 
    foreach (Wlan.WlanBssEntry wlanBssEntry in wlanBssEntries) 
    { 
     byte[] macAddr = wlanBssEntry.dot11Bssid; 
     var macAddrLen = (uint) macAddr.Length; 
     var str = new string[(int) macAddrLen]; 
     for (int i = 0; i < macAddrLen; i++) 
     { 
      str[i] = macAddr[i].ToString("x2"); 
     } 
     string mac = string.Join("", str); 
     Console.WriteLine(mac); 
    } 
} 
3

Этот question рассказывает, как получить любую информацию из вашего сетевого соединения. (Прокрутите вниз к ответам, используя NetworkInformation)

2

О получении такого результата от arp.exe программно:

В Win32 API, чтобы получить это в IP Helper группе функций и называется GetIpNetTable(). P/Invoke signature for it is here. Вам нужно будет написать код, чтобы вывести результаты из него, и его один из тех забавных API Win32 с переменными длинными результатами.

Другой способ сделать это - использовать Windows Management Instrumentation, который имеет хороший набор классов обертки в System.Management and System.Management.Instrumentation namespaces. Но нижняя сторона - это служба WMI, которая должна работать для этого. Я вырыл, но я не могу найти точный объект в дереве WMI, который содержит эквивалентную информацию. Я уверен, что он существует, потому что я вижу сторонние инструменты в сети, которые утверждают, что извлекают эту информацию с помощью этого API. Может быть, кто-то еще заговорит с этой частью.

4
using System; 
using System.Diagnostics; 

class Program 
{ 
    static void Main(string[] args) 
    {  
     Process proc = new Process(); 
     proc.StartInfo.CreateNoWindow = true; 
     proc.StartInfo.FileName = "cmd"; 

     proc.StartInfo.Arguments = @"/C ""netsh wlan show networks mode=bssid | findstr BSSID """; 

     proc.StartInfo.RedirectStandardOutput = true;  
     proc.StartInfo.UseShellExecute = false; 
     proc.Start(); 
     string output = proc.StandardOutput.ReadToEnd(); 
     proc.WaitForExit(); 

     Console.WriteLine(output); 
    } 
} 

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

Смежные вопросы