BitLocker 恢复指南

适用于:

  • Windows 10
  • Windows 11
  • Windows Server 2016 和更高版本

本文介绍如何从 AD DS 恢复 BitLocker 密钥。

组织可以使用保存在 Active Directory 域服务 (AD DS) 中的 BitLocker 恢复信息来访问受 BitLocker 保护的数据。 建议在规划 BitLocker 部署时为 BitLocker 创建恢复模型。

本文假定你了解如何设置 AD DS 以自动备份 BitLocker 恢复信息,以及将哪些类型的恢复信息保存到 AD DS。

本文不详细介绍如何将 AD DS 配置为存储 BitLocker 恢复信息。

什么是 BitLocker 恢复?

BitLocker 恢复是指在无法正常解锁驱动器时还原对受 BitLocker 保护的驱动器的访问的过程。 在恢复方案中,可以使用以下选项还原对驱动器的访问:

  • 用户可以提供恢复密码。 如果你的组织允许用户打印或存储恢复密码,用户可以键入他们打印或存储在 USB 驱动器或 Microsoft 帐户联机的 48 位恢复密码。 (仅当 BitLocker 在不是域) 成员的电脑上使用时,才允许使用 Microsoft 帐户联机保存恢复密码。
  • 数据恢复代理可以使用其凭据解锁驱动器。 如果驱动器是操作系统驱动器,则必须将驱动器装载为另一台计算机的数据驱动器,数据恢复代理才能解锁它。
  • 域管理员可以从 AD DS 获取恢复密码,并使用它解锁驱动器。 建议将恢复密码存储在 AD DS 中,以便 IT 专业人员能够根据需要获取其组织中驱动器的恢复密码。 此方法要求你在 BitLocker 组策略设置中启用此恢复方法,选择如何在“本地组策略编辑器”中恢复受 BitLocker 保护的操作系统驱动器。在计算机配置\管理模板\Windows 组件\BitLocker 驱动器加密\操作系统驱动器中。 有关详细信息,请参阅 BitLocker 组策略设置

是什么导致 BitLocker 恢复?

以下列表提供了在尝试启动操作系统驱动器时将导致 BitLocker 进入恢复模式的特定事件示例:

  • 在使用 BitLocker 驱动器加密的电脑上,或在仅使用 BitLocker 设备加密的平板电脑或手机上,当检测到攻击时,设备将立即重新启动并进入 BitLocker 恢复模式。 若要利用此功能,管理员可以设置“交互式登录:计算机帐户锁定阈值”组策略设置,该设置位于本地组策略编辑器的“\计算机配置\Windows 设置\安全设置\本地策略\安全选项”中。 或者,他们可以使用 Exchange ActiveSyncMaxFailedPasswordAttempts 策略(也可以通过 Microsoft Intune 配置)来限制设备进入设备锁定之前失败的密码尝试次数。

  • 在具有 TPM 1.2 的设备上,更改 BIOS 或固件启动设备顺序会导致 BitLocker 恢复。 但是,在这种情况下,具有 TPM 2.0 的设备不会启动 BitLocker 恢复。 TPM 2.0 不会将启动设备顺序的固件更改视为安全威胁,因为操作系统启动加载程序未受到威胁。

  • 在 BIOS 启动顺序中将 CD 或 DVD 驱动器置于硬盘驱动器之前,然后插入或取出 CD 或 DVD。

  • 在从硬盘驱动器启动之前无法从网络驱动器启动。

  • 停靠或取消停靠便携式计算机。 在某些情况下(取决于计算机制造商和 BIOS),便携式计算机的停靠条件是系统度量的一部分,必须保持一致才能验证系统状态并解锁 BitLocker。 因此,如果便携式计算机在 BitLocker 打开时连接到其扩展坞,那么它可能还需要在解锁时连接到扩展坞。 相反,如果便携式计算机在 BitLocker 打开时未连接到其扩展坞,则它可能需要在解锁时与扩展坞断开连接。

  • 对磁盘上的 NTFS 分区表进行更改,包括创建、删除或调整主分区的大小。

  • 个人标识号 (PIN) 输入错误次数过多,导致 TPM 的反攻击逻辑被激活。 反攻击逻辑是一种软件或硬件方法,通过在特定时间过去之前不接受 PIN 输入来增加对 PIN 进行暴力攻击的难度和成本。

  • 如果使用的是基于 USB 的密钥而不是 TPM,请关闭在预启动环境中从 BIOS 或 UEFI 固件读取 USB 设备的支持。

  • 关闭、禁用、停用或清除 TPM。

  • 升级关键的早期启动组件(如 BIOS 或 UEFI 固件升级),导致相关启动度量更改。

  • 启用 PIN 身份验证时忘记 PIN。

  • 更新选项 ROM 固件。

  • 升级 TPM 固件。

  • 添加或删除硬件;例如,将一张新卡(包括一些 PCMIA 无线卡)插入计算机。

  • 删除、插入或完全耗尽便携式计算机智能电池上的电量。

  • 更改磁盘上的主启动记录。

  • 更改磁盘上的引导管理器。

  • 从操作系统隐藏 TPM。 某些 BIOS 或 UEFI 设置可用于阻止将 TPM 枚举到操作系统。 如果实现此选项,则会使 TPM 在操作系统中隐藏。 隐藏 TPM 时,BIOS 和 UEFI 安全启动将被禁用,并且 TPM 不会响应任何软件中的命令。

  • 使用未正确输入 PIN 或键盘映射与预启动环境假定的键盘映射不匹配的其他键盘。 此问题可能会阻止输入增强的 PIN。

  • 修改 TPM 验证配置文件使用的平台配置注册表 (PCR)。 例如,包括 PCR[1] 将导致 BitLocker 测量对 BIOS 设置的大多数更改,从而导致 BitLocker 进入恢复模式,即使在非启动关键 BIOS 设置发生更改时也是如此。

    备注

    某些计算机的 BIOS 设置会跳过对某些 PCR(例如 PCR[2])的度量。 在 BIOS 中更改此设置会导致 BitLocker 进入恢复模式,因为 PCR 度量会有所不同。

  • 将 BitLocker 保护的驱动器移动到新的计算机。

  • 将主板升级到具有新 TPM 的新主板。

  • 在启用启动密钥身份验证后,丢失包含启动密钥的 U 盘。

  • TPM 自测试失败。

  • 具有不符合客户端计算机的相关受信任计算组标准的 BIOS、UEFI 固件或可选 ROM 组件。 例如,不合规的实现可能会在 TPM 度量中记录易失性数据(例如时间),导致每次启动时度量不同,并导致 BitLocker 在恢复模式下启动。

  • 将 TPM 的存储根密钥的使用授权更改为非零值。

    备注

    BitLocker TPM 初始化过程将使用率授权值设置为零,因此其他用户或进程必须显式更改此值。

  • 在 Windows 引导管理器 (Bootmgr) 上禁用代码完整性检查或启用测试签名。

  • 在启动过程中按 F8 或 F10 键。

  • 添加或移除附加卡(例如视频卡或网卡),或升级附加卡上的固件。

  • 在启动过程中使用 BIOS 热键将引导顺序更改为硬盘驱动器外的其他内容。

