地点

地点

因此,您可能知道,注册表配置单元HKEY_LOCAL_MACHINE\BCD00000000实际上是系统 BCD 存储;它与您运行命令时看到的信息相同BCDEDIT(以管理员身份)。

但是,如果我尝试以管理员身份运行 regedit 并手动编辑其中的任何值,则会出现错误Cannot edit <value_name>: Error writing the value's new contents。同样,如果 Windows API 函数RegSetValueEx尝试更改此子项中的值,即使在以管理员身份运行的应用程序中,它也会失败。

但是,该BCDEDIT命令可以毫无问题地从该存储中插入、更新和删除项目,并且更改也会显示在注册表中。

BCDEDIT这和手动编辑注册表有什么区别?

答案1

一句话:权限。

详细说明…

地点

BCD 存储在启动驱动器上(通常为 ~100MB NTFS 卷)。默认情况下,它是隐藏的,但您可以使用磁盘管理 MMC 管理单元 ( diskmgmt.msc) 为其分配驱动器号。然后,您可以查看目录Boot并查看文件,BCD该文件是包含启动配置数据的常规注册表配置单元格式的文件。

基本原理

显然,启动数据非常敏感,是导致故障的第一道防线。系统文件混乱可以相对轻松地修复,但这需要某物运行进行修复。如果启动文件混乱,则什么都无法运行,系统就完蛋了。(当然,它仍然可以修复,但不是自动修复;它需要有目的的手动干预,例如使用启动或安装光盘。)

由于启动数据至关重要,因此 Windows 不允许在其中随意乱动。使用注册表编辑器直接编辑启动数据可能会设置无效或冲突的值、添加无效或非法条目、删除强制条目等。限制 BCD 的修改以允许bcdedit它将更改限制为有效值,这有助于限制可能造成的损害(它不能完全消除问题;您仍然可以杀死系统,但至少它可以消除大量可能的问题)。

方法

如果您检查分支的权限BCD00000000,您将看到它已Full Control为 SYSTEM 帐户设置,但管理员组具有Special权限,这只是授予设置权限的能力的Read-Only加分项。(您可能需要单击按钮,因为基本对话框指示 SYSTEM也具有访问权限,但WriteDac[Advanced]Special高级安全设置对话框显示其已正确设置为Full Control。)

当您运行 Regedit(需要提升权限)时,它会在您的用户帐户上下文中运行并获得管理员组权限,因此您无法对其进行写入。当您使用该bcdedit命令时,它会在具有写入权限的 SYSTEM 帐户上下文中运行。如果您启用用户名在任务管理器的“Regedit”栏中,您可以看到Regedit是由您的用户帐户运行的,并且bcdedit由SYSTEM运行。

解决方法

不建议直接使用 Regedit 编辑 BCD,而且很少需要,但如果真的必须,那么一种方法是授予自己对该BCD00000000分支的写访问权限。当然,不建议这样做,因为您需要记住稍后撤销权限。更简单的方法是简单地在 SYSTEM 上下文中运行 Regedit

答案2

@Synetech 建议的解决方法很好。特别是使用 runas 系统的方法。但我想建议一种简单的编辑方法。

  1. 卸载BCD00000000配置单元。您可以这样做,因为它仅在启动时需要。(选择它 -> 文件 -> 卸载配置单元...)
  2. 从磁盘加载 BCD 文件作为注册表配置单元。(如果找不到该文件,为卷分配驱动器号。
  3. 简单编辑一下。

您甚至不需要再次加载它。但是,建议制作 BCD 文件备份,并在编辑后重新启动。

答案3

使用 Regedit 查看权限。请注意,默认情况下管理员没有对该项或子项的写访问权限。看来管理员确实有权限修改 DAC,即权限,因此您可以尝试一下。

答案4

不建议使用注册表编辑器直接编辑 BCD00000000 分支。

在这个分支下,您有一份“系统 BCD”的副本,它是一个受保护的系统文件。

系统保持“系统BCD”文件和注册表分支BCD00000000保持同步。

BCD 具有某种结构——对象的集合,其中每个对象又具有其结构(元素列表)。

大多数元素都是简单的字符串或数字(整数、十六进制)。但有些整数是枚举,取决于上下文(!)。

一些元素可以再次是具有复杂结构的对象,例如 VHD 设备的设备元素。

要编辑 BCD 的每个元素或对象,您可以使用命令行工具“bcdedit”,也可以使用“可视化 BCD 编辑器”- 一个完整的 GUI BCD 编辑器。

Visual BCD Editor 使用 BCD WMI 提供程序接口进行 BCD 访问(用于 BCD 访问的 API)。

在 UEFI 系统上,事情更加复杂 - BCD 也镜像了部分 NVRAM - 因此我们有三个“位置”的同步:

  1. NVRAM(部分)

  2. EFI 系统分区上的 BCD

  3. HKLM\BCD00000000 注册表分支

Microsoft 文档说,编辑 BCD 只有两种“合法”的方法:

  1. 使用 bcdedit(通过单个命令或脚本)

  2. 使用 BCD WMI 提供程序接口(以编程方式编辑)

相关内容