2008-10-09 13 views
12

¿Cómo puedo obtener la dirección BSSID/MAC (Control de acceso a medios) del punto de acceso inalámbrico al que mi sistema está conectado usando C#?Obtener BSSID (dirección MAC) del punto de acceso inalámbrico desde C#

Tenga en cuenta que estoy interesado en el BSSID de WAP. Esto es diferente de la dirección MAC de la porción de red del WAP.

+5

C# no funciona en MAC. No pude resistirme. : P –

+4

http://www.mono-project.com/Main_Page – Iain

Respuesta

21

Los siguientes necesita ser ejecutada mediante programación:

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

Lo anterior muestra las direcciones MAC inalámbrica del punto de acceso que es diferente de:

arp -a | findstr 192.168.1.254 

Este es porque el punto de acceso tiene 2 direcciones MAC. Uno para el dispositivo inalámbrico y otro para el dispositivo de red. Quiero el MAC inalámbrico pero obtengo el MAC de red usando arp.

Utilizando el 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

Este question le informa cómo obtener la información que desea de su conexión de red. (Vaya a las respuestas usando NetworkInformation)

2

de conseguir que resultan de ARP.EXE programación:

La API de Win32 para conseguir esto es en el grupo de funciones IP Helper y se llama GetIpNetTable(). El P/Invoke signature for it is here. Tendrá que escribir un código para ordenar los resultados, y es una de esas divertidas API de Win32 con resultados de longitud variable.

Otra forma de hacerlo sería usar Windows Management Instrumentation que tiene un buen conjunto de clases de contenedor en el System.Management and System.Management.Instrumentation namespaces. Pero la desventaja es que el servicio WMI debe estar ejecutándose para que funcione. He buscado pero no puedo encontrar el objeto exacto en el árbol de WMI que contiene la información equivalente. Estoy bastante seguro de que existe porque veo herramientas de terceros en la red que afirman recuperar esta información mediante esta API. Tal vez alguien más se acercará a esa parte.

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

Tenga cuidado con el error de sintaxis, como las llaves todo eso. Pero el concepto está aquí. Puede crear la función de escaneo invocando periódicamente este proceso. Corrígeme si algo sale mal.

Cuestiones relacionadas