备注

在开始恢复之前,建议确定导致恢复的原因。 这可能有助于防止将来再次出现问题。 例如,如果确定攻击者通过物理访问修改了计算机,则可以创建新的安全策略来跟踪哪些人具有物理状态。 使用恢复密码恢复对电脑的访问权限后,BitLocker 会将加密密钥重新密封到测量组件的当前值。

对于规划的方案(如已知硬件或固件升级)来说,可以通过临时暂停 BitLocker 保护来避免启动恢复。 由于暂停 BitLocker 会使驱动器完全加密,因此管理员可以在计划任务完成后快速恢复 BitLocker 保护。 使用暂停和恢复还会重新封装加密密钥,而无需输入恢复密钥。

备注

如果暂停,BitLocker 将在电脑重新启动时自动恢复保护,除非使用 manage-bde 命令行工具指定重新启动计数。

如果软件维护要求重启计算机,并且你使用的是双重身份验证,则可以在计算机没有本地用户提供附加身份验证方法时启用 BitLocker 网络解锁功能,以提供辅助身份验证因子。

恢复在计划外或非预期行为的上下文中进行了描述,但你也可以将恢复作为预期生产方案,以便管理访问控制。 例如,将台式机或笔记本电脑重新部署到企业中的其他部门或员工时,可以在将计算机提供给新用户之前强制 BitLocker 恢复。

测试恢复

在创建全面的 BitLocker 恢复过程之前,建议你测试恢复过程对最终用户(致电支持人员获取恢复密码的人员)和管理员(帮助最终用户获取恢复密码的人员)的工作方式。 manage-bde 的 -forcerecovery 命令是一种在用户遇到恢复情况之前逐步执行恢复过程的简单方法。

若要强制恢复本地计算机,请执行以下操作:

  1. 选择 “开始” 按钮,在 “开始搜索”框中键入 cmd,然后选择并按住cmd.exe,然后选择 “以管理员身份运行”。

  2. 在命令提示符处键入以下命令,然后按 Enter

    manage-bde -forcerecovery <BitLockerVolume>

若要强制恢复远程计算机,请执行以下操作:

  1. 在“开始”屏幕上,键入 cmd.exe,然后选择“以管理员身份运行”。

  2. 在命令提示符处键入以下命令,然后按 Enter

    manage-bde -ComputerName <RemoteComputerName> -forcerecovery <BitLockerVolume>

    备注

    -forcerecovery 触发的恢复会持续多次重启,直到添加 TPM 保护程序或用户暂停保护。 使用新式待机设备(如 Surface 设备)时,不建议使用 -forcerecovery 选项,因为必须从 WinRE 环境中手动解锁和禁用 BitLocker,然后操作系统才能再次启动。 有关详细信息,请参阅 BitLocker 故障排除:在平板电脑设备上使用 BitLocker 恢复进行连续重新启动循环

规划恢复过程

在规划 BitLocker 恢复过程时,请首先查阅组织恢复敏感信息的当前最佳做法。 例如:企业如何处理丢失的 Windows 密码? 组织如何执行智能卡 PIN 重置? 可以使用这些最佳做法和相关资源(人员和工具)来帮助制定 BitLocker 恢复模式。

依赖 BitLocker 驱动器加密和 BitLocker To Go 来保护运行 Windows 11、Windows 10、Windows 8 或 Windows 7 操作系统和 Windows to Go 的大量计算机和可移动驱动器上的数据的组织应考虑使用 Microsoft BitLocker 管理和监控 (MBAM) 工具版本 2.0,该版本包含在 Microsoft 软件保障的 Microsoft 桌面优化包 (MDOP) 中。 MBAM 使 BitLocker 实现更易于部署和管理,并允许管理员预配和监视操作系统和固定驱动器的加密。 MBAM 在加密固定驱动器之前会提示用户。 MBAM 还管理固定驱动器和可移动驱动器的恢复密钥,使恢复更易于管理。 MBAM 可用作 Microsoft System Center 部署的一部分,也可用作独立解决方案。 有关详细信息,请参阅 Microsoft BitLocker 管理和监控

启动 BitLocker 恢复后,用户可以使用恢复密码解锁对加密数据的访问。 请考虑对组织使用自恢复和恢复密码检索方法。

确定恢复过程时,应该:

自恢复

在某些情况下,用户可能会打印出恢复密码或将其存储在 U 盘中,并且可以执行自恢复。 建议组织创建用于自我恢复的策略。 如果自我恢复包括使用存储在 USB 闪存驱动器上的密码或恢复密钥,则必须警告用户不要将 USB 闪存驱动器存储在与电脑相同的位置,尤其是在旅行期间。 例如,如果电脑和恢复项目都位于同一个包中,则未经授权的用户很容易获得对电脑的访问权限。 要考虑的另一个策略是让用户在执行自恢复之前或之后联系支持人员,以便找出根本原因。

恢复密码找回

