Compartilhar via


Habilitar e desabilitar privilégios no C++

Habilitar um privilégio em um token de acesso permite que o processo execute ações no nível do sistema que não era possível anteriormente. Seu aplicativo deve verificar minuciosamente se o privilégio é apropriado para o tipo de conta, especialmente para os seguintes privilégios poderosos.

Constante de privilégio Valor da cadeia de caracteres Nome de exibição
SE_ASSIGNPRIMARYTOKEN_NAME SeAssignPrimaryTokenPrivilege Substituir um token de nível de processo
SE_BACKUP_NAME SeBackupPrivilege Fazer backup de arquivos e pastas
SE_DEBUG_NAME SeDebugPrivilege Depurar programas
SE_INCREASE_QUOTA_NAME SeIncreaseQuotaPrivilege Ajustar quotas de memória para um processo
SE_TCB_NAME SeTcbPrivilege Atuar como parte do sistema operacional

Antes de habilitar qualquer um desses privilégios potencialmente perigosos, determine que as funções ou operações em seu código realmente exigem os privilégios. Por exemplo, pouquíssimas funções no sistema operacional realmente exigem o SeTcbPrivilege. Para obter uma lista de todos os privilégios disponíveis, consulte Constantes de privilégios.

O exemplo a seguir mostra como habilitar ou desabilitar um privilégio em um token de acesso. O exemplo chama a função LookupPrivilegeValue para obter o LUID ( identificador local exclusivo ) que o sistema local usa para identificar o privilégio. Em seguida, o exemplo chama a função AdjustTokenPrivileges , que habilita ou desabilita o privilégio que depende do valor do parâmetro 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;
}