RegLoadKey 给出错误代码 5(拒绝访问)

Posted

技术标签:

【中文标题】RegLoadKey 给出错误代码 5(拒绝访问)【英文标题】:RegLoadKey is giving error code 5 (Access Denied) 【发布时间】:2012-09-01 09:25:21 【问题描述】:

您好,我正在尝试从 HKLM\\SYSTEM\\CurrentControlSet\\Services\\Fax 加载密钥,但出现错误 5(拒绝访问)。我无法弄清楚我的代码有什么问题。

这是我的代码

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

BOOL SetPrivilege(
    HANDLE hToken,          // access token handle
    LPCTSTR lpszPrivilege,  // name of privilege to enable/disable
    BOOL bEnablePrivilege   // to enable or disable privilege
) 

    TOKEN_PRIVILEGES tp;
    LUID luid;

    if ( !LookupPrivilegeValue( 
        NULL,            // lookup privilege on local system
        lpszPrivilege,   // privilege to lookup 
        &luid ) )        // receives LUID of privilege

    printf("LookupPrivilegeValue error: %u\n", GetLastError() ); 
    return FALSE; 


tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
    tp.Privileges[0].Attributes = 0;

// Enable the privilege or disable all privileges.

if ( !AdjustTokenPrivileges(
       hToken, 
       FALSE, 
       &tp, 
       sizeof(TOKEN_PRIVILEGES), 
       (PTOKEN_PRIVILEGES) NULL, 
       (PDWORD) NULL) )
 
      printf("AdjustTokenPrivileges error: %u\n", GetLastError() ); 
      return FALSE; 
 

if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)


      printf("The token does not have the specified privilege. \n");
      return FALSE;
 

return TRUE;

void _tmain(int argc, TCHAR *argv[])


HKEY   hKey;
LONG   lErrorCode;
HANDLE ProcessToken;
LPCWSTR subkey =  L"SYSTEM\\CurrentControlSet\\Services\\Fax";


if (OpenProcessToken(GetCurrentProcess(), 
        TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &ProcessToken)) 


    SetPrivilege(ProcessToken, SE_BACKUP_NAME, TRUE);
    SetPrivilege(ProcessToken, SE_RESTORE_NAME, TRUE);
    SetPrivilege(ProcessToken, SE_RESTORE_NAME, TRUE);




lErrorCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey ,
                              0, KEY_ALL_ACCESS, &hKey);
if (lErrorCode != ERROR_SUCCESS)
   
  _tprintf(TEXT("Error in RegOpenKeyEx (%d).\n"), lErrorCode);
  return;
   
else

    _tprintf(TEXT("Key is successfully Opened\n"));


lErrorCode = RegSaveKey(hKey,L"c:\\load.reg",0);
if (lErrorCode != ERROR_SUCCESS)
   
  _tprintf(TEXT("Error in RegSaveKey (%d).\n"), lErrorCode);
  return;
   
else

    _tprintf(TEXT("Key is successfully Saved \n"));


lErrorCode = RegLoadKey(HKEY_LOCAL_MACHINE,subkey,L"c:\\load.reg");
if (lErrorCode != ERROR_SUCCESS)
   
  _tprintf(TEXT("Error in RegLoadKey (%d).\n"), lErrorCode);
  return;
   
else

    _tprintf(TEXT("Key is successfully loaded \n"));


lErrorCode = RegCloseKey(hKey);
if (lErrorCode != ERROR_SUCCESS)
   
  _tprintf(TEXT("Error in closing the key (%d).\n"), lErrorCode);
  return;
   
else

    _tprintf(TEXT("Key is successfully closed \n"));


这是输出

Key is successfully Opened 
Key is successfully Saved 
Error in RegLoadKey (5).

【问题讨论】:

您是否尝试过以管理员身份运行应用程序?所有想要访问 HKEY_LOCAL_MACHINE 的东西都需要以管理员身份运行,否则会失败。 不,我只以管理员身份运行我的 cmd... 我不知道你所说的“不”是什么意思。如果您还没有尝试过,您可以右键单击附件中的命令提示符并以管理员身份运行,然后运行应用程序。另一种选择是以编程方式要求特权升级。在 MFC 中,这可以通过清单来完成。如果你不使用 MFC,你可以研究一下如何在代码中严格执行。 @Alex:OP 的代码检查是否成功分配了必要的权限,因此如果它没有在提升的上下文中运行,它将生成明确的错误消息。 【参考方案1】:

RegLoadKey 只能用于将新配置单元加载到注册表中。您不能使用它来覆盖现有配置单元的子项。

您可能想改用RegRestoreKey

补充:

据我所知,hives 只能在注册表根目录中加载,即它们必须是 HKEY_LOCAL_MACHINE\fooHKEY_USERS\foo,而不是 HKEY_LOCAL_MACHINE\foo\bar。另外,我不认为您可以使用已经存在的名称加载配置单元,例如,您不能将配置单元加载到HKEY_LOCAL_MACHINE\SOFTWARE。即使你可以做这些事情,你也会改变你对内容的看法,而不是合并它,当系统重新启动时,原始内容会重新出现。如前所述,如果要将数据插入现有配置单元,请使用 RegRestoreKey 而不是 RegLoadKey

您询问RegLoadKey 的用例:并不多。大多数情况下,它由操作系统使用;例如,这就是您登录时将个人配置单元加载到HKEY_USERS\username 的方式。有一些奇怪的情况,例如resetting a password offline 或以其他方式修改另一个Windows 实例的注册表。我在教学实验室的计算机上用于无人值守安装 Windows 的过程取决于修改 Windows 安装映像的注册表以禁用键盘和鼠标。

【讨论】:

新配置单元是指由代码创建的配置单元,或者我们可以创建一个密钥条目,然后在其中加载保存的配置单元。如果你的意思是后者,那么我会遇到同样的错误。我已经在路径 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\LoadTest 中创建了一个密钥,但我仍然无法将配置单元加载到 LoadTest 中。我仍然遇到同样的错误。另外,如果您的意思是前者,那么为什么有人实际上要创建配置单元的副本?我想不出这个用例,如果你详细说明前者会非常有帮助。 @user1289810:我在回答中添加了新内容来解决您的问题。

以上是关于RegLoadKey 给出错误代码 5(拒绝访问)的主要内容,如果未能解决你的问题,请参考以下文章

Spring security hasRole() 给出错误 403 - 访问被拒绝

批量插入时操作系统错误代码 5(拒绝访问。)

我创建了一个子域,当我尝试访问它时,它给出了拒绝访问错误

System.IO.Copy 操作间歇性地在 .Net 4.0 C# 控制台应用程序中给出拒绝访问错误

带有自定义 AuthenticationProvider 的 spring security 给出了拒绝访问错误

如何修复 CopyFile() 错误 5 - 拒绝访问错误