Поделиться через


Включение и отключение привилегий в C++

Включение привилегии в маркере доступа позволяет процессу выполнять действия на уровне системы, которые он не мог ранее. Приложение должно тщательно проверить, соответствует ли привилегия типу учетной записи, особенно для следующих мощных привилегий.

Константа привилегий Строковое значение Отображаемое имя
SE_ASSIGNPRIMARYTOKEN_NAME SeAssignPrimaryTokenPrivilege Замена токена уровня процесса
SE_BACKUP_NAME SeBackupPrivilege Архивация файлов и каталогов
SE_DEBUG_NAME SeBackupPrivilege Отладка программ
SE_INCREASE_QUOTA_NAME SeIncreaseQuotaPrivilege Настройка квот памяти для процесса
SE_TCB_NAME SeTcbPrivilege работа в качества части операционной системы;

Прежде чем включать какие-либо из этих потенциально опасных привилегий, определите, что функции или операции в коде на самом деле требуют привилегий. Например, очень немногим функциям в операционной системе фактически требуется SeTcbPrivilege. Список всех доступных привилегий см. в разделе Константы привилегий.

В следующем примере показано, как включить или отключить привилегию в маркере доступа. В примере вызывается функция LookupPrivilegeValue для получения локального уникального идентификатора (LUID), который локальная система использует для идентификации привилегии. Затем в примере вызывается функция AdjustTokenPrivileges , которая включает или отключает привилегии, зависящие от значения параметра 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;
}