通过cmd/PowerShell实现锐捷Wifi助手功能的思路


破校的校园无线网是基于锐捷认证的802.1x认证网络,使用PEAP-MSCHAPv2进行身份验证。曾经我们在学校里用电脑连接学校的校园Wifi只需要直接通过Windows连接AP输入ID和密码即可使用,后来网络设备似乎是升级了,直接输入账号密码链接的方法失效,学校便在官网提供了Wifi助手帮助我们链接Wifi。但是Wifi助手有一个问题就是,每一层楼的AP各自有一个独立的Wifi助手,而且每次通过Wifi助手连接都会把上一次连接的Wifi链接配置清除。
文件位置

借由命令行运行Wifi助手

我一直很纠结这个问题,就想试试看通过命令行操作Wifi助手。在通过.\wifi助手-7F.exe /?后我们得到可以通过/C /T:<完整路径>将其中的内容解压出来。顺便一提,Wifi助手本身是一个由WinRAR构建的压缩包自解压文件,你可以通过解压软件将其解压为文件夹获取其中文件。
命令行运行
解压后
解压出来的文件里有一个名叫ruijie_auto_winProfile.xml的文件,里面写着SSID信息和加密方式用于引导RJWirelessHelper-PEAP-MSCHAPV2.exe连接到对应的AP,文件内容如下:

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<netconfig version="winxp+">
<removeablessid />
<wireless ssid="<SSID名称>" autoJoin="true" hidden="true">
<authentication type="WPA2" encryption="AES">
<eap type="PEAP" method="MSCHAPV2"/>
</authentication>
</wireless>
</netconfig>

尽管如此,我们也仅仅是得到了Wifi助手的配置文件,并没有能够找到通过命令行运行Wifi助手的方法。

借助cmd/PowerShell指令

虽然我们没能找到使用命令行运行Wifi助手的方法,但是通过解压获得的配置文件里为我们提供了802.1x的认证方法,也就是开头提到的PEAP-MSCHAPv2方式进行认证。
为了确认手动添加SSID配置文件也能达到Wifi助手的相同功能,根据在网络上检索到的为Windows10设置802.1x认证(英文)的方法,我手动删除了电脑已存储的配置文件并手动重新添加了一个WPA2-企业版的SSID配置并设置为PEAP-MSCHAPv2验证。
连接手动添加的SSID之后,系统提示输入用户名和密码。输入后顺利完成了用户验证并连接上了网络。至此,我们可以确认,通过Windows原生的网络设置是可以完成Wifi助手的相关功能的。
在这之后,通过搜索引擎,我在stackoverflow找到了一个通过命令行即可对Windows进行网络管理的指令netsh,其中有一个指令用于对Windows的无线网络进行管理,即netsh wlan

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PS D:\RJWIFIHELP> netsh wlan /?
下列指令有效:
此上下文中的命令:
? - 显示命令列表。
add - 在一个表格中添加一个配置项。
connect - 连接到无线网络。
delete - 从一个表格中删除一个配置项。
disconnect - 从无线网络断开连接。
dump - 显示一个配置脚本。
export - 将 WLAN 配置文件保存为 XML 文件。
help - 显示命令列表。
IHV - 用于 IHV 记录的命令。
refresh - 刷新承载网络设置。
reportissues - 生成 WLAN 智能跟踪报告。
set - 设置配置信息。
show - 显示信息。
start - 启动承载网络。
stop - 停止承载网络。
若需要命令的更多帮助信息,请键入命令,接着是空格,
后面跟 ?。

