如何使用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_WRITE
或 KEY_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,我可以手动将内容从源复制到目标,因此权限和可见性应该不是问题。
代码片段足够简单。还有什么我忽略的吗?
我一直在尝试使用 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_WRITE
或 KEY_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,我可以手动将内容从源复制到目标,因此权限和可见性应该不是问题。 代码片段足够简单。还有什么我忽略的吗?