RegOpenKeyEx返回错误代码5(ERROR_ACCESS_DENIED)

时间:2017-02-11 23:04:15

标签: c++ windows winapi fonts registry

我无法使用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);

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

编辑:我用注册表证实密钥确实存在。似乎如果RegOpenKeyEx的第二个参数不是NULL,则返回错误代码2.

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

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

3 个答案:

答案 0 :(得分:0)

根据Microsoft文档: 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)。导航到所需的键后,转到“编辑”菜单,然后选择“权限”。

对于我个人遇到的钥匙,我有以下几点:

Key permission

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:-2)

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

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

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