2008-12-19 9 views
5

J'essaie de sauvegarder le contenu d'une clé de Registre particulière à un fichier en utilisant l'API RegSaveKey():RegSaveKey retourne ERROR_PRIVILEGE_NOT_HELD

HKEY key; 
LRESULT result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\MyProduct", 0, KEY_ACCESS_ALL, &key); 
result = RegSaveKey(key, L"c:\\temp\\saved.reg", NULL); 

Cependant, RegSaveKey() est de retour ERROR_PRIVILEGE_NOT_HELD. La documentation SDK indique que "Le processus appelant doit avoir le privilège SE_BACKUP_NAME activé". Le processus s'exécute en tant qu'administrateur local ou en tant que service.

Des idées?

Répondre

8

Malgré l'exécution en tant qu'administrateur local ou en tant que service, le privilège "Backup" n'est probablement pas activé par défaut. Vous devrez activer ce privilège avant d'essayer d'enregistrer la clé de Registre.

MSDN a un bon exemple sur la façon de permettre un privilège de sécurité en C/C++: http://msdn.microsoft.com/en-us/library/aa446619(VS.85).aspx. Si vous incluez la fonction d'échantillonnage défini sur cette page, vous pouvez simplement appeler:

HANDLE ProcessToken; 

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

    SetPrivilege(ProcessToken, SE_BACKUP_NAME, TRUE); 

    // Save reg key now... 
    ... 
} 

Sinon, il y a aussi un exemple à base de VB-on the wayback machine.

+1

Même après l'avoir fait, il échoue! – sergiol

+0

@sergiol: J'ai trouvé que vous devez également activer le privilège SE_RESTORE_NAME. – GrahamS

3

Notez que SetPrivilege() de la réponse est reuben définie par l'utilisateur, selon MSDN, le corps de la fonction va donc ...

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; 
} 
Questions connexes