Abilitazione e disabilitazione dei privilegi in C++

L'abilitazione di un privilegio in un token di accesso consente al processo di eseguire azioni a livello di sistema non riuscite in precedenza. L'applicazione deve verificare accuratamente che il privilegio sia appropriato per il tipo di account, in particolare per i privilegi avanzati seguenti.

Costante dei privilegi Valore stringa Nome visualizzato
SE_ASSIGNPRIMARYTOKEN_NAME SeAssignPrimaryTokenPrivilege Sostituzione di token a livello di processo
SE_BACKUP_NAME SeBackupPrivilege Ripristino di file e directory
SE_DEBUG_NAME SeDebugPrivilege Debug di programmi
SE_INCREASE_QUOTA_NAME SeIncreaseQuotaPrivilege Regolazione limite risorse memoria per un processo
SE_TCB_NAME SeTcbPrivilege Agisci come parte del sistema operativo

Prima di abilitare uno di questi privilegi potenzialmente pericolosi, determinare che funzioni o operazioni nel codice richiedono effettivamente i privilegi. Ad esempio, pochissime funzioni nel sistema operativo richiedono effettivamente SeTcbPrivilege. Per un elenco di tutti i privilegi disponibili, vedere Costanti dei privilegi.

Nell'esempio seguente viene illustrato come abilitare o disabilitare un privilegio in un token di accesso. Nell'esempio viene chiamata la funzione LookupPrivilegeValue per ottenere l'identificatore univoco locale (LUID) usato dal sistema locale per identificare il privilegio. L'esempio chiama quindi la funzione AdjustTokenPrivileges , che abilita o disabilita il privilegio che dipende dal valore del parametro bEnablePrivilege .

#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "advapi32.lib")

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