无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 6083|回复: 11
打印 上一主题 下一主题

[原创] PE下保存Wifi的方法(RAMOS很有用)

[复制链接]
跳转到指定楼层
1#
发表于 2015-8-15 01:02:25 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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 信号。
  1. _SUB DetectWiFiNetworks
  2.     EXEC* &&WNINFO=!netsh wlan show networks mode=bssid
  3.     SED &&WNINFO=0, : , :,%&WNINFO%
  4.     SET &SSIDN=
  5.     SET &SSID=
  6.     SET &AUTH=
  7.     SET &BSSIDN=
  8.     SET &BSSID=
  9.     SET &SIGNAL=
  10.     SET &WNS=
  11.     SET &State=SSID
  12.     FORX *NL &WNINFO,&&INFO,
  13.     {   MSTR &&P=<1>%&INFO%
  14.         FIND $%&State%=SSID,
  15.         {   FIND $%&P%=SSID,
  16.             {   MSTR &SSIDN=<2>%&INFO%
  17.                 MSTR -delims:: &SSID=<2>%&INFO%
  18.                 SET State=AUTH
  19.             }
  20.             EXIT CONTINUE
  21.         }
  22.         FIND $%&State%=AUTH,
  23.         {   FIND $%&P%=身份验证,
  24.             {   MSTR -delims:: &AUTH=<2->%&INFO%
  25.                 SET State=BSSID
  26.             }
  27.             EXIT CONTINUE
  28.         }
  29.         FIND $%&State%=BSSID,
  30.         {   FIND $%&P%=BSSID,
  31.             {   MSTR &BSSIDN=<2>%&INFO%
  32.                 MSTR -delims:: &BSSID=<2->%&INFO%
  33.                 SET State=SIGNAL
  34.             }
  35.             EXIT CONTINUE
  36.         }
  37.         FIND $%&State%=SIGNAL,
  38.         {   FIND $%&P%=信号,
  39.             {   MSTR -delims:: &SIGNAL=<2>%&INFO%
  40.                 FIND $%&WNS%<>,SET.< WNS=\n
  41.                 SET.< WNS=%&SSIDN%        %&SSID%        %&AUTH%        %&BSSIDN%        %&BSSID%        %&SIGNAL%
  42.                 SET State=MORE
  43.             }
  44.             EXIT CONTINUE
  45.         }
  46.         FIND $%&State%=MORE,
  47.         {   FIND $%&P%=SSID,
  48.             {   MSTR &SSIDN=<2>%&INFO%
  49.                 MSTR -delims:: &SSID=<2>%&INFO%
  50.                 SET State=AUTH
  51.                 EXIT CONTINUE
  52.             }
  53.             FIND $%&P%=BSSID,
  54.             {   MSTR &BSSIDN=<2>%&INFO%
  55.                 MSTR -delims:: &BSSID=<2->%&INFO%
  56.                 SET State=SIGNAL
  57.                 EXIT CONTINUE
  58.             }
  59.             EXIT CONTINUE
  60.         }
  61.     }
  62.     ENVI-ret %1=%&WNS%
  63.     _END
复制代码


2. 连接 wifi 的方法
连接 wifi 同样使用 netsh 命令:

netsh wlan add profile filename="xxxx.xml" //添加 wifi 配置到系统,这个配置文件里记录了 wifi 信号的 SSID 和 密码
netsh wlan connect name="TP-LINK_123456" //连接 wifi

  1. //用法:
  2. //  WiFiConnect &SSID &PSWD
  3. //  &SSID   -> 要连接的无线网络的SSID,传引用。
  4. //  &PSWD   -> 连接无线网络使用的密码,传引用。
  5. _SUB WiFiConnect
  6.     SET~ &SSID=%1
  7.     SET~ &PSWD=%2
  8.     SET &WXML=<?xml version="1.0"?>
  9.     SET.< WXML=\n<WLANProfile xmlns="http://www.microsoft.com/networking/WLAN/profile/v1">
  10.     SET.< WXML=\n        <name>%&SSID%</name>
  11.     SET.< WXML=\n        <SSIDConfig>
  12.     SET.< WXML=\n                <SSID>
  13.     SET.< WXML=\n                        <name>%&SSID%</name>
  14.     SET.< WXML=\n                </SSID>
  15.     SET.< WXML=\n        </SSIDConfig>
  16.     SET.< WXML=\n        <connectionType>ESS</connectionType>
  17.     SET.< WXML=\n        <connectionMode>auto</connectionMode>
  18.     SET.< WXML=\n        <autoSwitch>false</autoSwitch>
  19.     SET.< WXML=\n        <MSM>
  20.     SET.< WXML=\n                <security>
  21.     SET.< WXML=\n                        <authEncryption>
  22.     SET.< WXML=\n                                <authentication>WPA2PSK</authentication>
  23.     SET.< WXML=\n                                <encryption>AES</encryption>
  24.     SET.< WXML=\n                                <useOneX>false</useOneX>
  25.     SET.< WXML=\n                        </authEncryption>
  26.     SET.< WXML=\n                        <sharedKey>
  27.     SET.< WXML=\n                                <keyType>passPhrase</keyType>
  28.     SET.< WXML=\n                                <protected>false</protected>
  29.     SET.< WXML=\n                                <keyMaterial>%&PSWD%</keyMaterial>
  30.     SET.< WXML=\n                        </sharedKey>
  31.     SET.< WXML=\n                </security>
  32.     SET.< WXML=\n        </MSM>
  33.     SET.< WXML=\n</WLANProfile>
  34.     SET &WXF=%Temp%\WiFi.%&SSID%.xml
  35.     WRIT %&WXF%,$,%&WXML%
  36.     EXEC =!netsh wlan add profile filename="%&WXF%"
  37.     EXEC =!netsh wlan connect name="%&SSID%"
  38.     FILE %&WXF%
  39.     _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)

