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


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

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

Константа привилегий Строковое значение Отображаемое имя
SE_ASSIGNPRIMARYTOKEN_NAME SeAssignPrimaryTokenPrivilege Замена маркера уровня процесса
SE_BACKUP_NAME SeBackupPrivilege Резервное копирование файлов и каталогов
SE_DEBUG_NAME SeDebugPrivilege Отладка программ
УВЕЛИЧЕНИЕ_КВОТЫ_ИМЯ 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;
}