Povolení a zakázání oprávnění v jazyce C++
Povolení oprávnění v přístupovém tokenu umožňuje procesu provádět akce na úrovni systému, které nebylo možné dříve provést. Vaše aplikace by měla důkladně ověřit, jestli je oprávnění vhodné pro typ účtu, zejména pro následující výkonná oprávnění.
Konstanta oprávnění | Řetězcová hodnota | Zobrazovaný název |
---|---|---|
SE_ASSIGNPRIMARYTOKEN_NAME | SeAssignPrimaryTokenPrivilege | Nahrazení tokenu na úrovni procesu |
SE_BACKUP_NAME | SeBackupPrivilege | Zálohování souborů a adresářů |
SE_DEBUG_NAME | SeDebugPrivilege | Ladění programů |
ZVÝŠENÍ_KVÓTY_NÁZEV | SeIncreaseQuotaPrivilege | Úprava kvót paměti pro proces |
SE_TCB_NAME | SeTcbPrivilege | Jednat jako součást operačního systému |
Před povolením některé z těchto potenciálně nebezpečných oprávnění určete, že funkce nebo operace v kódu skutečně vyžadují oprávnění. Například velmi málo funkcí v operačním systému skutečně vyžaduje SeTcbPrivilege. Seznam všech dostupných oprávnění najdete v tématu Konstanty oprávnění.
Následující příklad ukazuje, jak povolit nebo zakázat výsadu v přístupovém tokenu. Příklad volá funkci LookupPrivilegeValue, která získá místně jedinečný identifikátor (LUID), který místní systém používá k identifikaci oprávnění. Potom příklad volá funkci AdjustTokenPrivileges, která buď povolí nebo zakáže oprávnění, která závisí na hodnotě bEnablePrivilege parametru.
#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;
}