RegOpenKeyEx()返回ERROR_ACCESS_DENIED

时间:2013-11-07 14:44:42

标签: c++ windows winapi registry regedit

我想获取HKEY_CLASSES_ROOT\\SOFTWARE\\Classes\\CLSID密钥下的所有CLSID密钥。

我知道该密钥对于合并的HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSIDHKEY_CURRENT_USER\\SOFTWARE\\Classes\\CLSID密钥是镜像的。

到目前为止,我可以枚举所有HKEY_CLASSES_ROOT\\SOFTWARE\\Classes\\CLSIDHKEY_LOCAL_MACHINE\\...HKEY_CURRENT_USER\\...)并将该密钥的名称输入std::wstring[]。但是当我试图打开那些钥匙时:

//CLSID = e.g. L"{CAFEEFAC-0013-0001-0001-ABCDEFFEDCBB}"
firstKey = HKEY_LOCAL_MACHINE;
keysPath = L"\\SOFTWARE\\Classes\\CLSID\\"+CLSID;
if(x64System)
    regsam = KEY_ALL_ACCESS|KEY_WOW64_64KEY; //on my system
else
    regsam = KEY_ALL_ACCESS;

result = RegOpenKeyEx(firstKey, keysPath.c_str(), 0, regsam, &outputKey);

HKEY_CURRENT_USER仅适用 HKEY_LOCAL_MACHINE只返回ERROR_ACCESS_DENIED。即使我以管理员身份运行我的程序(在 regedit.exe 中我可以看到密钥的名称是好的,如果它不会出现错误消息会找不到,反正不是ERROR_ACCESS_DENIED

那么我应该怎么做才能访问这些密钥?我确信某些程序可以访问这些密钥。或者至少如何获得他们的默认值(这是我想要的全部)?

在我的计划中,我只能使用RegQueryInfoKey列出其姓名,但无法使用RegOpenKeyEx访问它们。

1 个答案:

答案 0 :(得分:3)

即使作为管理员,当启用UAC时,您在HKLM上也没有KEY_ALL_ACCESS。如果您想要或需要KEY_ALL_ACCESS,则需要升级程序。

降低您所需级别的权利。如果您只想阅读,只需使用KEY_READ!

请注意,您有一个嵌入式清单,没有可以访问的清单,但是访问是虚拟化的,您无法访问真实密钥。