【发布时间】:2013-11-07 14:44:41
【问题描述】:
我想获取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 访问他们。
【问题讨论】:
-
您将没有对 HKLM 的写入权限。将
KEY_ALL_ACCESS替换为KEY_READ。 -
你为什么使用
KEY_ALL_ACCESS? -
HKLM\SOFTWARE\Classes和HKCU\SOFTWARE\Classes的合并视图位于HKEY_CLASSES_ROOT\CLSID,而不是HKEY_CLASSES_ROOT\SOFTWARE\Classes\CLSID。
标签: c++ windows winapi registry regedit