2008-12-19 7 views
5

estoy tratando de guardar el contenido de una clave de registro particular a un archivo usando la API RegSaveKey():RegSaveKey vuelve 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); 

Sin embargo, RegSaveKey() está volviendo ERROR_PRIVILEGE_NOT_HELD. La documentación del SDK dice que "El proceso de llamada debe tener habilitado el privilegio SE_BACKUP_NAME". El proceso se ejecuta como administrador local o como servicio.

¿Alguna idea?

Respuesta

8

A pesar de que se ejecuta como un administrador local o como un servicio, es probable que no tenga habilitado el privilegio "Copia de seguridad" de forma predeterminada. Deberá habilitar este privilegio antes de intentar guardar la clave de registro.

MSDN tiene un buen ejemplo sobre cómo habilitar un privilegio de seguridad en C/C++: http://msdn.microsoft.com/en-us/library/aa446619(VS.85).aspx. Si se incluye la función de ejemplo definida en esa página, a continuación, puede simplemente llamar:

HANDLE ProcessToken; 

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

    SetPrivilege(ProcessToken, SE_BACKUP_NAME, TRUE); 

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

Por otra parte, también hay un ejemplo basado en VB on the wayback machine.

+1

Incluso después de hacerlo, se produce un error! – sergiol

+0

@sergiol: descubrí que también necesita habilitar el privilegio SE_RESTORE_NAME. – GrahamS

3

Tenga en cuenta que SetPrivilege() de la respuesta de Reuben es, de acuerdo con MSDN definida por el usuario, el cuerpo de la función pasa de este modo ...

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; 
} 
Cuestiones relacionadas