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