Establecer prioridad alta permanente a un servicio de Windows con PowerShell

¿Quieres que tu servicio de Windows arranque siempre con prioridad alta y se mantenga así tras cada reinicio? A continuación encontrarás una guía paso a paso, buenas prácticas y explicaciones técnicas para lograrlo de forma segura con PowerShell y el Programador de tareas.

Índice

Por qué Windows “olvida” la prioridad de un servicio

Cuando Windows crea un nuevo proceso —incluidos los servicios instalados con StartupType = Automatic—, establece la prioridad de CPU según la clase por defecto del sistema (habitualmente Normal). Una vez que el servicio finaliza o reinicia, el sistema vuelve a asignar la prioridad normal, sin importar los ajustes manuales que hayas aplicado con el Administrador de tareas. Por eso, si deseas que MyService.exe trabaje siempre con prioridad alta, es imprescindible volver a aplicársela cada vez que el equipo arranca.

Requisitos previos

  • Windows 10, Windows 11 o Windows Server 2016/2019/2022.
  • Cuenta con privilegios administrativos (necesarios para crear tareas que se ejecuten “Con los privilegios más altos”).
  • PowerShell 5.1 o posterior (incluido de serie en las versiones modernas de Windows).

Conceptos básicos sobre clases de prioridad

Windows utiliza las clases de prioridad de la API Win32 para decidir la proporción de tiempo de CPU que recibe cada proceso. En un sistema con muchos servicios, otorgar una prioridad superior a los procesos críticos mejora la capacidad de respuesta, pero asignar RealTime de forma indiscriminada puede bloquear al resto. En la mayoría de los casos, High es suficiente para servicios intensivos en cómputo o que deban reaccionar sin latencia apreciable.

Clase Win32ConstanteValor WMIUso recomendado
IdleIDLEPRIORITYCLASS64Tareas en segundo plano sin relevancia temporal.
Below NormalBELOWNORMALPRIORITY_CLASS16384Procesos auxiliares con poca urgencia.
NormalNORMALPRIORITYCLASS32Valor predeterminado de Windows.
Above NormalABOVENORMALPRIORITY_CLASS32768Procesos interactivos con cierta prioridad.
HighHIGHPRIORITYCLASS128Servicios críticos que no deben competir con aplicaciones comunes.
RealTimeREALTIMEPRIORITYCLASS256Reservado a controladores y software de tiempo real; úsalo con extrema precaución.

Creación del script de PowerShell

El siguiente script localiza la instancia de MyService.exe mediante WMI y establece su clase de prioridad en High (128). Guárdalo en C:\Scripts\SetServicePriority.ps1 y asegúrate de que la carpeta existe:


SetServicePriority.ps1
Cambia la clase de prioridad de MyService.exe a High (128)
Get-WmiObject Win32_Process -Filter 'Name = "MyService.exe"' |
    ForEach-Object { $_.SetPriority(128) }

Detalles clave del script:

  • Get-WmiObject Win32_Process extrae todos los procesos activos con el nombre especificado.
  • SetPriority(128) invoca el método WMI equivalente a SetPriorityClass de la Win32 API.
  • El script es idempotente: en caso de que el servicio ya esté en prioridad alta, la llamada devuelve éxito sin cambios.

Configuración de la tarea programada

Para que el script se ejecute automáticamente cada vez que se inicie Windows (antes incluso del inicio de sesión del usuario), vamos a programar una tarea del sistema.

  1. Abre Task Scheduler (Programador de tareas) y selecciona “Create Task”.
  2. En la pestaña General, define:
    • Name: Set MyService Priority.
    • Security options: marca Run with highest privileges.
    • Configure for: elige la versión de Windows correspondiente.
  3. En la pestaña Triggers, pulsa New… y selecciona:
    • Begin the task: At startup.
    • Deja la casilla Delay task vacía salvo que quieras posponer la ejecución.
  4. En la pestaña Actions, pulsa New… y configura:
    • Action: Start a program.
    • Program/script: powershell.exe
    • Add arguments: -ExecutionPolicy Bypass -File "C:\Scripts\SetServicePriority.ps1"
  5. Guarda la tarea y verifica que aparezca en la biblioteca de tareas.

