如何使用RegCopyTree

How to use RegCopyTree

我一直在尝试使用 C++ 注册表函数,我正在尝试让 RegCopyTree 工作,但每次我尝试时,我都会收到类似

的错误
ERROR_FILE_NOT_FOUND

ERROR_ACCESS_DENIED.

我是运行该程序的管理员,所有其他注册表功能都可以正常工作。

这是我使用的代码:

HKEY destinationKey;
RegCreateKeyEx(getRootKeyFromCode(rootKeyCode),
        destinationKeyPathNative, 0, NULL, 0, 0, NULL,
        &destinationKey, NULL);
RegCopyTree(INSERT_ROOT_KEY_HERE,
        INSERT_ORIGINAL_KEY_PATH_HERE, destinationKey);
RegCloseKey(destinationKey);

我删除了错误处理和其他一些不相关的部分。

您应该使用管理员权限运行您的应用程序,否则您调用注册表函数将失败。

目标键句柄应该有写入权限,以便能够复制到它。在未指定访问模式的情况下调用 RegCreateKeyEx() 失败或未授予写访问权限。尝试使用 KEY_WRITEKEY_CREATE_SUB_KEY 作为第六个参数。

恕我直言,RegCopyKey() 的实现最终被破坏了。

以下代码片段:

HKEY source = nullptr;
LONG l1 = RegOpenKeyEx(HKEY_CLASSES_ROOT, L"CLSID\{44EC053A-400F-11D0-9DCD-00A0C90391D3}", 0, KEY_READ /* KEY_ALL_ACCESS */, &source);

HKEY destination = nullptr;
LONG l2 = RegCreateKeyEx(HKEY_CURRENT_USER, L"Software\Substitute", 0, nullptr, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, nullptr, &destination, nullptr);

LONG l3 = RegCopyTree(source, nullptr, destination);

产量 l1 = 0 (NO_ERROR), l2 = 0 (NO_ERROR), l3 = 5 (ACCESS_DENIED).

在调用此代码之前,源密钥(atl.dll 的 COM 条目)存在,而目标密钥不存在。即使我以提升的权限启动进程并使用 KEY_ALL_ACCESS.

打开源密钥,也会发生错误

通过检查注册表,我发现 RegCopyTree 将 destination 键的属性设置为 KEY_READ。随后,它无法再创建任何子项。所以基本上,RegCopyTree 正在翻滚自己的脚。

Microsoft 也无法解决这个问题;请参阅 The RegCopyTree Function

中的最后一个答案

使用 RegQueryValueEx 和 RegSetValueEx,我可以手动将内容从源复制到目标,因此权限和可见性应该不是问题。 代码片段足够简单。还有什么我忽略的吗?