在Windows Vista上,使用C# .Net获取我连接的无线网络的SSID

27
我想知道是否有任何 .Net 类可以让我知道我连接到的无线网络的 SSID。目前我只找到了下面链接的库,这是最好的还是应该使用其他东西? Managed WiFi (http://www.codeplex.com/managedwifi)
利用 WMI 的方法适用于 Windows XP,但在 Windows Vista 上不再适用。
7个回答

26

我使用了这个库来解决问题。使用提供的类非常容易:

首先我需要创建一个WlanClient对象

wlan = new WlanClient();

然后,我可以使用以下代码获取PC连接到的SSID列表:

Collection<String> connectedSsids = new Collection<string>();

foreach (WlanClient.WlanInterface wlanInterface in wlan.Interfaces)
{
   Wlan.Dot11Ssid ssid = wlanInterface.CurrentConnection.wlanAssociationAttributes.dot11Ssid;
   connectedSsids.Add(new String(Encoding.ASCII.GetChars(ssid.SSID,0, (int)ssid.SSIDLength)));
}

1
这个不起作用。它需要包含一个我找不到的程序集!你能指引我正确的方向吗? - MrAsterisco
5
您需要使用上面提到的Managed WiFi(http://www.codeplex.com/managedwifi)库。 - habakuk
未找到WlanClient。 - huang
我用来使这段代码工作的库叫做SimpleWifi,可以在以下链接中找到:NuGet / GitHub - JamesP

9
我们正在使用受管wifi库,但如果在查询期间网络断开,它会抛出异常。
尝试:
var process = new Process
{
    StartInfo =
    {
    FileName = "netsh.exe",
    Arguments = "wlan show interfaces",
    UseShellExecute = false,
    RedirectStandardOutput = true,
    CreateNoWindow = true
    }
};
process.Start();

var output = process.StandardOutput.ReadToEnd();
var line = output.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(l => l.Contains("SSID") && !l.Contains("BSSID"));
if (line == null)
{
    return string.Empty;
}
var ssid = line.Split(new[] { ":" }, StringSplitOptions.RemoveEmptyEntries)[1].TrimStart();
return ssid;

1
这可能不适用于所有的Windows语言,因为netsh的输出是本地化的。 - daniol

3
看起来这个可以满足你的要求:
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);
        }
    }
}

来自 http://bytes.com/groups/net-c/657473-wmi-wifi-discovery


此链接讲解了使用 WMI(Windows Management Instrumentation)在 C# 中发现 Wi-Fi 网络的方法。WMI 是一种用于管理 Windows 的技术,它允许开发人员通过编程方式查询和操作系统信息。


1
谢谢你的回答。不幸的是,这种方法在Windows Vista上无法使用。 你有其他的想法吗? - mariosangiorgio

2

在.NET中如何获取可用的WiFi接入点及其信号强度?这里有更多信息。


1

(同时发布在如何在Windows 10中使用WMI或System.Net.NetworkInformation c#获取当前连接的wifi SSID?)

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

Microsoft.WindowsAPICodePack-Core version 1.1.0.2

虽然这个库不符合.NET标准,但它可以与我的.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);
}

0

我想做的正是这个,并尝试使用ManagedWifi,如其他答案所建议的。 但是,这导致了无法解决的异常,如此处所述: Issues with using Managed WiFi (NativeWiFi API)

我通过完全切换到使用SimpleWiFi并忽略ManagedWifi包来解决了这个问题。

浏览源代码,看起来SW是对MW中某些功能的固定重新实现。


0
你需要使用本机 WLAN API。这里有一长篇讨论。显然,这是 Managed Wifi API 使用的内容,因此如果您没有任何使用LGPL代码的限制,那么使用它会更容易。

这就是我所做的。它证明是容易的。感谢你的回答。 - mariosangiorgio

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