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