如果用户未打印出恢复密码或将其存储在 U 盘中,则用户需要能够从联机源找回恢复密码。 如果电脑是域的成员,则恢复密码可以备份到 AD DS。 但是,默认情况下不会发生这种情况;在电脑上启用 BitLocker 之前,必须已配置相应的组策略设置。 BitLocker 组策略设置可以在“本地组策略编辑器”或“组策略管理控制台” (“GPMC) ”下的 “计算机配置”\“管理模板”\“Windows 组件\BitLocker 驱动器加密”下找到。 以下策略设置定义了恢复方法,它可用于在身份验证方法失败或无法使用时还原对受 BitLocker 保护的驱动器的访问。

  • 选择如何恢复受 BitLocker 保护的操作系统驱动器
  • 选择如何恢复受 BitLocker 保护的固定驱动器
  • 选择如何恢复受 BitLocker 保护的可移动驱动器在每个策略中,选择 “保存 BitLocker 恢复信息”以Active Directory 域服务,然后选择要存储在 AD DS 中的 BitLocker 恢复信息。 如果要阻止用户启用 BitLocker,除非计算机连接到域,并且将 BitLocker 恢复信息备份到 AD DS 成功,请选中“ 在 AD DS 复选框中存储恢复信息之前不要启用 BitLocker ”。

备注

如果电脑是工作组的一部分,则建议用户使用其 Microsoft 帐户联机保存 BitLocker 恢复密码。 建议使用 BitLocker 恢复密码的联机副本来帮助确保在需要恢复时不会失去对数据的访问权限。

利用适用于 Active Directory 用户和计算机的 BitLocker 恢复密码查看器工具,域管理员能够查看 Active Directory 中特定计算机对象的 BitLocker 恢复密码。

可以使用以下列表作为模板来创建自己的恢复过程,从而找回恢复密码。 此示例过程使用适用于 Active Directory 用户和计算机的 BitLocker 恢复密码查看器工具。

记录用户计算机的名称

可以使用用户计算机的名称在 AD DS 中查找恢复密码。 如果用户不知道计算机的名称,请让用户读取“驱动器加密密码输入”用户界面中“驱动器标签”的第一个单词。 这是启用 BitLocker 时的计算机名称,可能是计算机的当前名称。

验证用户的身份

应验证请求恢复密码的人员是否确实是该计算机的授权用户。 你可能还希望验证用户为其提供名称的计算机是否属于用户。

在 AD DS 中找到恢复密码

在 AD DS 中找到具有匹配名称的计算机对象。 由于在 AD DS 全局目录中列出了计算机对象名称,因此即使有多域林,也应能够找到该对象。

多个恢复密码

如果多个恢复密码存储在 AD DS 中的计算机对象下,则 BitLocker 恢复信息对象的名称包括创建密码的日期。

如果在任何时候不确定要提供的密码,或者如果你认为可能提供不正确的密码,请要求用户读取恢复控制台中显示的 8 个字符的密码 ID。

由于密码 ID 是与 AD DS 中存储的每个恢复密码关联的唯一值,因此使用此 ID 运行查询可找到解锁加密卷的正确密码。

收集信息以确定发生恢复的原因

在向用户提供恢复密码之前,应收集任何有助于确定为什么需要恢复的信息,以便在恢复后分析期间分析根本原因。 有关恢复后分析的详细信息,请参阅 恢复后分析

为用户提供恢复密码

由于恢复密码长度为 48 位,因此用户可能需要通过记下密码或在其他计算机上键入密码来记录密码。 如果使用的是 MBAM,则从 MBAM 数据库中恢复后将重新生成恢复密码,以避免与不受控制的密码相关联的安全风险。

备注

由于 48 位恢复密码很长并且包含数字组合,因此用户可能听错或拼错密码。 启动时间恢复控制台使用内置的校验和数字检测 48 位恢复密码的每个 6 位块中的输入错误,并让用户有机会更正此类错误。

恢复后分析

使用恢复密码解锁卷时,事件将写入事件日志,并且平台验证度量将在 TPM 中重置以匹配当前配置。 解锁卷意味着加密密钥已被释放并准备好在将数据写入卷时进行动态加密,并在从卷中读取数据时进行动态解密。 解锁卷后,BitLocker 的行为方式相同,无论授予访问权限的方式如何。

如果注意到计算机具有重复的恢复密码解锁,你可能希望让管理员执行恢复后分析来确定恢复的根本原因并刷新 BitLocker 平台验证,以便每次启动计算机时用户都不再需要输入恢复密码。 请参阅:

确定恢复的根本原因

如果用户需要恢复驱动器,请务必尽快确定启动恢复的根本原因。 正确分析计算机的状态并检测篡改可能会揭示对企业安全具有更广泛影响的威胁。

虽然在某些情况下,管理员可以远程调查恢复原因,但最终用户可能需要将包含已恢复驱动器的计算机带到现场,以进一步分析根本原因。

查看并回答组织的以下问题:

  1. 哪个 BitLocker 保护模式 (TPM、TPM + PIN、TPM + 启动密钥、仅) 启动密钥? 电脑上使用哪个 PCR 配置文件?
  2. 用户只是忘记 PIN 还是丢失了启动密钥? 如果令牌丢失,令牌可能在哪里?
  3. 如果 TPM 模式有效,恢复是否是由启动文件更改导致的?
  4. 如果恢复是由启动文件更改引起的,则启动文件更改是由于预期的用户操作 (,例如 BIOS 升级) 还是恶意软件?
  5. 用户上次成功启动计算机是何时?之后计算机可能发生了什么情况?
  6. 自上次成功启动后,用户是否遇到了恶意软件或计算机无人看管?

为帮助你回答这些问题,请使用 BitLocker 命令行工具查看当前配置和保护模式(例如 manage-bde -status)。 扫描事件日志,查找有助于指示启动恢复的原因的事件 (例如,如果启动文件发生更改) 。 这两项功能都可以远程执行。

解决根本原因

确定导致恢复的原因后,可以重置 BitLocker 保护并避免在每次启动时恢复。

此重置的详细信息可能因恢复的根本原因而异。 如果无法确定根本原因,或者恶意软件或 rootkit 可能已感染计算机,Helpdesk 应应用最佳做法的病毒策略以做出适当的反应。

