|
本帖最后由 2010qaqz111 于 2015-8-15 08:25 编辑
这个脚本是很久以前折腾了自己用的,主要目的是装在硬盘里的PE里用,我自己已经用了很久。
现在工作忙没时间折腾了,PECMD 的命令语法差不多忘个干净,以前写的脚本现在自己都看不懂了 囧rz
工作原理:
1. 检测Wifi的方法
检测 wifi 信号主要依靠这个控制台命令的输出: netsh wlan show networks mode=bssid
如果在PE的控制台下执行这个命令的话,可能会跳一堆框出来告诉你没有找到 xxx.dll 文件啥的,
这个可以不用管,直接点掉就是。只要网络相关的服务和网卡驱动已经正常加载成功了就可以:
从这个命令的输出得到可用的 wifi 列表,包括 SSID,BSSID。
需要注意的是,图中有一个没有 SSID 的 wifi 信号,这个在网络连接的侧面板中显示为“隐藏网络”,有可能是被隐藏了 SSID 广播的 wifi 信号。
- _SUB DetectWiFiNetworks
- EXEC* &&WNINFO=!netsh wlan show networks mode=bssid
- SED &&WNINFO=0, : , :,%&WNINFO%
- SET &SSIDN=
- SET &SSID=
- SET &AUTH=
- SET &BSSIDN=
- SET &BSSID=
- SET &SIGNAL=
- SET &WNS=
- SET &State=SSID
- FORX *NL &WNINFO,&&INFO,
- { MSTR &&P=<1>%&INFO%
- FIND $%&State%=SSID,
- { FIND $%&P%=SSID,
- { MSTR &SSIDN=<2>%&INFO%
- MSTR -delims:: &SSID=<2>%&INFO%
- SET State=AUTH
- }
- EXIT CONTINUE
- }
- FIND $%&State%=AUTH,
- { FIND $%&P%=身份验证,
- { MSTR -delims:: &AUTH=<2->%&INFO%
- SET State=BSSID
- }
- EXIT CONTINUE
- }
- FIND $%&State%=BSSID,
- { FIND $%&P%=BSSID,
- { MSTR &BSSIDN=<2>%&INFO%
- MSTR -delims:: &BSSID=<2->%&INFO%
- SET State=SIGNAL
- }
- EXIT CONTINUE
- }
- FIND $%&State%=SIGNAL,
- { FIND $%&P%=信号,
- { MSTR -delims:: &SIGNAL=<2>%&INFO%
- FIND $%&WNS%<>,SET.< WNS=\n
- SET.< WNS=%&SSIDN% %&SSID% %&AUTH% %&BSSIDN% %&BSSID% %&SIGNAL%
- SET State=MORE
- }
- EXIT CONTINUE
- }
- FIND $%&State%=MORE,
- { FIND $%&P%=SSID,
- { MSTR &SSIDN=<2>%&INFO%
- MSTR -delims:: &SSID=<2>%&INFO%
- SET State=AUTH
- EXIT CONTINUE
- }
- FIND $%&P%=BSSID,
- { MSTR &BSSIDN=<2>%&INFO%
- MSTR -delims:: &BSSID=<2->%&INFO%
- SET State=SIGNAL
- EXIT CONTINUE
- }
- EXIT CONTINUE
- }
- }
- ENVI-ret %1=%&WNS%
- _END
复制代码
2. 连接 wifi 的方法
连接 wifi 同样使用 netsh 命令:
netsh wlan add profile filename="xxxx.xml" //添加 wifi 配置到系统,这个配置文件里记录了 wifi 信号的 SSID 和 密码
netsh wlan connect name="TP-LINK_123456" //连接 wifi
- //用法:
- // WiFiConnect &SSID &PSWD
- // &SSID -> 要连接的无线网络的SSID,传引用。
- // &PSWD -> 连接无线网络使用的密码,传引用。
- _SUB WiFiConnect
- SET~ &SSID=%1
- SET~ &PSWD=%2
- SET &WXML=<?xml version="1.0"?>
- SET.< WXML=\n<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
- SET.< WXML=\n <name>%&SSID%</name>
- SET.< WXML=\n <SSIDConfig>
- SET.< WXML=\n <SSID>
- SET.< WXML=\n <name>%&SSID%</name>
- SET.< WXML=\n </SSID>
- SET.< WXML=\n </SSIDConfig>
- SET.< WXML=\n <connectionType>ESS</connectionType>
- SET.< WXML=\n <connectionMode>auto</connectionMode>
- SET.< WXML=\n <autoSwitch>false</autoSwitch>
- SET.< WXML=\n <MSM>
- SET.< WXML=\n <security>
- SET.< WXML=\n <authEncryption>
- SET.< WXML=\n <authentication>WPA2PSK</authentication>
- SET.< WXML=\n <encryption>AES</encryption>
- SET.< WXML=\n <useOneX>false</useOneX>
- SET.< WXML=\n </authEncryption>
- SET.< WXML=\n <sharedKey>
- SET.< WXML=\n <keyType>passPhrase</keyType>
- SET.< WXML=\n <protected>false</protected>
- SET.< WXML=\n <keyMaterial>%&PSWD%</keyMaterial>
- SET.< WXML=\n </sharedKey>
- SET.< WXML=\n </security>
- SET.< WXML=\n </MSM>
- SET.< WXML=\n</WLANProfile>
- SET &WXF=%Temp%\WiFi.%&SSID%.xml
- WRIT %&WXF%,$,%&WXML%
- EXEC =!netsh wlan add profile filename="%&WXF%"
- EXEC =!netsh wlan connect name="%&SSID%"
- FILE %&WXF%
- _END
复制代码
3. 开机自动连接 wifi
这个是用 PECMD 在开机加载的时候执行的,需要注意的是这个步骤必须放在网卡驱动和网络服务加载成功之后执行。
4. 保存 wifi 信息
保存 wifi 信息分两部分:
一处是在运行中的系统里保存,这是 PE 运行的时候这个连接工具使用的数据结构。
我用的是注册表,因为有 API 可以用。当然也可以用文件,不过用 PECMD 写代码来自己解析会很麻烦就是了。
另一处就是保存在 UD 区或者高隐区。
我是用的 UD 区保存上面那个注册表结构导出的 reg 文件,然后在开机的时候自动加载。
这样只要连接过一次的 wifi,下次用这块U盘启动的话就会自动连接了。
保存到 UD 区的代码有些麻烦,需要借助 fbinst.exe,而且不知道现在的 PECMD 版本是否已经有变化了,
具体代码就不贴了,有兴趣的可以在附件里看。
5. 已知的问题
脚本当初编写和调试的时候处理了桥接AP的情况,这个现象在工具的列表里显示出来就是两个相同 SSID 的 wifi 信号,
但是它们基站号和 BSSID 不一样。这种情况下的连接一般来说是没有问题的,因为它们用的是同一套 SSID 和 密码。
不过我没有在很多地方测试过,所以如果处理这部分的逻辑不做修改的话,使用的时候请留心。
另外一个问题就是“隐藏网络”的 wifi 信号,当初编写脚本的时候没有遇到,所以也没测试,工具处理这个情况会有点问题。
表现是点了列表里没有 SSID 的 wifi 信号后,下面的密码会显示成另外某个 wifi 信号的 SSID,连接的时候大概也连接不了,
因为 netsh 的配置文件是根据 SSID 来连接的而不是 BSSID。这个 BUG 以后有空了再来修正吧。
注册表里用到的 SSID 和 密码 都是明文保存的,所以写到 UD区或高隐FAT区的 .reg 里面也是明文,
对安全性很敏感的同学可以自己尝试编写一个可逆的编解码过程,应该不是很难。
6. 关于附件里脚本
附件里上传了用到的脚本,因为不知道现在的 PECMD 又出现了哪些改动,
所以附件里上传了当时用到的 PECMD.exe(32位版的)和 fbinst.exe。
这个工具是当时折腾在硬盘上用的 PE 编写的,跟各位的实际需求可能不一样,
比如保存 Wifi.reg 到 UD 区的哪个路径之类的,所以脚本不一定下载了不做任何改动就能用。
脚本里有一些过程是用来从 UD 区加载并执行 PECMD 脚本、从 UD 区加载三卡驱动等等用的,
不是全都和这个工具有关的过程。
工具的关键部分其实就是检测 wifi 信号、连接 wifi,其他的部分如对注册表的读写、保存文件到 UD 区等,
现在可能会有更好的方法实现,有能力的同学可以自己编写。
另外关于保存 Wifi.reg,因为现在很多用高隐区做 UEFI 启动的方式,
所以更好的方案其实是想办法保存到这个 FAT 区,而不是在 UD 区。
对了差点忘了,这个工具当时编写和测试都是用的 32位 Win8PE,应该是基于当时佛爷发布的那个改的。
这个脚本因为是很早做的,因为各种原因弄得很复杂。
在 7PE/8PE 下其实有更简单的方案,请参考 #3 和 #6 的信息。
WiFi-PE.rar
(493.71 KB, 下载次数: 158)
|
评分
-
查看全部评分
|