我想获取HKEY_CLASSES_ROOT\\SOFTWARE\\Classes\\CLSID
密钥下的所有CLSID密钥。
我知道该密钥对于合并的HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID
和HKEY_CURRENT_USER\\SOFTWARE\\Classes\\CLSID
密钥是镜像的。
到目前为止,我可以枚举所有HKEY_CLASSES_ROOT\\SOFTWARE\\Classes\\CLSID
(HKEY_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
访问它们。
答案 0 :(得分:3)
即使作为管理员,当启用UAC时,您在HKLM上也没有KEY_ALL_ACCESS。如果您想要或需要KEY_ALL_ACCESS,则需要升级程序。
降低您所需级别的权利。如果您只想阅读,只需使用KEY_READ!
请注意,您有一个嵌入式清单,没有可以访问的清单,但是访问是虚拟化的,您无法访问真实密钥。