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