在帮助中有一个指令引起了我的注意,就是netsh wlan export,这个指令可以将电脑中已经连接的所有SSID的配置文件进行导出。我们通过这一指令将通过Wifi助手连接的SSID导出得到WLAN-<SSID名称>.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?xml version="1.0"?>
<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
<name>SSID名称</name>
<SSIDConfig>
<SSID>
<hex>SSID名称的十六进制无空格格式</hex>
<name>SSID名称</name>
</SSID>
<nonBroadcast>true</nonBroadcast>
</SSIDConfig>
<connectionType>ESS</connectionType>
<connectionMode>auto</connectionMode>
<autoSwitch>false</autoSwitch>
<MSM>
<security>
<authEncryption>
<authentication>WPA2</authentication>
<encryption>AES</encryption>
<useOneX>true</useOneX>
</authEncryption>
<OneX xmlns="http://www.microsoft.com/networking/OneX/v1">
<cacheUserData>true</cacheUserData>
<authMode>machineOrUser</authMode>
<EAPConfig>
<EapHostConfig xmlns="http://www.microsoft.com/provisioning/EapHostConfig">
<EapMethod>
<Type xmlns="http://www.microsoft.com/provisioning/EapCommon">25</Type>
<VendorId xmlns="http://www.microsoft.com/provisioning/EapCommon">0</VendorId>
<VendorType xmlns="http://www.microsoft.com/provisioning/EapCommon">0</VendorType>
<AuthorId xmlns="http://www.microsoft.com/provisioning/EapCommon">0</AuthorId>
</EapMethod>
<Config xmlns="http://www.microsoft.com/provisioning/EapHostConfig">
<Eap xmlns="http://www.microsoft.com/provisioning/BaseEapConnectionPropertiesV1">
<Type>25</Type>
<EapType xmlns="http://www.microsoft.com/provisioning/MsPeapConnectionPropertiesV1">
<ServerValidation>
<DisableUserPromptForServerValidation>false</DisableUserPromptForServerValidation>
<ServerNames/>
</ServerValidation>
<FastReconnect>false</FastReconnect>
<InnerEapOptional>false</InnerEapOptional>
<Eap xmlns="http://www.microsoft.com/provisioning/BaseEapConnectionPropertiesV1">
<Type>26</Type>
<EapType xmlns="http://www.microsoft.com/provisioning/MsChapV2ConnectionPropertiesV1">
<UseWinLogonCredentials>false</UseWinLogonCredentials>
</EapType>
</Eap>
<EnableQuarantineChecks>false</EnableQuarantineChecks>
<RequireCryptoBinding>false</RequireCryptoBinding>
<PeapExtensions>
<PerformServerValidation xmlns="http://www.microsoft.com/provisioning/MsPeapConnectionPropertiesV2">false</PerformServerValidation>
<AcceptServerName xmlns="http://www.microsoft.com/provisioning/MsPeapConnectionPropertiesV2">false</AcceptServerName>
</PeapExtensions>
</EapType>
</Eap>
</Config>
</EapHostConfig>
</EAPConfig>
</OneX>
</security>
</MSM>
</WLANProfile>

在获取这一文件之后,我们借助netsh wlan del profile "<SSID名称>"清空原有配置文件并通过netsh wlan add profile="<文件位置>\WLAN-<SSID名称>.xml"将其导入进Windows,通过netsh wlan connect name="<SSID名称>"亦顺利出现了输入用户信息认证的窗口且完成认证进行联网。另外,在将SSID名称及其十六进制表达替换为其他AP的信息并通过上述指令导入系统后一样是可以完成链接的。
但是很不幸,虽然已经顺利导入了相关配置文件且可以正常连接,但是我目前还没有找到可以直接通过命令行对用户名和密码进行定义的指令,也就是说我们暂时还无法直接完全通过命令行进行802.1x认证Wifi的连接操作。

猜想

如果我们可以找到一个指令完全通过命令行进行802.1x认证Wifi的连接操作,那么我们是否可以通过C或Python编写一个程序,借由生成配置文件的方法并调用Windows指令以变相达成单个程序对全校各AP的通行认证程序呢?
如果读者有更好的思路欢迎和我联系共同探讨这一问题。

参考资料

Windows 10 802.1X Wireless Setup - UWSP威斯康星大学史蒂文斯分校
How to connect to a wifi in powershell knowing the SSID and password? - stackoverflow
Network Shell (Netsh) - Microsoft Docs