Pergunta

Como posso obter o endereço BSSID / MAC (Media Access Control) do ponto de acesso sem fio que meu sistema está conectado ao uso do C#?

Observe que estou interessado no BSSID do WAP. Isso é diferente do endereço MAC da parte da rede do WAP.

Foi útil?

Solução

O seguinte precisa ser executado programaticamente:

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

O acima mostra os endereços MAC sem fio do ponto de acesso que são diferentes de:

arp -a | findstr 192.168.1.254

Isso ocorre porque o ponto de acesso possui 2 endereços MAC. Um para o dispositivo sem fio e outro para o dispositivo de rede. Eu quero o Mac sem fio, mas obtenha o Mac em rede usando arp.

Usando o API WiFi gerenciada:

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

Outras dicas

este pergunta Diz como obter alguma informação que você deseja fora da sua conexão de rede. (Role para baixo até as respostas usando o 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); 
    }   
}

Cuidado com o erro de sintaxe, como os aparelhos encaracolados tudo isso. Mas o conceito está aqui. Você pode criar função de digitalização invocando periodicamente esse processo. Corrija -me se algo der errado.

Sobre obter esse resultado do Arp.exe programaticamente:

A API Win32 para obter isso está no Auxiliar de IP grupo de funções e é chamado Getipnettable (). o P/Invoke Signature para ela está aqui. Você terá que escrever algum código para eliminar os resultados e é uma dessas APIs divertidas do Win32 com resultados de comprimento variável.

Outra maneira de fazer isso seria usar Instrumentação de gerenciamento do Windows que tem um bom conjunto de aulas de invólucro no System.Management e System.Management.Instrumentation Namespaces. Mas o lado negativo é que o serviço WMI deve estar funcionando para que isso funcione. Eu cavei por aí, mas não consigo encontrar o objeto exato na árvore WMI que contém as informações equivalentes. Tenho certeza de que existe porque vejo ferramentas de terceiros na rede que reivindicam recuperar essas informações usando esta API. Talvez outra pessoa entre em contato com essa parte.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top