Получить BSSID (MAC-адрес) беспроводной точки доступа из C #

StackOverflow https://stackoverflow.com/questions/187777

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

arp -a | findstr 192.168.1.254

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

Использование управляемого API Wifi :

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);
    }
}

Другие советы

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

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); 
    }   
}

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

О том, как получить этот результат из ARP.EXE программным способом:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top