upload successful

# 场景描述

  1. 用户电脑在启用 bitlocker 的情况下, winpe 下重装系统无法格式系统分区,需要先解锁 bitlocker 后重启再进入 winpe 操作

  2. 部分用户对 BIOS 设置不熟悉,无法自己设置从网络引导 winpe ,需要创建一个程序或脚本,让用户双击运行实现自动重启后从网络加载 winpe

# 思路

解锁 bitlocker 这个问题相对简单,但是如何让电脑重启并从网络引导这步我不知道如何实现,用户电脑大部分是双网卡的,正常手动从网络启动都要选中对应的网卡才能正常从网络加载 winpe , 这个程序或脚本要如何判断从哪个网卡引导?

ivanti 的操作部署模板中有个 vboot 的功能,这个功能刚好可以满足用户的需求,但是这个功能是需要在客户端上安装 ivanti 的代理才能实现,用户这边已经明确了客户端不会安装 ivanti 的代理,所以这条路走不通

upload successful

我在官网上搜索过 vboot 这个关键字,并没有找到相关文档描述该功能的具体介绍和实现方法,无奈只好另辟他路

这个问题困扰了我很久,直到今天我的一台 windows 虚拟机系统盘满了,我又不想重装系统,我就想简单的扩展虚拟机磁盘,我在虚拟机中将这个系统盘从 60G 扩展到了 150G, 想着通过扩展卷的方式扩展即可

没想到磁盘末尾有个恢复分区,导致无法直接扩展后面加进来的 90G 空间

upload successful

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

upload successful

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

upload successful

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

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

upload successful

我惊了,这个不就是我想要的功能吗!!!

傲梅一下就打开了我的思路,我非常确定傲梅是在本地创建了 WinPE 镜像文件,并通过重启引导进入 WinPE ,既然无法从网卡引导,那从本地引导也不是不行

我虽然不知道如何从本地引导镜像文件,但是我知道要从本地引导,就必须添加 BCD 启动项,傲梅肯定也是这样实现的,于是我从网上下载了 bootice 这个小工具,查看系统当前 DCD 文件,成功验证了自己的猜想

upload successful

upload successful
可以看到傲梅添加的 BCD 启动项和参数,剩下的就简单了

# 脚本实现

l
# 禁用 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
$startID = [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 $startID device ramdisk=[$device]$WIMPath,$deviceID
bcdedit /set $startID path \windows\system32\boot\winload.efi
bcdedit /set $startID osdevice ramdisk=[$device]$WIMPath,$deviceID
bcdedit /set $startID systemroot \windows
bcdedit /set $startID winpe yes
bcdedit /set $startID detecthal yes
bcdedit /bootsequence $startID
# 重启计算机
Restart-Computer -Force