Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#从我连接的接入点获取MAC地址_C#_.net_Networking_Netsh_Access Point - Fatal编程技术网

C#从我连接的接入点获取MAC地址

C#从我连接的接入点获取MAC地址,c#,.net,networking,netsh,access-point,C#,.net,Networking,Netsh,Access Point,这是我在这里的第一篇帖子 我正在用C#.NET Framework 4.6.1编写一个程序。我需要以某种方式从设备连接到的接入点获取BSSID(MAC地址),将其放入字符串变量中 我在网上搜索了好几个小时。但我所找到的只是所有接入点的列表。 有两种解决方案试图从CMD命令“netsh wlan show interfaces”进行解析,但似乎无法正常工作。此外,我不喜欢解析方法,它很难看,而且对性能一点也不友好 如果有人能解决这个问题,并能与大家分享,这将是一件好事 致意 恩里克 从这里的另一个

这是我在这里的第一篇帖子

我正在用C#.NET Framework 4.6.1编写一个程序。我需要以某种方式从设备连接到的接入点获取BSSID(MAC地址),将其放入字符串变量中

我在网上搜索了好几个小时。但我所找到的只是所有接入点的列表。 有两种解决方案试图从CMD命令“netsh wlan show interfaces”进行解析,但似乎无法正常工作。此外,我不喜欢解析方法,它很难看,而且对性能一点也不友好

如果有人能解决这个问题,并能与大家分享,这将是一件好事

致意 恩里克

从这里的另一个用户那里尝试下面的代码,但似乎没有任何回报。返回值为空,例如,函数GetAccessPoint甚至没有被触发。(这是我在解析中找到的唯一看似合理的解决方案),但正如我所说的,我希望远离解析

class AccessPoint
{
    public string SSID { get; set; }
    public string BSSID { get; set; }
    public byte Signal { get; set; }
}

class Program
{
    private static async Task Main(string[] args)
    {
        var apList = await GetSignalOfNetworks();

        foreach (var ap in apList)
        {
            WriteLine($"{ap.BSSID} - {ap.Signal} - {ap.SSID}");
        }

        Console.ReadKey();
    }

    private static async Task<AccessPoint[]> GetSignalOfNetworks()
    {
        string result = await ExecuteProcessAsync(@"C:\Windows\System32\netsh.exe", "wlan show networks mode=bssid");

        return Regex.Split(result, @"[^B]SSID \d+").Skip(1).SelectMany(network => GetAccessPointFromNetwork(network)).ToArray();
    }

    private static AccessPoint[] GetAccessPointFromNetwork(string network)
    {
        string withoutLineBreaks = Regex.Replace(network, @"[\r\n]+", " ").Trim();
        string ssid = Regex.Replace(withoutLineBreaks, @"^:\s+(\S+).*$", "$1").Trim();

        return Regex.Split(withoutLineBreaks, @"\s{4}BSSID \d+").Skip(1).Select(ap => GetAccessPoint(ssid, ap)).ToArray();
    }

    private static AccessPoint GetAccessPoint(string ssid, string ap)
    {
        string withoutLineBreaks = Regex.Replace(ap, @"[\r\n]+", " ").Trim();
        string bssid = Regex.Replace(withoutLineBreaks, @"^:\s+([a-f0-9]{2}(:[a-f0-9]{2}){5}).*$", "$1").Trim();
        byte signal = byte.Parse(Regex.Replace(withoutLineBreaks, @"^.*(Signal|Sinal)\s+:\s+(\d+)%.*$", "$2").Trim());

        return new AccessPoint
        {
            SSID = ssid,
            BSSID = bssid,
            Signal = signal,
        };
    }

