Wifi WPS客户端在Windows 10中以脚本或代码启动



我找不到如何从命令提示符或Powershell在Windows 10中启动WPS客户端。当我使用Linux时,一切都很容易使用wla_supplicant(wpa_cli wps_pbc)。Windows中有类似的东西吗?

有谁知道如何在Windows中无需人工输入即可设置Wi-Fi网络(通过WPS)密钥?

我还从Microsoft尝试了WCN(Windows Connect Now),因为它实现了WPS功能。我也从WCN上的Windows SDK获得了示例,但他们无法通过WPS获取密钥(失败了)。但是,如果我使用Windows用户界面来连接WIN码,那么一切似乎都很好。

我确信有可能这样做,通过命令提示符或应用程序 (C++/C#) 启动按钮执行 Wifi 保护设置非常重要,无需人工入侵或输入(一旦 WPS 播出,Windows 应该自动获取网络密钥然后连接)。

我不知道现在回答是否为时已晚,只需将我所知道的内容放在这里,希望它能有所帮助。

首先,如果您的系统已更新到 16299(秋季创作者更新),您只需使用 UWP 中的新 wifi api。 安装最新的 Windows SDK,创建一个 C# 控制台项目,将 C# 版本至少定位到 7.1,然后添加对该项目的两个引用。

  1. C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETCore\v4.5\System.Runtime.WindowsRuntime.dll
  2. C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.16299.0\Windows.winmd

毕竟,下面的代码应该可以工作了。

using System;
using System.Threading.Tasks;
using Windows.Devices.Enumeration;
using Windows.Devices.WiFi;
class Program
{
static async Task Main(string[] args)
{
var dic = await DeviceInformation.FindAllAsync(WiFiAdapter.GetDeviceSelector());
if (dic.Count > 0)
{
var adapter = await WiFiAdapter.FromIdAsync(dic[0].Id);
foreach (var an in adapter.NetworkReport.AvailableNetworks)
{
if (an.Ssid == "Ssid which you want to connect to.")
{
// Fouth parameter which is ssid can not be set to null even if we provided
// first one, or an exception will be thrown.
await adapter.ConnectAsync(an, WiFiReconnectionKind.Manual, null, "",
WiFiConnectionMethod.WpsPushButton);
}
}
}
}
}

构建并运行 exe,然后按下路由器的按钮,您的 PC 将连接到路由器。

但是,如果您无法更新到16299,WCN将是您唯一的选择。您可能已经注意到,如果使用按钮方法调用IWCNDevic::Connect fist,WSC(Wifi简单配置)会话将失败。这是因为 WNC 不会以登记者的身份启动一键式会话,而只会以注册商的身份启动。这意味着您必须确保在调用IWCNDevic::Connect之前已按下路由器的按钮。执行此操作的方法是使用本机 Wifi api 重复扫描路由器,分析扫描结果中最新的 WSC 信息元素,确认所选注册器属性已设置为 true,设备密码 ID 属性已设置为 4。之后,查询IWCN网站并调用连接功能将成功。然后,您可以调用IWCNDevice::GetNetworkProfile以获取可用于连接到路由器的配置文件。因为它的代码太多,所以我只会列出将使用的主要 wifi api。

  • Wlan接口:用于获取可用的wifi接口。
  • WlanRegister通知:用于注册回调以处理扫描连接结果。
  • WlanScan:用于扫描指定的wifi BSS。
  • WlanGetNetworkBsslist:用于在扫描后获取最新的BSS信息。
  • WlanSetProfile:用于保存BSS的配置文件。
  • WlanConnect:用于连接到 BSS。

关于WSC信息元素及其属性,您可以从Wi-Fi简单配置技术规范v2.0.5中找到所有信息。

对于 Krisz。关于超时。
您不能直接将IAsyncOperation投射到Task。正确的方法是使用AsTask方法。而且,您应该在超时后取消ConnectAsync.
示例代码:

var t = adapter.ConnectAsync(an, WiFiReconnectionKind.Manual, null, "",
WiFiConnectionMethod.WpsPushButton).AsTask();
if (!t.Wait(10000))
t.AsAsyncOperation().Cancel();

最新更新