Partager via


Activation et désactivation des privilèges en C++

L’activation d’un privilège dans un jeton d’accès permet au processus d’effectuer des actions au niveau du système qu’il ne pouvait pas effectuer auparavant. Votre application doit vérifier soigneusement que le privilège est approprié au type de compte, en particulier pour les privilèges puissants suivants.

Constante de privilège Valeur de chaîne Nom d’affichage
SE_ASSIGNPRIMARYTOKEN_NAME SeAssignPrimaryTokenPrivilege Remplacer un jeton de niveau processus
SE_BACKUP_NAME SeBackupPrivilege Sauvegarder des fichiers et des répertoires
SE_DEBUG_NAME SeDebugPrivilege Déboguer les programmes
SE_INCREASE_QUOTA_NAME SeIncreaseQuotaPrivilege Ajuster les quotas de mémoire pour un processus
SE_TCB_NAME SeTcbPrivilege Agir en tant que partie du système d'exploitation

Avant d’activer l’un de ces privilèges potentiellement dangereux, déterminez que les fonctions ou opérations de votre code nécessitent réellement les privilèges. Par exemple, très peu de fonctions dans le système d’exploitation nécessitent le SeTcbPrivilege. Pour obtenir la liste de tous les privilèges disponibles, consultez Constantes de privilèges.

L’exemple suivant montre comment activer ou désactiver un privilège dans un jeton d’accès. L’exemple appelle la fonction LookupPrivilegeValue pour obtenir l’identificateur unique local (LUID) que le système local utilise pour identifier le privilège. Ensuite, l’exemple appelle la fonction AdjustTokenPrivileges , qui active ou désactive le privilège qui dépend de la valeur du paramètre 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;
}