
# 场景描述
-
用户电脑在启用
bitlocker的情况下,winpe下重装系统无法格式系统分区,需要先解锁bitlocker后重启再进入winpe操作 -
部分用户对
BIOS设置不熟悉,无法自己设置从网络引导winpe,需要创建一个程序或脚本,让用户双击运行实现自动重启后从网络加载winpe
# 思路
解锁 bitlocker 这个问题相对简单,但是如何让电脑重启并从网络引导这步我不知道如何实现,用户电脑大部分是双网卡的,正常手动从网络启动都要选中对应的网卡才能正常从网络加载 winpe , 这个程序或脚本要如何判断从哪个网卡引导?
ivanti 的操作部署模板中有个 vboot 的功能,这个功能刚好可以满足用户的需求,但是这个功能是需要在客户端上安装 ivanti 的代理才能实现,用户这边已经明确了客户端不会安装 ivanti 的代理,所以这条路走不通

我在官网上搜索过 vboot 这个关键字,并没有找到相关文档描述该功能的具体介绍和实现方法,无奈只好另辟他路
这个问题困扰了我很久,直到今天我的一台 windows 虚拟机系统盘满了,我又不想重装系统,我就想简单的扩展虚拟机磁盘,我在虚拟机中将这个系统盘从 60G 扩展到了 150G, 想着通过扩展卷的方式扩展即可
没想到磁盘末尾有个恢复分区,导致无法直接扩展后面加进来的 90G 空间

于是我下载了傲梅分区助手,打算用该工具给系统盘进行扩展

提交后提示需要进入 WinPE 模式下操作

点击确定后,提示程序正在创建 WinPE

进度条完成后系统自动重启进入 WinPE , 执行后续的分区合并操作


我惊了,这个不就是我想要的功能吗!!!
傲梅一下就打开了我的思路,我非常确定傲梅是在本地创建了 WinPE 镜像文件,并通过重启引导进入 WinPE ,既然无法从网卡引导,那从本地引导也不是不行
我虽然不知道如何从本地引导镜像文件,但是我知道要从本地引导,就必须添加 BCD 启动项,傲梅肯定也是这样实现的,于是我从网上下载了 bootice 这个小工具,查看系统当前 BCD 文件,成功验证了自己的猜想


可以看到傲梅添加的 BCD 启动项和参数,剩下的就简单了
# 脚本实现
# 禁用 bitlocker | |
$encryptionStatus = (Get-BitLockerVolume).ProtectionStatus | |
if ($encryptionStatus -eq 'On') { | |
manage-bde.exe -protectors -disable c: -rebootcount 0 | |
} | |
# 正则匹配 ID | |
$IDPattern = '\{([A-Fa-f0-9-]+)\}' | |
$output1 = bcdedit /create /device | |
$deviceID = [regex]::Match($output1, $IDPattern).Groups[0].Value | |
$output2 = bcdedit /create /d "ivanti winpe" /application OSLOADER | |
$ApplicationID = [regex]::Match($output2, $IDPattern).Groups[0].Value | |
# winpe 文件路径 | |
$device = "D:" | |
$SDIPath = "\winpe\Boot\boot.sdi" | |
$WIMPath = "\winpe\Boot\boot_x64.wim" | |
# 添加启动项 | |
bcdedit /set $deviceID ramdisksdidevice partition=$device | |
bcdedit /set $deviceID ramdisksdipath $SDIPath | |
bcdedit /set $ApplicationID device ramdisk=[$device]$WIMPath,$deviceID | |
bcdedit /set $ApplicationID path \windows\system32\boot\winload.efi | |
bcdedit /set $ApplicationID osdevice ramdisk=[$device]$WIMPath,$deviceID | |
bcdedit /set $ApplicationID systemroot \windows | |
bcdedit /set $ApplicationID winpe yes | |
bcdedit /set $ApplicationID detecthal yes | |
bcdedit /bootsequence $ApplicationID | |
# 重启计算机 | |
Restart-Computer -Force |