0

我想获取密钥下的所有 CLSID 密钥HKEY_CLASSES_ROOT\\SOFTWARE\\Classes\\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.

4

1 回答 1

3

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

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

并注意您有一个嵌入式清单,没有清单您可能会获得访问权限,但该访问是虚拟化的,您无法访问真正的密钥。

于 2013-11-07T15:41:28.917 回答