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