Dela via


Aktivera och inaktivera privilegier i C++

Om du aktiverar en behörighet i en åtkomsttoken kan processen utföra åtgärder på systemnivå som inte kunde utföras tidigare. Din applikation bör noggrant verifiera att privilegiet är lämpligt för kontotypen, särskilt för följande kraftfulla privilegier.

Behörighetskonstant Strängvärde Visningsnamn
SE_ASSIGNPRIMARYTOKEN_NAME SeAssignPrimaryTokenPrivilege Ersätt en token på processnivå
SE_BACKUP_NAME SeBackupPrivilege Säkerhetskopiera filer och kataloger
SE_DEBUG_NAME SeDebugPrivilege Felsöka program
SE_INCREASE_QUOTA_NAME SeÖkaKvantitetsPrivilegium Justera minneskvoter för en process
SE_TCB_NAME SeTcbPrivilege Agera som en del av operativsystemet

Innan du aktiverar någon av dessa potentiellt farliga privilegier ska du fastställa att funktioner eller åtgärder i koden faktiskt kräver behörigheterna. Till exempel kräver väldigt få funktioner i operativsystemet faktiskt SeTcbPrivilege. En lista över alla tillgängliga privilegier finns i Privilege Constants.

I följande exempel visas hur du aktiverar eller inaktiverar en behörighet i en åtkomsttoken. I exemplet anropas funktionen LookupPrivilegeValue för att hämta den lokalt unika identifieraren (LUID) som det lokala systemet använder för att identifiera behörigheten. Sedan anropar exemplet funktionen AdjustTokenPrivileges, som antingen aktiverar eller inaktiverar behörigheten som är beroende av värdet för parametern 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, 
           0, 
           (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;
}