Включение и отключение привилегий в 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;
}