RegLoadKey donne le code d’erreur 5 (access refusé)

Bonjour, j’essaie de charger une clé depuis HKLM\\SYSTEM\\CurrentControlSet\\Services\\Fax mais je reçois l’erreur 5 (access refusé). Je ne suis pas capable de comprendre ce qui ne va pas avec mon code.

Voici mon code

 #include  #include  #include  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].Atsortingbutes = SE_PRIVILEGE_ENABLED; else tp.Privileges[0].Atsortingbutes = 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")); } } 

C’est la sortie

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

RegLoadKey ne peut être utilisé que pour charger une nouvelle hive dans le registre. Vous ne pouvez pas l’utiliser pour écraser une sous-clé d’une hive existante.

Vous voudrez probablement utiliser RegRestoreKey place.

Additionnel:

À ma connaissance, les hives ne peuvent être chargées qu’à la racine du registre, c’est-à-dire qu’elles doivent être HKEY_LOCAL_MACHINE\foo ou HKEY_USERS\foo , jamais HKEY_LOCAL_MACHINE\foo\bar . De plus, je ne pense pas que vous puissiez charger une hive avec un nom qui existe déjà. Par exemple, vous ne pouvez pas charger une hive dans HKEY_LOCAL_MACHINE\SOFTWARE . Même si vous pouviez faire ces choses-là, vous changeriez votre vue du contenu sans le fusionner, et lorsque le système serait redémarré, le contenu d’origine réapparaîtrait. Comme indiqué précédemment, si vous souhaitez insérer des données dans un RegRestoreKey de RegLoadKey existant, utilisez RegRestoreKey plutôt que RegLoadKey .

Vous posez des questions sur les cas d’utilisation de RegLoadKey : ils ne sont pas nombreux. Généralement, il est utilisé par le système d’exploitation. Par exemple, lorsque vous vous connectez, votre hive personnelle est chargée dans HKEY_USERS\username . Il existe des cas inhabituels, tels que la réinitialisation d’un mot de passe en mode hors connexion ou la modification du registre d’une autre instance Windows. Le processus que j’utilise pour l’installation sans assistance de Windows sur les ordinateurs de mon laboratoire d’enseignement dépend de la modification du registre de l’image d’installation de Windows pour désactiver le clavier et la souris.