web-dev-qa-db-ja.com

C#からワイヤレスアクセスポイントのBSSID(MACアドレス)を取得する

システムがC#を使用して接続されているワイヤレスアクセスポイントのBSSID/MAC(Media Access Control)アドレスを取得するにはどうすればよいですか?

WAPのBSSIDに興味があることに注意してください。これは、WAPのネットワーク部分のMACアドレスとは異なります。

12
Iain

以下はプログラムで実行する必要があります。

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

上記は、以下とは異なるアクセスポイントのワイヤレスMACアドレスを示しています。

arp -a | findstr 192.168.1.254

これは、アクセスポイントに2つのMACアドレスがあるためです。 1つはワイヤレスデバイス用、もう1つはネットワーキングデバイス用です。ワイヤレスMACが必要ですが、arpを使用してネットワークMACを取得します。

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

中括弧のような構文エラーに注意してください。しかし、コンセプトはここにあります。このプロセスを定期的に呼び出すことにより、スキャン機能を作成できます。何かがうまくいかない場合は私を修正してください。

3
Lennard

この 質問 は、ネットワーク接続から必要な情報を取得する方法を示しています。 (NetworkInformationを使用して回答までスクロールします)

3
James Curran

プログラムでARP.EXEからその結果を取得することについて:

これを取得するためのWin32 APIは IP Helper 関数のグループにあり、それは GetIpNetTable() と呼ばれます。 P/Invokeのシグネチャはここにあります 。結果をマーシャリングするためのコードを記述する必要があります。コードは、可変長の結果を持つ楽しいWin32 APIの1つです。

これを行う別の方法は、 System.ManagementおよびSystem.Management.Instrumentation名前空間 にラッパークラスのニースセットがある Windows Management Instrumentation を使用することです。しかし、欠点は、WMIサービスが動作するために実行されている必要があることです。調べてみましたが、同等の情報を含む正確なオブジェクトをWMIツリーで見つけることができません。このAPIを使用してこの情報を取得すると主張するサードパーティのツールがネット上にあるので、それが存在すると確信しています。たぶん、他の誰かがその部分でチャイムを鳴らすでしょう。

2
Tim Farley