Sdílet prostřednictvím


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