如何直接合并 Windows 注册表配置单元而不将其转换为中间文本文件?

如何直接合并 Windows 注册表配置单元而不将其转换为中间文本文件?

救命!如果我明天还不能想出如何解决这个问题,我就会被解雇。

Microsoft Windows 将其注册表数据库(称为“注册表配置单元”)存储在 这个名字的由来其实有一个背景故事,但我离题了)采用专有二进制格式。

正确回答这个问题,否则你将失去工作:

  1. 令 H-sub-A 为计算机 A 的注册表配置单元,令 H-sub-B 为计算机 B 的注册表配置单元。

  2. 创建一个注册表配置单元 H-sub-A-prime(采用本机二进制格式),其中包含 H-sub-A 和 H-sub-B 中的所有注册表项和值。如果有重叠,则让 H-sub-B 中的值覆盖 H-sub-A 中的值。

  3. 当然,您可以导入基于文本的补丁文件(例如“FOO.REG”)来修改注册表,但是您可以合并两个以其原始二进制格式的注册表配置单元吗?

涉及将注册表导出到文本文件(例如“FOO.REG”)的答案将不会获得积分。您只能使用 Microsoft Windows(任何版本)附带的软件和/或免费的第三方工具。

答案1

您可以通过将这些配置单元加载到注册表中的临时项中,然后使用命令将一个配置单元复制到另一个配置单元上来合并这些配置单元reg

考虑到问题的性质,请注意,我不对因使用此答案而可能产生的任何损害负责。有关更多信息,请参阅Stack Exchange 网络服务条款

实际上,我自己在 Windows 7 机器上使用虚拟数据测试了这些命令,没有更改注册表中的任何现有数据,因此它们应该可以正常工作。我假设注册表配置单元文件已提供给您;如果没有,您可能需要通过启动 Linux 实时 CD 并从计算机的硬盘驱动器中检索文件来获取它们。我无法通过reg save提升的命令提示符将它们导出到实时系统上,只会得到Access is denied错误。

如果每台计算机的配置单元不止一个文件,并且需要将它们作为一个单元进行操作,则您需要使用下文讨论的相同技术在注册表中加载并合并它们,这些技术针对的是配置单元文件来源计算机对应的键,然后再将计算机 B 的完整配置单元复制到计算机 A 的配置单元上。否则,您可以使用以下步骤分别合并每个配置单元。

  • 假设蜂巢HA存储在文件Ha.hiv和hive中HB存储在文件中Hb.hiv。首先HKLM\Temp使用注册表编辑器创建一个键,然后加载HH在任一计算机上使用提升的命令提示符中的以下命令将B输入此临时密钥:

    reg load HKLM\Temp\Ha Ha.hiv
    reg load HKLM\Temp\Hb Hb.hiv
    
  • 复制内容HB进入HA,覆盖任何现有的键和值:

    reg copy HKLM\Temp\Hb HKLM\Temp\Ha /s /f
    
  • 使用注册表编辑器卸载注册表配置单元文件,方法是选择Ha注册表项,然后选择卸载 Hive在下面文件菜单,然后对 重复相同的操作Hb。然后您可以删除临时注册表项HKLM\Temp。(reg unload不起作用;我自己试过了,但得到了Access is denied,但我能够通过注册表编辑器做到这一点。)

  • 合并的蜂巢HA ' 现在存储在 中Ha.hiv

有关该reg命令的更多信息,请参阅http://technet.microsoft.com/en-us/library/cc732643.aspx

答案2

注册表操作实际上至少是基本 Windows 库的一部分,如果不是 NT 内核本身的话。

在二进制级别将密钥合并到配置单元的唯一官方方法就在那里。据我所知,微软尚未向公众公布其工作原理。我相信任何此类文档都是逆向工程的结果。

而且,依赖注册表的二进制级别格式来完成一些无需了解实现细节就能完成的事情真的很愚蠢,因为微软可能随时修改或完全改变该格式,因为它对该格式拥有独家控制权。

可能有许多第三方工具可以操纵注册表。除非在绝望的情况下(例如,如果您没有其他办法进入系统,则更改本地管理员密码)、实验,或者如果您知道您的软件 100% 与特定的 Windows 版本绑定,否则我不会依赖它们 - 只是因为您不知道 Microsoft 将来会如何处理专有格式。Microsoft 提供与实现无关的注册表 API 是有原因的。

相关内容