备注

可以通过暂停和恢复 BitLocker 来执行 BitLocker 验证配置文件重置。

未知 PIN

如果用户忘记了 PIN,你必须在登录到计算机时重置 PIN,以防止 BitLocker 在计算机每次重启时启动恢复。

防止因未知 PIN 而继续恢复

  1. 使用恢复密码解锁计算机。
  2. 重置 PIN:
    1. 选择并按住驱动器,然后选择 “更改 PIN”
    2. 在“BitLocker 驱动器加密”对话框中,选择“重置已忘记的 PIN”。 如果未使用管理员帐户登录,则此时必须提供管理凭据。
    3. 在 PIN 重置对话框中,提供并确认要使用的新 PIN,然后选择 “完成”。
  3. 下次解锁驱动器时,将使用新 PIN。

启动密钥丢失

如果包含启动密钥的 U 盘丢失,则必须使用恢复密钥解锁驱动器,然后创建新的启动密钥。

防止因启动密钥丢失而继续恢复

  1. 以管理员身份登录到其启动密钥丢失的计算机。
  2. 打开“管理 BitLocker”。
  3. 选择 “重复启动密钥”,插入要在其中写入密钥的干净 USB 驱动器,然后选择 “保存”。

启动文件发生更改

如果更新了固件,则会发生此错误。 最佳做法是,应在更改固件之前暂停 BitLocker,然后在更新完成后恢复保护。 这会阻止计算机进入恢复模式。 但是,如果在启动 BitLocker 保护时进行了更改,则只需使用恢复密码登录到计算机,平台验证配置文件将更新,以便下次不会进行恢复。

Windows RE 和 BitLocker 设备加密

Windows 恢复环境 (RE) 可用于恢复对受 BitLocker 驱动器加密保护的驱动器的访问。 如果电脑在两次故障后无法启动,启动修复会自动启动。 当启动修复因启动失败而自动启动时,它只执行操作系统和驱动程序文件修复,前提是启动日志或任何可用的故障转储指向特定损坏的文件。 在Windows 8.1及更高版本中,包含固件以支持 PCR 的特定 TPM 度量值的设备[7] TPM 可以验证Windows RE是受信任的操作环境,如果尚未修改Windows RE,则解锁受 BitLocker 保护的任何驱动器。 例如,如果已修改Windows RE环境,则 TPM 已禁用,驱动器将保持锁定状态,直到提供 BitLocker 恢复密钥。 如果启动修复无法从电脑自动运行,而是从修复磁盘手动启动Windows RE,则必须提供 BitLocker 恢复密钥来解锁受 BitLocker 保护的驱动器。

Windows RE还会要求在使用“TPM + PIN”或“OS 驱动器密码”保护程序的设备上的Windows RE中启动“删除所有内容”重置时,提供 BitLocker 恢复密钥。 如果在具有仅 TPM 保护的无键盘设备上启动 BitLocker 恢复,Windows RE(而不是启动管理器)将请求 BitLocker 恢复密钥。 输入密钥后,可以访问Windows RE故障排除工具或正常启动 Windows。

Windows RE显示的 BitLocker 恢复屏幕具有辅助功能工具(如讲述人和屏幕键盘)来帮助输入 BitLocker 恢复密钥。 如果 Windows 启动管理器请求 BitLocker 恢复密钥,则这些工具可能不可用。

若要在 Windows RE 中的 BitLocker 恢复期间激活讲述人,请按 Windows + CTRL + Enter。 若要激活屏幕键盘,请点击文本输入控件。

BitLocker 恢复屏幕的屏幕截图,其中显示“讲述人已激活”。

BitLocker 恢复屏幕

在 BitLocker 恢复期间,Windows 会显示自定义恢复消息和一些提示,用于标识可从何处检索密钥。 这些改进可在 BitLocker 恢复期间帮助用户。

自定义恢复消息

利用 Windows 10 版本 1511 或 Windows 11 中的 BitLocker 组策略设置,可以在 BitLocker 恢复屏幕上配置自定义恢复消息和 URL,其可能包括 BitLocker 自助恢复门户的地址、IT 内部网站或支持电话号码。

可以使用 GPO 在“计算机配置” > “管理模板” > “Windows 组件” > “BitLocker 驱动器加密” > “操作系统驱动器” > “配置启动前恢复消息和 URL”下配置此策略。

它还可以使用 BitLocker CSP 中的 Intune 移动设备管理 (MDM) 进行配置:<LocURI>./Device/Vendor/MSFT/BitLocker/SystemDrivesRecoveryMessage</LocURI>

自定义 URL。

自定义恢复屏幕示例:

自定义的 BitLocker 恢复屏幕。

BitLocker 恢复密钥提示

BitLocker 元数据在 Windows 10 版本 1903 或 Windows 11 中得到了增强,包含有关何时以及在何处备份 BitLocker 恢复密钥的信息。 此信息不会通过 UI 或任何公共 API 公开。 它仅由 BitLocker 恢复屏幕以提示的形式使用,以帮助用户查找卷的恢复密钥。 提示将显示在恢复屏幕上,并引用保存密钥的位置。 提示将显示在新式(蓝色)和旧版(黑色)恢复屏幕上。 这适用于引导管理器恢复屏幕和 WinRE 解锁屏幕。

自定义的 BitLocker 恢复屏幕。

重要

建议不要打印恢复密钥或将它们保存到文件中。 请改为使用 Active Directory 备份或基于云的备份。 基于云的备份包括 Azure Active Directory (Azure AD) 和 Microsoft 帐户。

