如何使用WMI或System.Net.NetworkInformation在Windows 10中用C#获取当前连接的WiFi SSID?

3

我已经尝试了两种不同的方法

第一种方法:null异常问题

try{

ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\WMI", "SELECT * FROM MSNdis_80211_ServiceSetIdentifier");

    foreach (ManagementObject queryObj in searcher.Get())
    {
       Console.WriteLine("-----------------------------------");
       Console.WriteLine("MSNdis_80211_ServiceSetIdentifier instance");
       Console.WriteLine("-----------------------------------");

       if (queryObj["Ndis80211SsId"] == null)
       {
           //Console.WriteLine("Ndis80211SsId: {0}",queryObj["Ndis80211SsId"]);
       }
       else
       {
           Byte[] arrNdis80211SsId = (Byte[])
           (queryObj["Ndis80211SsId"]);
           foreach (Byte arrValue in arrNdis80211SsId)
           {
              //Console.WriteLine("Ndis80211SsId: {0}", arrValue);
           }
       }
    }

}catch(Exception ex){

}

第二种方法:我正在获取Wi-Fi信号,但无法获取SSID

if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) {
    foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) {

   if (ni.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 && ni.OperationalStatus== OperationalStatus.Up   ) {
       Network = "NETWORK ( N/A )";
           Wifi = "Wifi (" + ni.Name + ")";
        }
    }
}

请问有人能清楚地告诉我如何获取已连接的WiFi名称吗?

4个回答

4
    // Show SSID and Signal Strength
    private void showConnectedId() {
        System.Diagnostics.Process p = new System.Diagnostics.Process();
        p.StartInfo.FileName = "netsh.exe";
        p.StartInfo.Arguments = "wlan show interfaces";
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        p.Start();

        string s = p.StandardOutput.ReadToEnd();
        string s1 = s.Substring(s.IndexOf("SSID"));
        s1 = s1.Substring(s1.IndexOf(":"));
        s1 = s1.Substring(2, s1.IndexOf("\n")).Trim();

        string s2 = s.Substring(s.IndexOf("Signal"));
        s2 = s2.Substring(s2.IndexOf(":"));
        s2 = s2.Substring(2, s2.IndexOf("\n")).Trim();

        labelStatus.Text = "WIFI connected to " + s1 + "  " + s2;
        p.WaitForExit();
    }

我可以在UWP中使用这个吗? - Syaiful Nizam Yahya
看起来你不能从UWP运行netsh。提醒一下。 - Syaiful Nizam Yahya

0

我想要做的就是这个。 有一个 NuGet 包似乎包装了较低级别的 API,叫做 SimpleWifi,对我来说完美地工作。

请注意,它似乎是早期库“ManagedWifi”的错误修复重新实现,该库对我抛出无法解决的异常,如此处所述: Issues with using Managed WiFi (NativeWiFi API)


SimpleWifi确实可以工作,但自2015年以来就没有更新过。我已经成功地使用了一个更近期的NuGet包,叫做ManagedNativeWifi。https://github.com/emoacht/ManagedNativeWifi - fvlinden

0

您可以尝试使用以下提到的WMI类。两者都定义在cimv2中。

SELECT * FROM WiFi_AdapterAssociationInfo

SELECT * FROM WiFi_AvailableNetwork

更多详细信息请参见: WIFI 信息


嗨,感谢您的回答和提供的WIFI信息参考。 - Mizanur Rahman
如果这解决了你的问题,请考虑将答案标记为赞。如果没有,请分享更多问题。 - Amit Shakya
WMI在UWP中不受支持。https://social.msdn.microsoft.com/Forums/sqlserver/en-US/efcf0564-5bdb-44c5-95a8-76395b662b2b/uwp-wmi-support-on-uwp-applications?forum=wpdevelop 提醒一下。 - Syaiful Nizam Yahya
1
这在我的电脑上无法运行。([wmisearcher]”SELECT * FROM WiFi_AvailableNetwork”).get() 的结果是:枚举集合时发生错误:无效的类。 - Carl in 't Veld
1
我的电脑上也是这样(W10x64):无效的类。 - Nimral
你能提供关于你的环境的信息吗?包括硬件和Windows系统信息。 - Amit Shakya

0

我发现了一个相当古老的库,可以追溯到2014年:

Microsoft.WindowsAPICodePack-Core version 1.1.0.2

尽管它不符合.NET Standard,但这个库与我的.NET Core 3.0应用程序集成,但显然不是跨平台的。

示例代码:

var networks = NetworkListManager.GetNetworks(NetworkConnectivityLevels.Connected);            
foreach (var network in networks) { 
    sConnected = ((network.IsConnected == true) ? " (connected)" : " (disconnected)");
    Console.WriteLine("Network : " + network.Name + " - Category : " + network.Category.ToString() + sConnected);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接