【问题标题】:RegOpenKeyEx access denied reading HKEY_LOCAL_MACHINERegOpenKeyEx 访问被拒绝读取 HKEY_LOCAL_MACHINE
【发布时间】:2014-05-29 20:16:54
【问题描述】:

在 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 读取。我在这里错过了什么?

【问题讨论】:

    标签: c++ permissions uac visual-c++-2010


    【解决方案1】:

    您的安装程序需要调整注册表项的安全权限,以便允许非管理员用户访问它。查看RegSetKeySecurity(),或您的安装程序的等价物,或任何数量的可用命令行工具。您可以创建一个 DACL,为 Everyone 用户组或特定用户帐户启用只读访问权限。

    更新:由于您使用的是 Inno Setup,请在注册表设置中尝试此操作:

    [Registry]
    Root: HKLM; Subkey: "Software\MyCompany\MyApp"; Permissions: everyone-read
    

    或者:

    [Registry]
    Root: HKLM; Subkey: "Software\MyCompany\MyApp"; Permissions: users-read
    

    【讨论】:

    • 谢谢。我会尝试其中的一些,但我不确定首字母缩略词 DACL。我正在为我的安装程序使用 Inno Setup;到目前为止,它已被证明非常出色。
    • 阅读Inno documentation,它告诉您如何授予注册表项的权限。
    • @Remy Lebeau - 这就像一个冠军。我是 Inno Setup 的新手;文档中有关权限的详细信息是真正的瑰宝。
    【解决方案2】:

    我写这个答案时你的代码:

    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
        );
    

    【讨论】:

    • SHRegOpenUSKey 是另一个我不熟悉的API,但也将查找。我一直在迭代,但后来开始收到“拒绝访问”代码,所以我开始尝试一些替代方案。
    • -1 您声称RegOpenKeyEx() 不支持路径是错误的。 RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\MyCompany\\MyApp"), ...) 工作正常,这一点从以下事实可以看出:当应用程序在提升状态下运行时它会打开密钥,并且在未提升时拒绝访问。很明显RegOpenKeyEx() 确实知道如何处理路径就好了。我一直使用带有RegCreateKeyEx()RegOpenKeyEx() 的路径,它们工作正常。
    • @RemyLebeau:你是对的。谢谢!我被文档中的“要打开的注册表子项的名称”(说“名称”,而不是“路径”)误导了。
    猜你喜欢
    • 2017-10-30
    • 2010-10-16
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多