根据处理) 的顺序,在恢复 (期间显示哪些提示的规则:

  1. 如果已配置自定义恢复消息(使用 GPO 或 MDM),则始终显示该消息。
  2. 始终显示一般提示:“有关详细信息,请转到 https://aka.ms/recoverykeyfaq。”
  3. 如果卷上存在多个恢复密钥,请确定上次创建的 (的优先级,并成功备份) 恢复密钥。
  4. 让成功备份的密钥优先于从未备份的密钥。
  5. 按以下顺序对远程备份位置的备份提示进行优先级排序:Microsoft 帐户 > Azure AD > Active Directory
  6. 如果已打印密钥并将其保存到文件中,则显示组合提示“查找带密钥的打印输出或文本文件”,而不是两个单独的提示。
  7. 如果已针对同一恢复密钥执行了同一类型的多个备份 (删除与本地) ,请将备份信息的优先级设置为最新的备份日期。
  8. 对于保存到本地 Active Directory 的密钥没有特定提示。 在这种情况下,如果已配置) 或泛型消息“联系组织支持人员”,则会显示自定义消息 (。
  9. 如果磁盘上存在两个恢复密钥,但只有一个已成功备份,系统会要求备份一个密钥,即使另一个密钥较新。

示例 1(具有单个备份的单个恢复密钥)

自定义 URL
已保存到 Microsoft 帐户
已保存到 Azure AD
已保存到 Active Directory
已打印
已保存到文件

结果: 将显示 Microsoft 帐户和自定义 URL 的提示。

自定义 BitLocker 恢复屏幕示例 1。

示例 2(具有单个备份的单个恢复密钥)

自定义 URL
已保存到 Microsoft 帐户
已保存到 Azure AD
已保存到 Active Directory
已打印
已保存到文件

结果: 只显示自定义 URL。

自定义 BitLocker 恢复屏幕示例 2。

示例 3(具有多个备份的单个恢复密钥)

自定义 URL
已保存到 Microsoft 帐户
已保存到 Azure AD
已保存到 Active Directory
已打印
已保存到文件

结果: 只显示 Microsoft 帐户提示。

自定义 BitLocker 恢复屏幕示例 3。

示例 4(多个恢复密码)

自定义 URL
已保存到 Microsoft 帐户
已保存到 Azure AD
已保存到 Active Directory
已打印
已保存到文件
创建时间 下午 1 点
密钥 ID A564F193

   

自定义 URL
已保存到 Microsoft 帐户
已保存到 Azure AD
已保存到 Active Directory
已打印
已保存到文件
创建时间 下午 3 点
密钥 ID T4521ER5

结果: 只显示成功备份密钥的提示,即使它不是最新的密钥。

自定义 BitLocker 恢复屏幕示例 4。

示例 5(多个恢复密码)

自定义 URL
已保存到 Microsoft 帐户
已保存到 Azure AD
已保存到 Active Directory
已打印
已保存到文件
创建时间 下午 1 点
密钥 ID 99631A34

   

自定义 URL
已保存到 Microsoft 帐户
已保存到 Azure AD
已保存到 Active Directory
已打印
已保存到文件
创建时间 下午 3 点
密钥 ID 9DF70931

结果: 显示最新密钥的提示。

自定义 BitLocker 恢复屏幕示例 5。

使用其他恢复信息

除了 48 位 BitLocker 恢复密码之外,其他类型的恢复信息也存储在 Active Directory 中。 此部分介绍如何使用此附加信息。

BitLocker 密钥包

如果本文档前面讨论的恢复方法无法解锁卷,则可以使用 BitLocker 修复工具在块级别解密卷。 该工具使用 BitLocker 密钥包来帮助从严重损坏的驱动器恢复加密数据。 然后,即使正确的恢复密码未能解锁损坏的卷,也可以使用此恢复的数据来挽救加密数据。 建议仍保存恢复密码。 如果没有相应的恢复密码,则不能使用密钥包。

备注

必须使用 BitLocker 修复工具 repair-bde 才能使用 BitLocker 密钥包。

默认情况下不会保存 BitLocker 密钥包。 若要将包与恢复密码一起保存在 AD DS 中,必须在控制恢复方法的组策略设置中选择 “备份恢复密码”和“密钥包 ”选项。 还可以从工作卷导出密钥包。 有关如何导出密钥包的更多详细信息,请参 阅检索 BitLocker 密钥包

重置恢复密码

在提供和使用恢复密码后,以及出于任何原因有意想要使现有恢复密码失效时,必须使恢复密码失效。

可以通过两种方式重置恢复密码:

  • 使用 manage-bde:可以使用 manage-bde 删除旧的恢复密码并添加新的恢复密码。 该过程将识别此方法的命令和语法。
  • 运行脚本:可以运行脚本来重置密码,而无需解密卷。 该过程中的示例脚本说明了此功能。 示例脚本将创建新的恢复密码,并使所有其他密码失效。

若要使用 manage-bde 重置恢复密码,请执行以下操作:

  1. 删除以前的恢复密码。

    Manage-bde –protectors –delete C: –type RecoveryPassword
    
  2. 添加新的恢复密码。

    Manage-bde –protectors –add C: -RecoveryPassword
    
  3. 获取新恢复密码的 ID。 从屏幕上复制恢复密码的 ID。

    Manage-bde –protectors –get C: -Type RecoveryPassword
    
  4. 将新的恢复密码备份到 AD DS。

    Manage-bde –protectors –adbackup C: -id {EXAMPLE6-5507-4924-AA9E-AFB2EB003692}
    

    警告

    必须在 ID 字符串中包含大括号。

若要运行示例恢复密码脚本,请执行以下操作:

  1. 将以下示例脚本保存在 VBScript 文件中。 例如:ResetPassword.vbs。

  2. 在命令提示符处,键入类似于以下内容的命令:

    cscript ResetPassword.vbs

    重要

    此示例脚本配置为仅适用于 C 卷。 必须自定义脚本来匹配要测试密码重置的卷。

备注

若要管理远程计算机,必须指定远程计算机名称,而不是本地计算机名称。

可以使用以下示例 VBScript 重置恢复密码:

' Target drive letter
strDriveLetter = "c:"
' Target computer name
' Use "." to connect to the local computer
strComputerName = "."
' --------------------------------------------------------------------------------
' Connect to the BitLocker WMI provider class
' --------------------------------------------------------------------------------
strConnectionStr = "winmgmts:" _
                 & "{impersonationLevel=impersonate,authenticationLevel=pktPrivacy}!\\" _
                 & strComputerName _
                 & "\root\cimv2\Security\MicrosoftVolumeEncryption"


On Error Resume Next 'handle permission errors
Set objWMIService = GetObject(strConnectionStr)
If Err.Number <> 0 Then
     WScript.Echo "Failed to connect to the BitLocker interface (Error 0x" & Hex(Err.Number) & ")."
     Wscript.Echo "Ensure that you are running with administrative privileges."
     WScript.Quit -1
End If
On Error GoTo 0
strQuery = "Select * from Win32_EncryptableVolume where DriveLetter='" & strDriveLetter & "'"
Set colTargetVolumes = objWMIService.ExecQuery(strQuery)
If colTargetVolumes.Count = 0 Then
    WScript.Echo "FAILURE: Unable to find BitLocker-capable drive " &  strDriveLetter & " on computer " & strComputerName & "."
    WScript.Quit -1
End If
' there should only be one volume found
For Each objFoundVolume in colTargetVolumes
    set objVolume = objFoundVolume
Next
' objVolume is now our found BitLocker-capable disk volume
' --------------------------------------------------------------------------------
' Perform BitLocker WMI provider functionality
' --------------------------------------------------------------------------------
' Add a new recovery password, keeping the ID around so it doesn't get deleted later
' ----------------------------------------------------------------------------------
nRC = objVolume.ProtectKeyWithNumericalPassword("Recovery Password Refreshed By Script", , sNewKeyProtectorID)
If nRC <> 0 Then
WScript.Echo "FAILURE: ProtectKeyWithNumericalPassword failed with return code 0x" & Hex(nRC)
WScript.Quit -1
End If
' Removes the other, "stale", recovery passwords
' ----------------------------------------------------------------------------------
nKeyProtectorTypeIn = 3 ' type associated with "Numerical Password" protector
nRC = objVolume.GetKeyProtectors(nKeyProtectorTypeIn, aKeyProtectorIDs)
If nRC <> 0 Then
WScript.Echo "FAILURE: GetKeyProtectors failed with return code 0x" & Hex(nRC)
WScript.Quit -1
End If
' Delete those key protectors other than the one we just added.
For Each sKeyProtectorID In aKeyProtectorIDs
If sKeyProtectorID <> sNewKeyProtectorID Then
nRC = objVolume.DeleteKeyProtector(sKeyProtectorID)
If nRC <> 0 Then
WScript.Echo "FAILURE: DeleteKeyProtector on ID " & sKeyProtectorID & " failed with return code 0x" & Hex(nRC)
WScript.Quit -1
Else
' no output
'WScript.Echo "SUCCESS: Key protector with ID " & sKeyProtectorID & " deleted"
End If
End If
Next
WScript.Echo "A new recovery password has been added. Old passwords have been removed."
' - some advanced output (hidden)
'WScript.Echo ""
'WScript.Echo "Type ""manage-bde -protectors -get " & strDriveLetter & " -type recoverypassword"" to view existing passwords."

检索 BitLocker 密钥包

可以使用两种方法检索密钥包,如使用其他恢复信息中所述:

  • 从 AD DS 导出以前保存的密钥包。 必须对存储在 AD DS 中的 BitLocker 恢复密码具有读取权限。
  • 从受 BitLocker 保护的未锁定卷导出新的密钥包。 在出现任何损坏之前,你必须对工作卷具有本地管理员访问权限。

以下示例脚本将从 AD DS 导出以前保存的所有密钥包。

若要运行示例密钥包检索脚本,请执行以下操作:

  1. 将以下示例脚本保存在 VBScript 文件中。 例如:GetBitLockerKeyPackageADDS.vbs。

  2. 在命令提示符处,键入类似于以下示例脚本的命令:

    cscript GetBitLockerKeyPackageADDS.vbs -?

可以使用以下示例脚本创建 VBScript 文件,以便从 AD DS 检索 BitLocker 密钥包:

' --------------------------------------------------------------------------------
' Usage
' --------------------------------------------------------------------------------
Sub ShowUsage
   Wscript.Echo "USAGE: GetBitLockerKeyPackageADDS [Path To Save Key Package] [Optional Computer Name]"
   Wscript.Echo "If no computer name is specified, the local computer is assumed."
   Wscript.Echo
   Wscript.Echo "Example: GetBitLockerKeyPackageADDS E:\bitlocker-ad-key-package mycomputer"
   WScript.Quit
End Sub
' --------------------------------------------------------------------------------
' Parse Arguments
' --------------------------------------------------------------------------------
Set args = WScript.Arguments
Select Case args.Count
  Case 1
    If args(0) = "/?" Or args(0) = "-?" Then
    ShowUsage
    Else
      strFilePath = args(0)
      ' Get the name of the local computer
      Set objNetwork = CreateObject("WScript.Network")
      strComputerName = objNetwork.ComputerName
    End If

  Case 2
    If args(0) = "/?" Or args(0) = "-?" Then
      ShowUsage
    Else
      strFilePath = args(0)
      strComputerName = args(1)
    End If
  Case Else
    ShowUsage
End Select
' --------------------------------------------------------------------------------
' Get path to Active Directory computer object associated with the computer name
' --------------------------------------------------------------------------------
Function GetStrPathToComputer(strComputerName)
    ' Uses the global catalog to find the computer in the forest
    ' Search also includes deleted computers in the tombstone
    Set objRootLDAP = GetObject("LDAP://rootDSE")
    namingContext = objRootLDAP.Get("defaultNamingContext") ' e.g. string dc=fabrikam,dc=com
    strBase = "<GC://" & namingContext & ">"

    Set objConnection = CreateObject("ADODB.Connection")
    Set objCommand = CreateObject("ADODB.Command")
    objConnection.Provider = "ADsDSOOBject"
    objConnection.Open "Active Directory Provider"
    Set objCommand.ActiveConnection = objConnection
    strFilter = "(&(objectCategory=Computer)(cn=" &  strComputerName & "))"
    strQuery = strBase & ";" & strFilter  & ";distinguishedName;subtree"
    objCommand.CommandText = strQuery
    objCommand.Properties("Page Size") = 100
    objCommand.Properties("Timeout") = 100
    objCommand.Properties("Cache Results") = False
    ' Enumerate all objects found.
    Set objRecordSet = objCommand.Execute
    If objRecordSet.EOF Then
      WScript.echo "The computer name '" &  strComputerName & "' cannot be found."
      WScript.Quit 1
    End If
    ' Found object matching name
    Do Until objRecordSet.EOF
      dnFound = objRecordSet.Fields("distinguishedName")
      GetStrPathToComputer = "LDAP://" & dnFound
      objRecordSet.MoveNext
    Loop
    ' Clean up.
    Set objConnection = Nothing
    Set objCommand = Nothing
    Set objRecordSet = Nothing
End Function
' --------------------------------------------------------------------------------
' Securely access the Active Directory computer object using Kerberos
' --------------------------------------------------------------------------------
Set objDSO = GetObject("LDAP:")
strPathToComputer = GetStrPathToComputer(strComputerName)
WScript.Echo "Accessing object: " + strPathToComputer
Const ADS_SECURE_AUTHENTICATION = 1
Const ADS_USE_SEALING = 64 '0x40
Const ADS_USE_SIGNING = 128 '0x80
' --------------------------------------------------------------------------------
' Get all BitLocker recovery information from the Active Directory computer object
' --------------------------------------------------------------------------------
' Get all the recovery information child objects of the computer object
Set objFveInfos = objDSO.OpenDSObject(strPathToComputer, vbNullString, vbNullString, _
                                   ADS_SECURE_AUTHENTICATION + ADS_USE_SEALING + ADS_USE_SIGNING)
objFveInfos.Filter = Array("msFVE-RecoveryInformation")
' Iterate through each recovery information object and saves any existing key packages
nCount = 1
strFilePathCurrent = strFilePath & nCount
For Each objFveInfo in objFveInfos
   strName = objFveInfo.Get("name")
   strRecoveryPassword = objFveInfo.Get("msFVE-RecoveryPassword")
   strKeyPackage = objFveInfo.Get("msFVE-KeyPackage")
   WScript.echo
   WScript.echo "Recovery Object Name: " + strName
   WScript.echo "Recovery Password: " + strRecoveryPassword
   ' Validate file path
   Set fso = CreateObject("Scripting.FileSystemObject")
   If (fso.FileExists(strFilePathCurrent)) Then
 WScript.Echo "The file " & strFilePathCurrent & " already exists. Please use a different path."
WScript.Quit -1
   End If
   ' Save binary data to the file
   SaveBinaryDataText strFilePathCurrent, strKeyPackage

   WScript.echo "Related key package successfully saved to " + strFilePathCurrent
   ' Update next file path using base name
   nCount = nCount + 1
   strFilePathCurrent = strFilePath & nCount
Next
'----------------------------------------------------------------------------------------
' Utility functions to save binary data
'----------------------------------------------------------------------------------------
Function SaveBinaryDataText(FileName, ByteArray)
  'Create FileSystemObject object
  Dim FS: Set FS = CreateObject("Scripting.FileSystemObject")

  'Create text stream object
  Dim TextStream
  Set TextStream = FS.CreateTextFile(FileName)

  'Convert binary data To text And write them To the file
  TextStream.Write BinaryToString(ByteArray)
End Function
Function BinaryToString(Binary)
  Dim I, S
  For I = 1 To LenB(Binary)
    S = S & Chr(AscB(MidB(Binary, I, 1)))
  Next
  BinaryToString = S
End Function
WScript.Quit

以下示例脚本将从未锁定的加密卷导出新的密钥包。

若要运行示例密钥包检索脚本,请执行以下操作:

  1. 将以下示例脚本保存在 VBScript 文件中。 例如:GetBitLockerKeyPackage.vbs

  2. 打开管理员命令提示符,然后键入类似于以下示例脚本的命令:

    cscript GetBitLockerKeyPackage.vbs -?

' --------------------------------------------------------------------------------
' Usage
' --------------------------------------------------------------------------------
Sub ShowUsage
   Wscript.Echo "USAGE: GetBitLockerKeyPackage [VolumeLetter/DriveLetter:] [Path To Save Key Package]"
   Wscript.Echo
   Wscript.Echo "Example: GetBitLockerKeyPackage C: E:\bitlocker-backup-key-package"
   WScript.Quit
End Sub
' --------------------------------------------------------------------------------
' Parse Arguments
' --------------------------------------------------------------------------------
Set args = WScript.Arguments
Select Case args.Count
  Case 2
    If args(0) = "/?" Or args(0) = "-?" Then
      ShowUsage
    Else
      strDriveLetter = args(0)
      strFilePath = args(1)
    End If
  Case Else
    ShowUsage
End Select
' --------------------------------------------------------------------------------
' Other Inputs
' --------------------------------------------------------------------------------
' Target computer name
' Use "." to connect to the local computer
strComputerName = "."
' Default key protector ID to use. Specify "" to let the script choose.
strDefaultKeyProtectorID = ""
' strDefaultKeyProtectorID = "{001298E0-870E-4BA0-A2FF-FC74758D5720}"  ' sample
' --------------------------------------------------------------------------------
' Connect to the BitLocker WMI provider class
' --------------------------------------------------------------------------------
strConnectionStr = "winmgmts:" _
                 & "{impersonationLevel=impersonate,authenticationLevel=pktPrivacy}!\\" _
                 & strComputerName _
                 & "\root\cimv2\Security\MicrosoftVolumeEncryption"


On Error Resume Next 'handle permission errors
Set objWMIService = GetObject(strConnectionStr)
If Err.Number <> 0 Then
     WScript.Echo "Failed to connect to the BitLocker interface (Error 0x" & Hex(Err.Number) & ")."
     Wscript.Echo "Ensure that you are running with administrative privileges."
     WScript.Quit -1
End If
On Error GoTo 0
strQuery = "Select * from Win32_EncryptableVolume where DriveLetter='" & strDriveLetter & "'"
Set colTargetVolumes = objWMIService.ExecQuery(strQuery)
If colTargetVolumes.Count = 0 Then
    WScript.Echo "FAILURE: Unable to find BitLocker-capable drive " &  strDriveLetter & " on computer " & strComputerName & "."
    WScript.Quit -1
End If
' there should only be one volume found
For Each objFoundVolume in colTargetVolumes
    set objVolume = objFoundVolume
Next
' objVolume is now our found BitLocker-capable disk volume
' --------------------------------------------------------------------------------
' Perform BitLocker WMI provider functionality
' --------------------------------------------------------------------------------
' Collect all possible valid key protector ID's that can be used to get the package
' ----------------------------------------------------------------------------------
nNumericalKeyProtectorType = 3 ' type associated with "Numerical Password" protector
nRC = objVolume.GetKeyProtectors(nNumericalKeyProtectorType, aNumericalKeyProtectorIDs)
If nRC <> 0 Then
WScript.Echo "FAILURE: GetKeyProtectors failed with return code 0x" & Hex(nRC)
WScript.Quit -1
End If
nExternalKeyProtectorType = 2 ' type associated with "External Key" protector
nRC = objVolume.GetKeyProtectors(nExternalKeyProtectorType, aExternalKeyProtectorIDs)
If nRC <> 0 Then
WScript.Echo "FAILURE: GetKeyProtectors failed with return code 0x" & Hex(nRC)
WScript.Quit -1
End If
' Get first key protector of the type "Numerical Password" or "External Key", if any
' ----------------------------------------------------------------------------------
if strDefaultKeyProtectorID = "" Then
' Save first numerical password, if exists
If UBound(aNumericalKeyProtectorIDs) <> -1 Then
strDefaultKeyProtectorID = aNumericalKeyProtectorIDs(0)
End If
' No numerical passwords exist, save the first external key
If strDefaultKeyProtectorID = "" and UBound(aExternalKeyProtectorIDs) <> -1 Then
strDefaultKeyProtectorID = aExternalKeyProtectorIDs(0)
End If
' Fail case: no recovery key protectors exist.
If strDefaultKeyProtectorID = "" Then
WScript.Echo "FAILURE: Cannot create backup key package because no recovery passwords or recovery keys exist. Check that BitLocker protection is on for this drive."
WScript.Echo "For help adding recovery passwords or recovery keys, type ""manage-bde -protectors -add -?""."
WScript.Quit -1
End If
End If
' Get some information about the chosen key protector ID
' ----------------------------------------------------------------------------------
' is the type valid?
nRC = objVolume.GetKeyProtectorType(strDefaultKeyProtectorID, nDefaultKeyProtectorType)
If Hex(nRC) = "80070057" Then
WScript.Echo "The key protector ID " & strDefaultKeyProtectorID & " is not valid."
WScript.Echo "This ID value may have been provided by the script writer."
ElseIf nRC <> 0 Then
WScript.Echo "FAILURE: GetKeyProtectorType failed with return code 0x" & Hex(nRC)
WScript.Quit -1
End If
' what's a string that can be used to describe it?
strDefaultKeyProtectorType = ""
Select Case nDefaultKeyProtectorType
  Case nNumericalKeyProtectorType
      strDefaultKeyProtectorType = "recovery password"
  Case nExternalKeyProtectorType
      strDefaultKeyProtectorType = "recovery key"
  Case Else
      WScript.Echo "The key protector ID " & strDefaultKeyProtectorID & " does not refer to a valid recovery password or recovery key."
      WScript.Echo "This ID value may have been provided by the script writer."
End Select
' Save the backup key package using the chosen key protector ID
' ----------------------------------------------------------------------------------
nRC = objVolume.GetKeyPackage(strDefaultKeyProtectorID, oKeyPackage)
If nRC <> 0 Then
WScript.Echo "FAILURE: GetKeyPackage failed with return code 0x" & Hex(nRC)
WScript.Quit -1
End If
' Validate file path
Set fso = CreateObject("Scripting.FileSystemObject")
If (fso.FileExists(strFilePath)) Then
WScript.Echo "The file " & strFilePath & " already exists. Please use a different path."
WScript.Quit -1
End If
Dim oKeyPackageByte, bKeyPackage
For Each oKeyPackageByte in oKeyPackage
  'WScript.echo "key package byte: " & oKeyPackageByte
  bKeyPackage = bKeyPackage & ChrB(oKeyPackageByte)
Next
' Save binary data to the file
SaveBinaryDataText strFilePath, bKeyPackage
' Display helpful information
' ----------------------------------------------------------------------------------
WScript.Echo "The backup key package has been saved to " & strFilePath & "."
WScript.Echo "IMPORTANT: To use this key package, the " & strDefaultKeyProtectorType & " must also be saved."
' Display the recovery password or a note about saving the recovery key file
If nDefaultKeyProtectorType = nNumericalKeyProtectorType Then
nRC = objVolume.GetKeyProtectorNumericalPassword(strDefaultKeyProtectorID, sNumericalPassword)
If nRC <> 0 Then
WScript.Echo "FAILURE: GetKeyProtectorNumericalPassword failed with return code 0x" & Hex(nRC)
WScript.Quit -1
End If
WScript.Echo "Save this recovery password: " & sNumericalPassword
ElseIf nDefaultKeyProtectorType = nExternalKeyProtectorType Then
WScript.Echo "The saved key file is named " & strDefaultKeyProtectorID & ".BEK"
WScript.Echo "For help re-saving this external key file, type ""manage-bde -protectors -get -?"""
End If
'----------------------------------------------------------------------------------------
' Utility functions to save binary data
'----------------------------------------------------------------------------------------
Function SaveBinaryDataText(FileName, ByteArray)
  'Create FileSystemObject object
  Dim FS: Set FS = CreateObject("Scripting.FileSystemObject")

  'Create text stream object
  Dim TextStream
  Set TextStream = FS.CreateTextFile(FileName)

  'Convert binary data To text And write them To the file
  TextStream.Write BinaryToString(ByteArray)
End Function
Function BinaryToString(Binary)
  Dim I, S
  For I = 1 To LenB(Binary)
    S = S & Chr(AscB(MidB(Binary, I, 1)))
  Next
  BinaryToString = S
End Function

另请参阅