RegLoadKey is giving error code 5 (Access Denied)

↘锁芯ラ 提交于 2019-12-23 01:13:33

问题


Hi I'm trying to load a key from HKLM\\SYSTEM\\CurrentControlSet\\Services\\Fax but i'm getting error 5 (Access Denied). I'm not able to figure it out what is wrong with my code.

Here is my code

#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"));
}
}

This is the output

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

回答1:


RegLoadKey can only be used to load a new hive into the registry. You can't use it to overwrite a subkey of an existing hive.

You probably want to use RegRestoreKey instead.

Additional:

To the best of my knowledge, hives can only be loaded at a registry root, i.e., they must be HKEY_LOCAL_MACHINE\foo or HKEY_USERS\foo, never HKEY_LOCAL_MACHINE\foo\bar. Also, I don't think you can load a hive with a name that already exists, e.g., you can't load a hive into HKEY_LOCAL_MACHINE\SOFTWARE. Even if you could do these things, you'd be changing your view of the content, not merging it, and when the system was rebooted the original content would reappear. As previously mentioned, if you want to insert data into an existing hive, use RegRestoreKey rather than RegLoadKey.

You ask about the use cases for RegLoadKey: there aren't many. Mostly, it's used by the operating system; for example, that's how your personal hive is loaded into HKEY_USERS\username when you log in. There are some oddball cases, such as resetting a password offline or otherwise modifying the registry of another Windows instance. The process I use for the unattended installation of Windows on the computers in my teaching lab depends on modifying the registry of the Windows installation image to disable the keyboard and mouse.



来源:https://stackoverflow.com/questions/12226546/regloadkey-is-giving-error-code-5-access-denied

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!