【问题标题】:RegOpenKeyEx() returns ERROR_ACCESS_DENIEDRegOpenKeyEx() 返回 ERROR_ACCESS_DENIED
【发布时间】:2013-11-07 14:44:41
【问题描述】:

我想获取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 访问他们。

【问题讨论】:

  • 您将没有对 HKLM 的写入权限。将KEY_ALL_ACCESS 替换为KEY_READ
  • 你为什么使用KEY_ALL_ACCESS
  • HKLM\SOFTWARE\ClassesHKCU\SOFTWARE\Classes 的合并视图位于HKEY_CLASSES_ROOT\CLSID,而不是HKEY_CLASSES_ROOT\SOFTWARE\Classes\CLSID

标签: c++ windows winapi registry regedit


【解决方案1】:

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

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

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

【讨论】:

  • 或者更好的是,使用KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS,因为您可能不需要KEY_READ 包含的其他权限。
  • 谢谢你们俩。更改标志效果很好:) 我确实不需要在密钥上写任何东西,阅读它就足够了。
猜你喜欢
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
相关资源
最近更新 更多