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,然后添加两个对该项目的引用。
- C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETCore\v4.5\System.Runtime.WindowsRuntime.dll
- 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();
我找不到如何在 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,然后添加两个对该项目的引用。
- C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETCore\v4.5\System.Runtime.WindowsRuntime.dll
- 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();