    private static async Task<string> ExecuteProcessAsync(string cmd, string args = null)
    {
        var process = new Process()
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = cmd,
                Arguments = args,
                RedirectStandardInput = false,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                UseShellExecute = false,
                CreateNoWindow = true,
                StandardOutputEncoding = Encoding.UTF8,
            }
        };

        process.Start();

        string result = await process.StandardOutput.ReadToEndAsync();

        process.WaitForExit();

        return result;
    }

    private static async Task<string> GetFakeData()
    {
        var assembly = Assembly.GetExecutingAssembly();
        var resourceName = "ConsoleApp2.FakeData.txt";

        using (Stream stream = assembly.GetManifestResourceStream(resourceName))
        using (StreamReader reader = new StreamReader(stream))
        {
            return await reader.ReadToEndAsync();
        }
    }

    private static void WriteLine(string str)
    {
        Console.WriteLine(str);
    }
}
类访问点
{
公共字符串SSID{get;set;}
公共字符串BSSID{get;set;}
公共字节信号{get;set;}
}
班级计划
{
专用静态异步任务主(字符串[]args)
{
var apList=等待GetSignalOfNetworks();
foreach(apList中的var ap)
{
写线($“{ap.BSSID}-{ap.Signal}-{ap.SSID}”);
}
Console.ReadKey();
}
专用静态异步任务GetSignalOfNetworks()
{
字符串结果=等待ExecuteProcessAsync(@“C:\Windows\System32\netsh.exe”,“wlan显示网络模式=bssid”);
返回Regex.Split(结果@“[^B]SSID\d+”)。跳过(1)。选择many(网络=>GetAccessPointFromNetwork(网络)).ToArray();
}
专用静态访问点[]GetAccessPointFromNetwork(字符串网络)
{
字符串withoutLineBreaks=Regex.Replace(网络,@“[\r\n]+”,“”)。Trim();
字符串ssid=Regex.Replace(withoutLineBreaks,@“^:\s+(\s+).*$”,“$1”).Trim();
返回Regex.Split(withoutLineBreaks,@“\s{4}BSSID\d+”)。跳过(1)。选择(ap=>GetAccessPoint(ssid,ap)).ToArray();
}
私有静态访问点GetAccessPoint(字符串ssid,字符串ap)
{
字符串withoutLineBreaks=Regex.Replace(ap,@“[\r\n]+”,“”)。Trim();
字符串bssid=Regex.Replace(withoutLineBreaks,@“^:\s+([a-f0-9]{2}(:[a-f0-9]{2}){5})。*$”,“$1”).Trim();
byte signal=byte.Parse(Regex.Replace(withoutLineBreaks,@“^.*(signal | Sinal)\s+:\s+(\d+)%.*$”,“$2”).Trim();
返回新访问点
{
SSID=SSID,
BSSID=BSSID,
信号=信号,
};
}
专用静态异步任务ExecuteProcessAsync(字符串cmd,字符串args=null)
{
var进程=新进程()
{
StartInfo=新流程StartInfo
{
FileName=cmd,
参数=args,
重定向标准输入=false,
重定向标准输出=真,
RedirectStandardError=true,
UseShellExecute=false,
CreateNoWindow=true,
StandardOutputEncoding=Encoding.UTF8,
}
};
process.Start();
字符串结果=等待进程.StandardOutput.ReadToEndAsync();
process.WaitForExit();
返回结果;
}
私有静态异步任务GetFakeData()
{
var assembly=assembly.getExecutionGassembly();
var resourceName=“ConsoleApp2.FakeData.txt”;
使用(Stream=assembly.GetManifestResourceStream(resourceName))
使用(StreamReader=新StreamReader(stream))
{
return wait reader.ReadToEndAsync();
}
}
私有静态void WriteLine(字符串str)
{
控制台写入线(str);
}
}

}经过反复试验,我找到了一个简单的解决办法

class Program
{
    static void Main(string[] args)
    {
        var wlanClient = new WlanClient();
        foreach (WlanClient.WlanInterface wlanInterface in wlanClient.Interfaces)
        {
            var test = wlanInterface.CurrentConnection.wlanAssociationAttributes.Dot11Bssid;
            Console.WriteLine(test);
        }

        Console.ReadKey();
    }
}

BSSID与MAC不同…当您尝试解析cmd输出时,什么不起作用?在文章中添加了信息。;)