Habilitación y deshabilitación de privilegios en C++
La habilitación de un privilegio en un token de acceso permite al proceso realizar acciones de nivel de sistema que no se pudieron realizar anteriormente. La aplicación debe comprobar exhaustivamente que el privilegio es adecuado para el tipo de cuenta, especialmente para los siguientes privilegios eficaces.
Constante de privilegios | Valor de cadena | Nombre para mostrar |
---|---|---|
SE_ASSIGNPRIMARYTOKEN_NAME | SeAssignPrimaryTokenPrivilege | Reemplazar un token de nivel de proceso |
SE_BACKUP_NAME | SeBackupPrivilege | Hacer copias de seguridad de archivos y directorios |
SE_DEBUG_NAME | SeDebugPrivilege | Programas de depuración |
SE_INCREASE_QUOTA_NAME | SeIncreaseQuotaPrivilege | Ajustar las cuotas de la memoria para un proceso |
SE_TCB_NAME | SeTcbPrivilege | Actuar como parte del sistema operativo |
Antes de habilitar cualquiera de estos privilegios potencialmente peligrosos, determine que las funciones o operaciones del código realmente requieren los privilegios. Por ejemplo, muy pocas funciones del sistema operativo realmente requieren seTcbPrivilege. Para obtener una lista de todos los privilegios disponibles, consulte Constantes de privilegios.
En el ejemplo siguiente se muestra cómo habilitar o deshabilitar un privilegio en un token de acceso. En el ejemplo se llama a la función LookupPrivilegeValue para obtener el identificador único local (LUID) que usa el sistema local para identificar el privilegio. A continuación, el ejemplo llama a la función AdjustTokenPrivileges , que habilita o deshabilita el privilegio que depende del valor del 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;
}