因此,您可能知道,注册表配置单元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 系统的方法。但我想建议一种简单的编辑方法。
- 卸载
BCD00000000
配置单元。您可以这样做,因为它仅在启动时需要。(选择它 -> 文件 -> 卸载配置单元...) - 从磁盘加载 BCD 文件作为注册表配置单元。(如果找不到该文件,为卷分配驱动器号。)
- 简单编辑一下。
您甚至不需要再次加载它。但是,建议制作 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 - 因此我们有三个“位置”的同步:
NVRAM(部分)
EFI 系统分区上的 BCD
HKLM\BCD00000000 注册表分支
Microsoft 文档说,编辑 BCD 只有两种“合法”的方法:
使用 bcdedit(通过单个命令或脚本)
使用 BCD WMI 提供程序接口(以编程方式编辑)