You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell:WinRE修改时保留BitLocker XTS-AES 128恢复密码

保留BitLocker XTS-AES 128卷原恢复密码的PowerShell解决方案

问题背景

我正在开发PowerShell脚本,用于临时禁用BitLocker、修改Windows恢复环境(WinRE)后重新启用BitLocker。由于WinRE修改需要完整的禁用/启用周期,无法使用Suspend-BitLocker。

当前脚本对使用TPM保护程序的BitLocker加密卷运行正常,但在处理现代Windows版本BitLocker GUI默认的XTS-AES 128加密卷时遇到问题:重新启用BitLocker时会生成新的恢复密码,脚本尝试备份并恢复RecoveryPassword类型保护程序,但无法还原原密码,导致用户存储的原密码失效。

目标是修改脚本,确保XTS-AES 128加密卷的原BitLocker恢复密码在禁用/启用周期中被保留并复用,而非生成新密码。

当前简化工作流程:

  • 备份现有BitLocker保护程序(含RecoveryPassword)
  • 禁用BitLocker/设备加密
  • 执行WinRE修改(需BitLocker关闭)
  • 启用设备加密
  • 启用BitLocker(恢复保护程序)
  • 尝试还原原保护程序(此处生成新恢复密码)
  • 重启

脚本具体问题:
在Backup-BitLockerProtectors函数中,通过manage-bde -protectors -get $osDrive和正则匹配提取RecoveryPassword并存储;在Restore-BitLockerProtectors函数中,使用Add-BitLockerKeyProtector -MountPoint $osDrive -RecoveryPasswordProtector -RecoveryPassword $p.RecoveryPassword尝试恢复,但即使传入备份的密码,仍无法重建原密码,反而生成新密码或导致恢复密码失效。


解决方案

1. 修正保护程序备份逻辑:捕获完整的恢复密码ID和密码值

仅提取RecoveryPassword是不够的,每个恢复保护程序都有唯一的ID,重新启用BitLocker时需要同时指定ID和密码才能复用原保护程序。修改备份逻辑,同时捕获ID和密码:

function Backup-BitLockerProtectors {
    param([string]$osDrive)
    $protectors = manage-bde -protectors -get $osDrive | Select-String -Pattern "Recovery Password:\s*(?<pwd>\d{6}-\d{6}-\d{6}-\d{6}-\d{6}-\d{6}-\d{6}-\d{6})|ID:\s*(?<id>\{[0-9A-F-]+\})" -AllMatches
    $recoveryProtectors = @()
    for ($i=0; $i -lt $protectors.Matches.Count; $i+=2) {
        $pwd = $protectors.Matches[$i].Groups['pwd'].Value
        $id = $protectors.Matches[$i+1].Groups['id'].Value
        $recoveryProtectors += [PSCustomObject]@{
            RecoveryPassword = $pwd
            Id = $id
        }
    }
    return $recoveryProtectors
}

2. 重新启用BitLocker时跳过自动生成恢复密码

启用设备加密后,不要直接调用默认的启用BitLocker命令,而是使用指定参数避免自动生成新恢复密码:

# 启用设备加密后,添加TPM保护程序(如果之前有),不要自动生成恢复密码
Enable-BitLocker -MountPoint $osDrive -TpmProtector

3. 还原原恢复密码保护程序的正确方法

使用Add-BitLockerKeyProtector时,需要结合-RecoveryPassword和-KeyProtectorId参数,同时指定原ID和密码,才能复用原保护程序:

function Restore-BitLockerProtectors {
    param([string]$osDrive, [array]$savedProtectors)
    # 先移除自动生成的新恢复保护程序(如果有)
    $currentProtectors = Get-BitLockerVolume -MountPoint $osDrive | Select-Object -ExpandProperty KeyProtectors
    foreach ($protector in $currentProtectors) {
        if ($protector.KeyProtectorType -eq 'RecoveryPassword') {
            Remove-BitLockerKeyProtector -MountPoint $osDrive -KeyProtectorId $protector.KeyProtectorId -Confirm:$false
        }
    }
    # 添加原恢复密码保护程序
    foreach ($p in $savedProtectors) {
        Add-BitLockerKeyProtector -MountPoint $osDrive -RecoveryPasswordProtector -RecoveryPassword $p.RecoveryPassword -KeyProtectorId $p.Id
    }
}

4. 验证XTS-AES卷的兼容性

确保脚本在启用BitLocker时显式指定加密算法,避免系统默认选择不一致:

Enable-BitLocker -MountPoint $osDrive -TpmProtector -EncryptionMethod XtsAes128

关键说明

  • 恢复密码保护程序的ID是关联原密码的核心标识,仅传入密码会让系统生成新的ID,导致原密码失效
  • 重新启用BitLocker时必须先移除自动生成的恢复保护程序,再添加原保护程序
  • XTS-AES卷的保护程序逻辑与AES卷一致,问题出在备份/还原时的参数缺失,而非加密算法本身

内容的提问来源于stack exchange,提问作者Ganesh Kamath - 'Code Frenzy'

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 08:12:40