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;
}