Consejos de endurecimiento

  • Firma digitalmente el script para impedir modificaciones malintencionadas. Agrega -ExecutionPolicy AllSigned al argumento si tu infraestructura PKI lo permite.
  • Establece permisos NTFS de solo lectura para C:\Scripts\SetServicePriority.ps1 a fin de impedir cambios accidentales.
  • Si tu servicio se ejecuta bajo una cuenta específica (p. ej. Network Service), asegúrate de que la tarea se ejecute como NT AUTHORITY\SYSTEM o como otra cuenta con permiso de enumerar procesos ajenos; de lo contrario, el cmdlet no podrá modificar la prioridad.

Validación y pruebas

Una vez creada la tarea:

  1. Reinicia el servidor o PC.
  2. Abre el Administrador de tareas, pestaña Details, haz clic derecho sobre MyService.exe y comprueba que aparece “High” en la columna Base priority. Si no ves la columna, pulsa Select columns y actívala.
  3. Revisa el Visor de sucesos (Event ViewerApplications and Services LogsMicrosoft → Windows → TaskScheduler) para confirmar que la tarea se completó con el código 0x0.

Fallback manual: también puedes ejecutar el script a mano con .\SetServicePriority.ps1 desde una consola de PowerShell elevada. Esto es útil para pruebas de mantenimiento o entornos donde no se permite agregar tareas al arranque.

Métodos alternativos

Modificar el código fuente del servicio

Si tienes acceso al proyecto, incrusta la llamada a SetPriorityClass durante la inicialización:


#include <windows.h>

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
if (fdwReason == DLL\PROCESS\ATTACH) {
SetPriorityClass(GetCurrentProcess(), HIGH\PRIORITY\CLASS);
}
return TRUE;
} 

Ventajas: la prioridad se establece en cuanto el proceso se inicia, sin depender de componentes externos. Desventajas: debes recompilar y volver a desplegar el servicio; además, un error en el código puede provocar bloqueos.

Utilizar herramientas de administración de sistemas

Existen soluciones comerciales que permiten definir plantillas de prioridad para procesos críticos mediante políticas centralizadas (GPO, SCCM, Intune). No obstante, para un único servicio, la combinación de PowerShell + Task Scheduler suele ser suficiente y no requiere software adicional.

Buenas prácticas y advertencias

  • Evita RealTime salvo que sea absolutamente indispensable y comprendas los riesgos (una DLL en bucle infinito puede congelar el equipo).
  • Monitorea el rendimiento con Perfmon: observa la cola de CPU (System \ Processor Queue Length) y el % de tiempo de procesador del servicio. Si otros procesos empiezan a mostrar latencia, considera bajar a Above Normal.
  • Documenta la tarea y el script en tu wiki de TI; en auditorías, la prioridad alterada puede levantar sospechas si no está justificada.
  • En servidores con Hyper‑V, la prioridad de la host OS no influye directamente en las máquinas virtuales, pero un proceso mal configurado puede hacer overcommit de CPU y reducir el rendimiento de los VM.

Automatización a gran escala

Si gestionas un parque de cientos de equipos, copia el script a la carpeta SYSVOL y despliega la tarea a través de una GPO de Scheduled Tasks. Esta directiva se encuentra en Computer Configuration → Preferences → Control Panel Settings → Scheduled Tasks. Con ello mantendrás la configuración coherente en toda la organización.

Preguntas frecuentes

¿Puedo aplicar la misma técnica a varios servicios simultáneamente? Sí. Modifica el filtro WMI a Name LIKE '%Service%' o bien introduce un array de nombres y recórrelo con ForEach-Object. ¿Qué ocurre si el servicio se recicla durante el día? Task Scheduler solo ejecuta el script al arrancar Windows. Si el servicio se reinicia sin reiniciar el sistema, su prioridad volverá a Normal. Solución: agrega un disparador adicional “On event” que vigile el ID 7036 de Service Control Manager. ¿Esto viola las políticas de soporte de Microsoft? No, siempre que no eleves procesos propios de Windows a RealTime. Microsoft admite el ajuste de prioridades mediante API documentadas.

Resumen

Asignar una prioridad constante de CPU a un servicio es tan sencillo como:

  1. Escribir un script de PowerShell que use WMI para fijar la clase de prioridad.
  2. Programar la ejecución del script al arrancar el sistema con privilegios elevados.

Con estas dos piezas, tu servicio MyService.exe arrancará siempre en prioridad alta, mejorando la capacidad de respuesta sin intervención manual. Recuerda monitorizar el entorno para asegurarte de que el ajuste beneficia al rendimiento global y no perjudica a otros procesos.

Índice