在Windows 7(32位)中,如果我没有在管理员模式下运行,当我在HKEY_LOCAL_MACHINE上调用:: RegOpenKeyEx时,我一直收到错误5(访问被拒绝)。
这是我的代码:
result = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\MyCompany\\MyApp"), 0, KEY_QUERY_VALUE, &keySoftware)
我正在尝试构建一个可以为整个计算机而不是特定用户安装的应用程序。因此,我的安装程序(以管理员模式运行)写入HKEY_LOCAL_MACHINE,安装程序正常工作。
我希望我的应用能够读取我的安装程序放入注册表的数据。我不想更改任何注册表数据。我也尝试过使用KEY_READ和KEY_EXECUTE而不是KEY_QUERY_VALUE。但似乎无论我做什么,我都无法在不使用提升状态的情况下从HKEY_LOCAL_MACHINE读取。我在这里缺少什么?
答案 0 :(得分:2)
您的安装程序需要调整注册表项的安全权限,以便允许非管理员用户访问它。查看RegSetKeySecurity()
,或安装程序的等效工具,或任何可用的命令行工具。您可以创建一个DACL,为Everyone
用户组或特定用户帐户启用只读访问权限。
更新:由于您使用的是Inno安装程序,请在注册表设置中尝试此操作:
[Registry]
Root: HKLM; Subkey: "Software\MyCompany\MyApp"; Permissions: everyone-read
或者:
[Registry]
Root: HKLM; Subkey: "Software\MyCompany\MyApp"; Permissions: users-read
答案 1 :(得分:-1)
我写这个答案的代码:
result = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\MyCompany\\MyApp"), 0, KEY_QUERY_VALUE, &keySoftware)
RegOpenKeyEx
不支持常规路径,只支持直接键名。
要使用它,您必须按层次结构进行迭代。
SHRegOpenUSKey
是支持常规路径的另一种 :
HUSKEY keySoftware;
LSTATUS const result = ::SHRegOpenUSKey(
L"Software\\Microsoft\\MediaPlayer", KEY_QUERY_VALUE, 0, &keySoftware, TRUE
);