
自制 Windows PE(二):为 PE 添加桌面

上次我们介绍了基础的 Windows PE 制作,也介绍了一般的自定义流程。不过这样做出来的 PE 界面那是一个非常简陋,而且功能也不怎么多,今天我们就来解决这几个问题。
(是的,我依然没有好的封面图用了)
添加功能包
这个操作依然还是在官方支持的操作里面的,核心就是在挂载映像之后用 dism 添加 .cab 格式的功能包。
可用的包都在 Windows ADK 安装目录下的 Assessment and Deployment Kit\Windows Preinstallation Environment 文件夹里。里面有四个子文件夹,每个子文件夹对应一种架构。
点开其中一个(例如我们要使用的 amd64 架构),可以看到一个 WinPE_OCs 文件夹,里面就放着我们可以安装的包。
那一大堆文件夹里面放着相对应的语言支持包,剩下的就是各种功能包。具体的介绍可以看微软官方给出的文档。
添加的语法也很简单,首先还是挂载映像(忘记的请参考上一篇文章),然后输入:
dism /Add-Package /Image:C:\WinPE\mount /PackagePath:<要安装的包>
还是一样,如果你的挂载路径跟我不一样,请把 /Image
参数后面的路径改掉。
有一些包会有依赖关系,这种情况需要先安装依赖的那个包,例如 WinPE-PowerShell 包必须在 WinPE-Scripting 包之后安装。
这一块没什么好说的,毕竟是官方的东西,咱也玩不出什么花头来。
用 PECMD 替代 winpeshl
PECMD(全名 Windows PE Commander)是一款功能非常强大的实用工具,目前你在网上能下到的 PE 里面几乎都有这个东西。
但是有一点很遗憾,PECMD 的官网是一个网易博客的地址,目前已经打不开了…
目前就这个网站看着还靠谱一点:PECMD 技术社区,毕竟是个论坛,肯定比什么 XX 软件园要好得多。
注意 PECMD 主程序 Windows Defender 100% 报毒,是误报,而且很难选择忽略,因此建议下载一个火绒把 Windows Defender 挤掉。
下载好之后,把整个程序都拷进 \Windows\System32\ 文件夹里。
接下来需要替换系统启动时执行的程序为 PECMD 而不是 winpeshl。
首先打开注册表编辑器,选择文件>加载配置单元。
打开 \Windows\System32\config\SYSTEM 这个文件,名字随意取,比如说 111。
然后找到 Setup,编辑 CmdLine 的值为:
PECMD.exe MAIN X:\Windows\System32\PECMD.INI
如下图:
然后选择文件>卸载配置单元。如果无法选中,则需要先选中刚刚我们加载时创建的那个项(在这张图里是“111”)再选择。
接下来编写 PECMD.INI 文件,位置就放在 \Windows\System32\ 下面。
现在我们还没有添加什么有用的东西,因此写一个最为简单的配置:
INIT U
DISP
EXEC X:\Windows\System32\cmd.exe
然后卸载映像,创建 ISO,启动时如果看到命令提示符则代表一起正常。
添加图形界面
相信这个是很多希望使用 WinPE 维护的小伙伴们的刚需,没有图形界面,只能拿 notepad 的保存界面凑合着用,想想就难受……
目前向 Windows PE 添加图形界面有两条路,一条是直接添加原生的 explorer.exe,还有一条是采用第三方的替代品。由于官方的 explorer.exe 依赖项较多,且在 PE 下依赖诸如 StartIsBack 这样的程序显示开始菜单,难度较大。(我在尝试的时候蓝屏了。嗯,对,蓝屏了。)
所以我们就当第三方程序比较好用好了,不要觉得是我水平太菜介绍不了原生 explorer()
第三方程序可选择的内容就多了,基本上,只要带有图形界面的有点文件管理功能的程序都可以拿来用。不过如果是想添加桌面的话,那么选择就很少了。
经过我实际测试下来,bsexplorer 由于年久失修,已经不能在我们这次采用的 PE 版本下运行。这里我们选用 WinXShell。
把 WinXShell 程序本体放置在一个你记得住的位置,例如 \Program Files\WinXShell。
我把 x64 版本的程序复制了一份,改名成 WinXShell.exe,这样方便记忆和输入,如下图:
接下来我们需要让 WinXShell 在开机时自动启动成为外壳程序,用来显示我们的桌面。
方法也很简单,不过下面的方法假设你已经用 PECMD 接管了系统,如果没有的话,请参考上面的内容,或者也可以尝试使用 winpeshl.ini 与 startnet.cmd。
把 PECMD.INI 改成下面的内容:
INIT U
SHOW -check -1:-1
RECY *:\,0
NUMK 0
ENVI USERPROFILE=X:\Users\Default
DISP
SHEL X:\Program Files\WinXShell\WinXShell.exe
其中 SHEL
后面就是 WinXShell 所在位置。这个命令和 EXEC
基本是一样的,都可以打开程序,不过 SHEL
启动的程序会在被关闭后由 PECMD 重新启动。
ENVI
是用来设置环境变量的,虽然这个命令在我这里似乎没有生效,很奇怪。
RECY
用来设置回收站大小,这里是直接把所有盘符的回收站大小设置成 0,也就是彻底关闭回收站,删除文件的时候直接删除。
DISP
这一行可以使 PE 的分辨率变成原生分辨率/最大分辨率。
这一切都做好之后,还需要修改两个注册表值。
还是一样,加载配置单元,首先打开的是 SOFTWARE 文件,找到 Microsoft\Windows\CurrentVersion\Policies\System,把 EnableCursorSuppression 改成 0。
然后打开 DEFAULT 文件,找到 Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced,正常情况下应该是没有最后那两个项的,请自行创建。创建完之后在 Advanced 里面新建两个 DWORD,一个是 Hidden,设置为 1,显示隐藏文件,另一个是 HideFileExt,设置为 0,显示文件扩展名。
干完之后卸载配置单元,然后卸载映像,重新生成 ISO。
这一次启动,应该就能看见桌面了。
添加应用
基本的应用添加很简单,只需要把应用拷进挂载的映像里面然后提交就行了,当然,前提是你用的是便携版(也就是所谓“绿色版”)的软件,不需要安装的那种,否则容易出现问题。
不过这样一来,我们就依然需要使用命令行来启动应用。
那我要桌面干啥?
好在往开始菜单和桌面上添加图标也不难,本质上它们就是一堆快捷方式,我们可以用 PECMD 来创建这些内容,也可以选择把快捷方式固化在映像里面。不过要注意的是,如果选择固化快捷方式,那么设置路径的时候需要使用环境变量(例如 %SystemDrive%),而不能直接指定盘符。因为 WinPE 下的系统盘是 X:\,在普通 Windows 下会因为找不到路径而不给你创建。
用 PECMD 则需要使用 LINK
命令。
不过首先,我们需要修改默认用户文件夹所在的位置,PE 下默认在 X:\Windows\System32\config\systemprofile 这里,但是这个位置会有一些副作用,比如说默认不包含 Desktop 文件夹、不显示此电脑图标等等问题。
我们需要先加载 SOFTWARE 这个配置单元,在 \Windows\System32\config\ 这个文件夹下,然后修改 Microsoft\Windows NT\CurrentVersion\ProfileList\S-1-5-18 下面的几个值(如果没有就创建):
- Flags 修改为 DWORD 值 c
- ProfileImagePath 修改为字符串值 X:\Users\Default
- RefCount 修改为 DWORD 值 1
- Sid 修改为二进制值 01 01 00 00 00 00 00 05 12 00 00 00
- State 修改为 DWORD 值 0
接下来就可以开始创建快捷方式了,我们这里选取 PECMD 的 LINK
命令,语法为:
LINK [!]<快捷方式路径>,<目标路径>,[运行参数],[图标路径[#图标索引]],[目标备注],[起始位置]
其中 ! 代表启动应用时是最小化的状态。剩下的几个参数,跟 Windows 下的那些快捷方式配置是一样的,这里不再过多介绍。
比如我们可以添加:
LINK X:\Users\Default\Desktop\记事本,X:\Windows\notepad.exe
LINK X:\ProgramData\Microsoft\Windows\Start Menu\Programs\记事本,X:\Windows\notepad.exe
其中第一行是往桌面上添加图标,第二行是往开始菜单里面添加。
这样启动 PE 后,就可以在桌面和开始菜单里面看到记事本。另外需要注意,我们这个 PE 的记事本就是没有图标的,虽然很奇怪,但是也能理解,如果你非常想要一个图标的话,可以从你当前系统拷一个记事本进去,最好是当成图标指定,防止出现问题。
把所有你要的软件图标都添加完后,最终的效果类似这样:
(左:开始菜单 右:桌面)
是不是有感觉了?
总结
这一次我们成功的使用 PECMD 接管了 PE 的启动进程,同时向我们的 PE 添加了一个简单的桌面。
下一次将介绍如何在 WinPE 中实现基本的网络支持。