【问题标题】:RegOpenKeyEx returns error code 5 (ERROR_ACCESS_DENIED)RegOpenKeyEx 返回错误代码 5 (ERROR_ACCESS_DENIED)
【发布时间】:2017-06-30 03:39:55
【问题描述】:

我无法使用 RegOpenKeyEx 函数打开注册表项。我正在编写的特定程序将字体安装到计算机上,并且必须将它们添加到注册表中才能在重新启动后保持安装状态。我是使用注册表的新手,所以我一直在查找,但遇到了问题。这是一个示例,显示了我发送给 RegOpenKeyEx 的参数:

int main() {
    HKEY key;
    long code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts", 0, KEY_ALL_ACCESS, &key);

    if(code != ERROR_SUCCESS) {
        std::cout << code << std::endl;
        return 1;
    }

RegCloseKey(key);
return 0;
}

函数返回 1 (ERROR_INVALID_FUNCTION)。但是,以下确实有效,并返回 0:

HKEY key;
RegOpenKeyEx(HKEY_LOCAL_MACHINE, NULL, 0, KEY_ALL_ACCESS, &key);

我不知道如何继续,所以任何帮助将不胜感激。

编辑:我通过 regedit 确认密钥确实存在。似乎如果 RegOpenKeyEx 的第二个参数不是 NULL,它会返回错误代码 2。

编辑 2:我尝试了多种解决方案,包括在子项上使用 TEXT() 函数并将访问权限更改为 KEY_SET_VALUE,但我仍然遇到相同的错误。我也尝试使用 RegCreateKeyEx。奇怪的是,我仍然得到错误代码 2,虽然有时我得到错误代码 122 (ERROR_INSUFFICENT_BUFFER)。

编辑 3:我更改了错误处理,因此它直接使用函数的返回值而不是 GetLastError()。我现在得到错误代码 5 (ERROR_ACCESS_DENIED)。

【问题讨论】:

  • 您是否在 Regedit 中验证了此密钥确实存在?我的 Windows 10 系统上没有这样的密钥,无论是在普通注册表下还是在 WOW6432Node 重定向下。
  • @MrEricSir 它是AddFontResource() 文档和Font Installation and Deletion 中提到的注册表项。它是指安装在%windir%\fonts 文件夹之外的字体。如果您没有此类字体,则可能永远不会创建密钥
  • 错误码清晰。文件未找到。这条路不存在。你还需要什么解释?
  • 请提供minimal reproducible example。同时最好的猜测:您忽略了来自编译器的关于 RegOpenKeyEx 的无效参数的警告消息,这是由提供窄字符串而不是宽字符串引起的。 (试着让它L"SOFTWARE\\Microsoft...
  • 错误代码再清楚不过了。系统比你更值得信赖。我相信这个系统是正确的。

标签: c++ windows winapi fonts registry


【解决方案1】:

根据微软文档: https://docs.microsoft.com/en-us/windows/win32/api/winreg/nf-winreg-regopenkeyw

RegOpenKey 函数使用默认的安全访问掩码来打开密钥。如果打开密钥需要不同的访问权限,则函数失败,返回 ERROR_ACCESS_DENIED。在这种情况下,应用程序应该使用 RegOpenKeyEx 函数来指定访问掩码。

所以这可能意味着您实际上没有访问密钥的权限。

按照上面页面中的链接,我发现了这个:https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry-key-security-and-access-rights

说:

要查看密钥的当前访问权限,包括预定义的密钥,请使用注册表编辑器 (Regedt32.exe)。导航到所需的键后,转到“编辑”菜单并选择“权限”。

对于我个人遇到问题的密钥,我有以下内容:

由于我不在那里,我无法访问它......(即使我是管理员,也许它需要管理员权限)

如果是单系统问题,您可以在 regedit 中进行更改。

如果您正在制作的软件需要它,则必须找到另一种方法,也许是需要请求管理员权限的脚本。

【讨论】:

    【解决方案2】:

    无论其价值如何,我都遇到了同样的问题,即错误代码 = 5,访问被拒绝。
    在 HKEY_LOCAL_MACHINE 区域内,我尝试使用 Regcreatekeyex、RegOpenKeyEx 和相关函数来打开和 将数据写入 HKEY_LOCAL_MACHINE 区域注册表 --- 并没有成功。所以我尝试使用 HKEY_CURRENT_USER 区域,现在我 成功打开数据并将数据写入 HKEY_CURRENT_USER 区域注册表,并取得了可验证的成功,我看到了成功, 甚至认为我没有在我想要的区域中写入数据。听起来 HKEY_LOCAL_MACHINE 区域有点禁区。

    【讨论】:

      【解决方案3】:

      HKEY_LOCAL_MACHINE 伪键句柄指向名为 \Registry\Machine 的键,该键用作注册表配置单元的安装点之一。我怀疑您是否可以通过标准 Windows API(例如 RegOpenKeyEx)打开此密钥或枚举其子密钥。也许,原生 API (NtOpenKey) 会起作用。

      您可以通过调用RegLoadKey 函数在HKEY_LOCAL_MACHINE 键下创建一个子键。如果需要枚举这样的子键,可以看HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\hivelist下的值;值名称告诉您注册表路径——以\Registry\Machine 开头的是HKEY_LOCAL_MACHINE 的子键。

      HKEY_USERS 可能表现出相同的行为。

      【讨论】:

        猜你喜欢
        • 2017-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-18
        • 2011-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多