Wifi WPS 客户端在脚本或代码中的 Windows 10 开始

Wifi WPS client start in Windows 10 in script or code

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

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

我也尝试过WCN(Windows Connect Now) from Microsoft as it implements WPS features. I got also samples from Windows SDK on WCN,但他们无法通过WPS获取密钥(失败)。但是如果我使用Windows用户界面连接without PIN,一切似乎都很好很好。

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

不知道现在来不及回答,就把我知道的放在这里,希望对你有帮助。

首先,如果您的系统已更新到 16299(Fall Creator Update),您只需使用 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\UnionMetadata.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,然后按下路由器的按钮,您的电脑将连接到路由器。

但是如果你不能更新到16299,WCN将是你唯一的选择。您可能已经注意到,如果首先使用按钮方法调用 IWCNDevic::Connect,WSC(Wifi 简单配置)会话将失败。这是因为 WNC 不会以登记者的身份启动按钮式会话,而只会以注册商的身份启动。这意味着您必须确保在调用 IWCNDevic::Connect 之前已按下路由器的按钮。方法是使用 Native Wifi api 反复扫描你的路由器,从扫描结果中分析出最新的 WSC 信息元素,确认 Selected Registrar 属性设置为 true,Device Password Id 属性设置为4、之后查询IWCNDevice,调用Connect函数即可成功。然后您可以调用 IWCNDevice::GetNetworkProfile 获取可用于连接到路由器的配置文件。因为代码太多,我就只列出会用到的主要wifiapi

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

关于 WSC 信息元素及其属性,您可以在 Wi-Fi Simple Configuration Technical Specification v2.0.5.

中找到所有信息

为了克里斯。关于超时。
您不能将 IAsyncOperation 直接转换为 Task。正确的方法是使用 AsTask 方法。而且,你应该在超时后取消ConnectAsync
示例代码:

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