Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wifi WPS客户端在Windows 10中以脚本或代码启动_Windows_Powershell_Scripting_Wifi_Wps - Fatal编程技术网

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

Wifi WPS客户端在Windows 10中以脚本或代码启动,windows,powershell,scripting,wifi,wps,Windows,Powershell,Scripting,Wifi,Wps,我找不到如何在Windows 10中从命令提示符或powershell启动WPS客户端。当我使用Linux时,使用wla_supplicant(wpa_cli wps_pbc)一切都非常简单。Windows中有类似的东西吗 有人知道如何在Windows中设置Wi-Fi网络(通过WPS)密钥而无需人工输入吗 我还尝试了Microsoft的WCN(),因为它实现了WPS功能。我也得到了,但他们无法通过WPS获得密钥(失败)。但如果我使用Windows用户界面连接wiothout PIN,一切似乎都很

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

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

我还尝试了Microsoft的WCN(),因为它实现了WPS功能。我也得到了,但他们无法通过WPS获得密钥(失败)。但如果我使用Windows用户界面连接wiothout PIN,一切似乎都很好


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

我不知道现在回答是否为时已晚,把我知道的放在这里,希望能有所帮助

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

  • C:\Program Files(x86)\Reference Assembly\Microsoft\Framework.NETCore\v4.5\System.Runtime.WindowsRuntime.dll
  • 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,然后按下路由器按钮,您的电脑将连接到路由器

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

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

    关于WSC信息元素及其属性,您可以从中找到所有信息。

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

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

  • C:\Program Files(x86)\Reference Assembly\Microsoft\Framework.NETCore\v4.5\System.Runtime.WindowsRuntime.dll
  • 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,然后按下路由器按钮,您的电脑将连接到路由器

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

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

    关于WSC信息元素及其属性,可以从./p>找到所有的信息。为什么这里有一个C++标签?从SDK示例中的WCN实现是用C++编写的。为什么这里有一个C++标签?C++中的SDK示例的WCN实现是用C++编写的,谢谢!听起来很棒!但我不知道什么是SSID。。。因此,这个
    an.Ssid==“Ssid中你想连接的部分。”
    真的很烦人,但它解决了我的问题!谢谢谢谢,听起来很棒!但我不知道什么是SSID。。。因此,这个
    an.Ssid==“Ssid中你想连接的部分。”
    真的很烦人,但它解决了我的问题!谢谢