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

时间:2017-03-24 15:05:22

标签: windows powershell scripting wifi wps

我找不到如何从命令提示符或PowerShell启动Windows 10中的WPS客户端。当我使用Linux时,wla_supplicant(wpa_cli wps_pbc)的所有内容都非常简单。 Windows中有类似的内容吗?

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

我还尝试了Microsoft的WCN(Windows Connect Now),因为它实现了WPS功能。我也得到了samples from Windows SDK on WCN,但是他们无法通过WPS获得密钥(它是faild)。但是,如果我使用Windows用户界面来连接无法使用的PIN,那么每一个都很好。

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

1 个答案:

答案 0 :(得分:0)

我不知道回答是否为时已晚,只要把我所知道的内容放在这里并希望它可以提供帮助。

首先,如果您的系统已更新至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 \ 10 \ UnionMetadata \ 10.0.16299.0 \ Windows.winmd
  3. 完成所有这些后,下面的代码应该可以正常工作。

    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 frist,则WSC(Wifi简单配置)会话将失败。这是因为WNC不会作为登记者启动按钮会话,而只是作为注册商。这意味着在调用IWCNDevic :: Connect之前必须确保已按下路由器的按钮。这样做的方法是使用Native Wifi api重复扫描路由器,从扫描结果中分析最新的WSC信息元素,确认Selected Registrar属性已设置为true,并且Device Password Id属性已设置为4。之后,查询IWCNDevice并调用Connect函数将成功。然后,您可以调用IWCNDevice :: GetNetworkProfile来获取可用于连接到路由器的配置文件。因为它的代码太多,我只会列出将要使用的主要的无线网络API。

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

    关于WSC信息元素及其属性,您可以找到Wi-Fi Simple Configuration Technical Specification v2.0.5中的所有信息。