评分

参与人数 1无忧币 +5 收起 理由
yang77 + 5 新春快乐!

查看全部评分

2#
发表于 2015-8-15 06:17:48 | 只看该作者
过来支持下,谢谢分享
回复

使用道具 举报

3#
 楼主| 发表于 2015-8-15 06:24:27 | 只看该作者
本帖最后由 2010qaqz111 于 2015-8-15 07:59 编辑

占楼补充一下,脱离U盘的 RAMOS 系统可以用的一个方案:搜索硬盘上已有系统的 wifi 配置文件。

1. XP 系统的 wifi 信息
XP系统在注册表这个位置:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WZCSVC\Parameters\Interfaces\[网卡Guid]
里面的内容格式不清楚,这个路径虽然知道但是手头现在没有XP没法实际看一下,手边有环境的可以试试。
如果在里面能找到 SSID 和 密码 的话,也可以用上面的脚本来写入配置和进行连接。
只是如果密码是加密保护的话,可以试试把 xml 里的【<protected>false</protected>】这一行改成true,
如果 XP 保存在注册表的密码是加密的并且加密算法和 win7 之后一样的话就可以用。


2. Win7/8/8.1 系统的 wifi 信息
Win7/8/8.1 在这个位置(Win10 还没试过不知道是不是一样,太忙没有时间玩玩 Win10):
C:\ProgramData\Microsoft\Wlansvc\Profiles\Interfaces\[网卡Guid]\
这个目录下直接保存了配置的 xml 文件,直接用就可以了。

这个目录在 8PE 中也有,所以只是保存 wifi 信息的话,只要备份 X:\ 的这个目录中的 xml 就可以。
前面用 .reg 是因为连接工具需要取出密码显示到界面上,否则的话不用在注册表建立数据结构也可以的,但是就看不到密码了。



这种方法的缺点是硬盘上必须有系统存在,而且系统中要有 wifi 信息才可以。
XP 的话还麻烦点,要加载 XP 系统的注册表才行。

这一点需要注意,如果要维护的电脑涉及数据恢复的话,直接就地加载 XP 的注册表是不行的,
必须把注册表数据库拷贝到内存盘中加载,不然可能被生成的临时文件破坏要恢复的数据。

另外如果是脱离U盘的RAMOS并且机器上没有旧系统那就没啥好的办法了,只能手动保存一下 xml 到 U盘。
回复

使用道具 举报

4#
发表于 2015-8-15 06:35:20 来自手机 | 只看该作者
复杂度很大。
回复

使用道具 举报

5#
发表于 2015-8-15 06:35:23 来自手机 | 只看该作者
复杂度很大。

点评

是的,这个脚本是很早做的,现在来看确实复杂了, 主要是 UD 的存取部分太麻烦,当初调试这个也搞了很久, 如果是放在U盘可见区就没那么复杂了。 而且如果是 8PE 的话,只要在成功连接后备份好 xml 文件就行。  详情 回复 发表于 2015-8-15 08:17
回复

使用道具 举报

6#
 楼主| 发表于 2015-8-15 08:17:26 | 只看该作者

是的,这个脚本是很早做的,现在来看确实复杂了,
主要是 UD 的存取部分太麻烦,当初调试这个也搞了很久,
如果是放在U盘可见区就没那么复杂了。
而且如果是 8PE 的话,只要在成功连接后备份好 xml 文件就行。

至于界面上,如果不自己用 PECMD 做的话,就要考虑在什么时机保存 xml 的问题。
我记得 PECMD 好像有个关机事件,如果是顺利关机的话可以在关机事件中保存。
这样就完全不需要自己做界面,只要在 PECMD 的关机脚本保存一下就可以了。
然后启动的时候在加载网络驱动和服务之前从保存的位置恢复 xml 文件,
或者在加载网络驱动和服务之后用 netsh 命令导入一下就可以,
这样的话对 7PE/8PE 来说就很简单了。
回复

使用道具 举报

7#
发表于 2015-8-15 08:42:04 | 只看该作者
比较复杂
回复

使用道具 举报

8#
发表于 2015-8-15 11:16:38 | 只看该作者
很有想法啊!
回复

使用道具 举报

9#
发表于 2015-8-15 12:46:30 | 只看该作者
本帖最后由 mdyblog 于 2015-8-15 12:49 编辑

保存到 UD 区的代码有些麻烦,需要借助 fbinst.exe,而且不知道现在的 PECMD 版本是否已经有变化了,
具体代码就不贴了,有兴趣的可以在附件里看。
-------------------------
可以的。
如果是>=511字节, 最好保存在扩展区。
如果是 <=510 字节,都可以。
回复

使用道具 举报

10#
发表于 2015-8-15 15:28:15 | 只看该作者
谢谢楼主,能不能改一个简单直接拷到PEU盘上用的?
回复

使用道具 举报

11#
发表于 2015-8-15 18:25:04 | 只看该作者
看不懂,谢谢分享
回复

使用道具 举报

12#
发表于 2015-8-16 06:41:25 | 只看该作者
WIN10下,好像NETSH 那个没用, 最后会提示WLAN不是内部命令, 因此无法获得相关信息.

WIN10下,那个配置文件也在那个位置, 能否通过直接读取那个文件来实现?现在的太复杂了.

还有个就是有个软件,PENETWORK ,好像也能实现类似效果,不过我没找到相关资料,还得每次手工输入,确实麻烦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-6-16 19:41

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表