Programar una tarea que se ejecute en respuesta a un evento en Windows Server 2025
Estos últimos días, hemos dedicado algunos artículos a dos cuestiones diferentes, pero que pueden estar relacionadas: la automatización de tareas y la supervisión de los sucesos que puedan haber ocurrido en el sistema.
Pues bien, hoy comprobaremos esa relación, combinando ambas habilidades para hacer que nuestro sistema reaccione a una determinada situación llevando a cabo una acción concreta.
Si no has leído los artículos a los que hacemos referencia, quizás sea el momento de echarles un vistazo:
En particular, a modo de ejemplo, hoy te explicaremos cómo lograr que, el sistema operativo que estamos administrando, nos envíe un mensaje de Telegram cuando alguno de los usuarios cometa un error al autenticarse.
Esto no sólo funcionará con los usuarios locales, sino que afectará también a los usuarios del dominio que dispongan de una cuenta en el servidor.
Obviamente, si un usuario comete un error al escribir su contraseña, recibiremos un mensaje y la cosa no tendrá mayor trascendencia. Sin embargo, si comenzamos a recibir muchos correos electrónicos en muy poco tiempo, llegaremos fácilmente a la conclusión de que alguien está intentando obtener un acceso indebido al sistema.
Como los detalles que recibiremos son bastante concretos, sabremos también el lugar preciso desde el que se está produciendo dicho intento.
Como en otras ocasiones, dado que la tarea es un poco larga, la dividiremos en diferentes fases:
-
Explicaremos cómo configurar Telegram para que podamos enviarle mensajes desde Windows Server.
-
Explicaremos cómo crear un script en PowerShell que se encargue del envío de los mensajes.
Lo primero será cambiar su configuración predeterminada para que admita la ejecución de scripts locales. Probablemente ya sepas que esta tarea hay que hacerla sólo una vez, por lo que, si ya programas scripts en tu sistema, es casi seguro que podrás saltarte este paso.
-
A continuación, crearemos una carpeta donde guardar nuestros scripts.
Lo haremos en un lugar fácilmente accesible para no tener que escribir rutas muy largas en el futuro.
-
Después, crearemos nuestro archivo de script, escribiremos su contenido y comprobaremos que funciona.
-
Cuando lo tengamos, programaremos la tarea que ejecute el script cada vez que un usuario cometa un error de autenticación.
-
Por último, comprobaremos que todo funciona correctamente.
Como ves, tenemos por delante un poco de trabajo, así es que, pasaremos a la acción…
Configurar Telegram para recibir mensajes automáticos
Para simplificar este ejemplo, he abierto mi cuenta de Telegram en el navegador del propio servidor Windows Server 2025. Sin embargo, esta tarea puedes realizarla directamente en tu teléfono o en un ordenador diferente.
La idea es localizar un usuario especial de Telegram llamado @BotFather.
De este modo, iniciamos una nueva conversación con @BotFather, que es el bot oficial de Telegram para crear y administrar otros bots. Con él, no solo registraremos un nuevo bot, también podremos ponerle un nombre, obtener un token para conectarlo a una aplicación o, en nuestro caso, a un servicio externo e incluso podríamos ponerle una imagen que nos facilite identificarlo.
Para crear nuestro bot, solo tenemos que escribir el mensaje:
/newbot
Al hacerlo, recibimos inmediatamente una respuesta en la que @BotFather nos pide un nombre para el nuevo bot. Yo he decidido llamarlo SomeBooksAlert, pero tú puedes llamarlo como prefieras.
A continuación, debemos escribir un nombre de usuario para el bot. Como ves en el mensaje, debe terminar, precisamente, en ‘bot‘. Como ves en la imagen, yo he necesitado un par de intentos para dar con un nombre que no exista.
Como respuesta, @BotFather te devolverá un mensaje bastante largo, con información sobre el uso del nuevo bot. Aún así, lo que realmente nos importa en este momento es el Token API. Un código alfanumérico bastante largo, que verás en un color diferente.
Lo siguiente será obtener el ID de usuario. Para encontrarlo, debemos volver al cuadro de búsqueda para localizar un nuevo bot llamado @userinfobot. Debes tener cuidado, porque he detectado varios boots con nombres similares.
Con estos dos datos, estamos listos para comenzar a trabajar en el script.
Habilitar a PowerShell para ejecutar scripts de forma local
El primer inconveniente que encontraremos, cuando tratemos de ejecutar scripts de PowerShell en Windows Server 2025, es que esta capacidad está restringida por cuestiones de seguridad. No obstante, para levantar la restricción sólo tenemos que seguir estos sencillos pasos:
-
Comenzamos por abrir una ventana de PowerShell.
Hacemos clic sobre el botón Inicio con el botón derecho del ratón y, en el menú de contexto que aparece, elegimos Terminal.
Observa que, en el menú, aparecen dos opciones: Terminal y Terminal (Administrador), pero en nuestro caso son equivalentes, porque debemos tener iniciada la sesión con la cuenta Administrador (o, al menos, con una cuenta con privilegios administrativos).
-
Una vez que tengamos en pantalla la ventana de Windows PowerShell, escribiremos la siguiente orden:
Set-ExecutionPolicy RemoteSigned
El cmdlet Set-ExecutionPolicy nos permite elegir el tipo de scripts que pueden ejecutarse en nuestro sistema. Disponemos de cuatro posibles valores:
-
Restricted: No permitirá la ejecución de ningún script. De este modo, PowerShell sólo puede utilizarse de forma interactiva.
-
AllSigned: Únicamente pueden ejecutarse scripts firmados por un autor de confianza.
-
RemoteSigned: Sólo los scripts descargados deberán estar firmados por un autor de confianza antes de poder ejecutarlos.
-
Unrestricted: No habrá restricciones para la ejecución de scripts de PowerShell.
Recuerda que Set-ExecutionPolicy necesita ejecutarse con privilegios administrativos. En esta ocasión no nos hemos preocupado de este aspecto porque tenemos iniciada la sesión con la cuenta Administrador, por lo que ya está cubierto este aspecto.
Puedes encontrar más información sobre el cmdlet Set-ExecutionPolicy en la dirección http://technet.microsoft.com/en-us/library/ee176961.aspx
-
El cmdlet Set-ExecutionPolicy RemoteSigned sólo debe ejecutarse la primera vez que necesitemos ejecutar scripts de PowerShell en el sistema.
Crear una carpeta donde guardar nuestros scripts
Ya que tenemos la consola abierta, podemos aprovechar para crear la carpeta donde guardar nuestros scripts. Por ejemplo, escribiendo lo siguiente:
mkdir c:\scripts
Donde c:\scripts es el nombre del directorio que hemos elegido. Tú puedes llamarlo de cualquier otra forma.
Crear el script y escribir su contenido
Una vez completado el trámite anterior, ya podemos comenzar con el contenido del script propiamente dicho. Quizás lo más habitual sea ejecutar el editor, escribir las órdenes necesarias y, después, guardarlo con el nombre que decidamos. Sin embargo, ya que tenemos abierta la ventana de PowerShell, nosotros vamos a hacerlo un poco diferente: crearemos un archivo vacío y, después, lo abriremos para crear su contenido.
Para crear el archivo, sólo tenemos que escribir lo siguiente:
New-Item "C:\scripts\Enviar-Eventos.ps1"
Como es lógico, tú puedes usar un nombre diferente para el archivo.
Después de esto, ya podemos cerrar la ventana de PowerShell.
Lo siguiente será escribir el script. Podemos hacerlo usando simplemente el Bloc de notas de Windows, pero PowerShell dispone de un entorno integrado que es mucho más fácil de utilizar. Me refiero a PowerShell ISE (Integrated Scripting Engine).
Sin abandonar el entorno de PowerShell ISE podemos escribir comandos y cmdlets, escribir scripts, probarlos y depurarlos. Además, incluye coloreado de sintaxis, auto-completado de cmdlets, edición multilínea, y un largo etcétera.
Para ejecutarlo, hacemos clic sobre el botón Inicio con el botón derecho del ratón.
Esto hará que se abra la ventana Ejecutar. En ella, podríamos escribir la siguiente orden, para abrir la aplicación:
PowerShell_ISE
Así, conseguiríamos que se abriera la interfaz con el área de trabajo en blanco, lista para comenzar a trabajar.
Sin embargo, nosotros optaremos por abrir el programa, indicando el nombre del script con el que vamos a trabajar. Como aún está vacío, también estará en blanco el área de trabajo, pero sólo quedará comenzar a escribir órdenes.
Por lo tanto, nosotros usaremos la siguiente orden:
PowerShell_ISE c:\scripts\Enviar-Eventos.ps1
Cuando se abra el entorno del programa, sólo tendremos que comenzar a escribir el siguiente script en su área de trabajo:
# Configuración de Telegram
$BotToken = "123456789:ABCDefGHIjklMNOpqrSTUvwxyz"
$ChatID = "111111111"
# Obtener el último evento de inicio de sesión fallido (ID 4625)
$Event = Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625} -MaxEvents 1 -ErrorAction SilentlyContinue
if (-not $Event) {
exit
}
# Convertir el evento a XML para extraer los dato
$xml = [xml]$Event.ToXml()
$EventData = $xml.Event.EventData.Data
# Extraer campos clave
$TargetUser = ($EventData | Where-Object { $_.Name -eq "TargetUserName" }).'#text'
$IpAddress = ($EventData | Where-Object { $_.Name -eq "IpAddress" }).'#text'
$Workstation = ($EventData | Where-Object { $_.Name -eq "WorkstationName" }).'#text'
$Time = $Event.TimeCreated.ToString("yyyy-MM-dd HH:mm:ss")
# Evitar eventos vacíos o sin IP (para algunos servicios internos)
if (-not $IpAddress -or $IpAddress -eq "-") {
$IpAddress = "Desconocida/Local"
}
# Construir el mensaje para Telegram
$Message = "¡¡Alerta de Seguridad: Login Fallido!!`r`n"
$Message += "-Usuario: $TargetUser`r`n"
$Message += "-IP Origen: $IpAddress`r`n"
$Message += "-Equipo: $Workstation`r`n"
$Message += "-Hora: $Time"
# Preparar el payload de la API
$Payload = @{
chat_id = $ChatID
text = $Message
parse_mode = "Markdown"
}
$Url = "https://api.telegram.org/bot$BotToken/sendMessage"
# Enviar la notificación
try {
Invoke-RestMethod -Uri $Url -Method Post -Body $Payload -ErrorAction Stop
} catch {
# El error quedará registrado si lo ejecutas manualmente,
# pero el Programador de Tareas lo ignorará en segundo plano.
Write-Error "Fallo al contactar con la API de Telegram: $_"
}
Como dijimos antes, vamos a necesitar tanto el Token del API, como el ID de usuario de Telegram. Por esto, comenzamos el script con dos variables, para almacenar ambos valores.
A continuación, obtenemos el el último evento del sistema con el ID que nos interesa (en este caso, el 4625) y, si existe, lo convertimos a formato XML para simplificar su manejo.
Después extraemos la información que queremos enviar y nos aseguramos de que tiene contenido. Si es así, construimos el mensaje para Telegram.
Para terminar, preparamos el payload de la API y enviamos el mensaje con una estructura try-catch, para detectar si se produce algún error en el proceso.
Si prefieres descargar directamente el código fuente de ejemplo, haz clic aquí.
La explicación detallada del funcionamiento del script no se encuentra entre los objetivos de este artículo. En cualquier caso, puedes encontrar más información mucha más información sobre PowerShell en su documentación oficial: https://learn.microsoft.com/es-es/powershell/
Cuando termines de escribir (o copiar) el código del script, sólo tienes que guardarlo.
Si quieres, puedes probar a ejecutarlo desde la propia interfaz gráfica. Si todo es correcto, debes recibir un mensaje en tu Telegram de forma casi inmediata.
Observa que el remitente es nuestro bot y que los datos se corresponden con el último evento de este tipo registrado en el sistema.
Programar la tarea que debe ejecutar el script
Una vez que hemos creado el script, sólo queda vincularlo con una tarea programada que se ejecute cuando se produzca un evento. Para conseguirlo, comenzaremos por abrir el Visor de eventos.
Recuerda que el puedes encontrar el Visor de eventos dentro del menú Herramientas del Administrador del servidor.
Puedes evitar el paso por el Administrador del Servidor usando la orden eventvwr.msc. Sólo tienes que pulsar la combinación de teclas Windows + R y, en la ventana que aparece, escribir la orden.
Cuando se abra, localizaremos un evento del tipo al que queramos asociarle la tarea programada. En nuestro caso utilizaremos los eventos filtrados por la Vista personalizada que creamos en el artículo Cómo usar el Visor de eventos de Windows Server 2025.
A continuación, hacemos clic sobre cualquiera de ellos con el botón derecho del ratón y, en el menú de contexto, elegimos Adjuntar tareas a este evento…
Se abrirá el Asistente para crear una tarea básica. Como puedes apreciar, la ventana del asistente es prácticamente idéntica a la que aparecía en el Programador de tareas (Puedes consultar el artículo Programar una tarea en Windows Server 2025).
En este caso, el Nombre de la tarea aparece predefinido, con la información del evento que hemos usado como punto de partida. Sin embargo, si queremos, podemos cambiarlo.
También disponemos de un cuadro de texto para la Descripción, que podemos rellenar, o no, según nuestro criterio.
En la programación de una tarea normal, el siguiente paso correspondería al Desencadenador. Sin embargo, como en este caso se trata de un evento, ya se encuentra definido y lo único que podemos hacer es comprobar que todo es correcto.
El siguiente paso corresponde a la Acción y también es prácticamente idéntico al del Programador de tareas. Ya dijimos en su momento que tanto Enviar un correo electrónico como Mostrar un mensaje se encuentran en desuso y no los usaremos para establecer acciones.
A continuación, deberemos indicar el programa o script que queremos ejecutar. En este caso, escribiremos el nombre del intérprete que debe ejecutar el script. Es decir:
powershell
En el cuadro Agregar argumentos (opcional), usaremos el atributo -File, seguido de la ruta completa hasta el script. En este caso:
-File c:\scripts\Enviar-Eventos.ps1
Después de esto, habremos llegado al final del Asistente para crear tareas básicas. Como de costumbre, el sistema nos ofrece un resumen de los valores que hemos introducido en los puntos anteriores. Si observamos algún error, podremos subsanarlo haciendo clic sobre el botón Atrás, hasta llegar al aspecto que necesitemos cambiar.
Por último, deberemos asegurarnos de marcar la casilla Abrir el diálogo Propiedades para esta tarea al hacer clic en Finalizar, porque hay un par de valores que debemos cambiar antes de dar la tarea por concluida.
Al hacerlo, se abrirá la ventana Propiedades de, seguido del nombre de la tarea. Aquí, dentro de la solapa General, deberemos asegurarnos de marcar dos opciones:
-
Ejecutar tanto si el usuario inició sesión como si no.
-
Ejecutar con los privilegios más altos.
Probablemente, cuando hagamos clic sobre el botón Aceptar, para guardar los cambios que hayamos realizado, el sistema nos pida que nos identifiquemos como administradores.
Si todo ha ido bien, el Visor de eventos muestra un aviso indicando que ha creado una nueva tarea programada y que, si queremos modificara, deberemos acudir al Programador de tareas.
Comprobar que todo funciona correctamente
Si todo es correcto, cada vez que se produzca un evento 4625 (es decir, alguno de los usuarios ha cometido un error en su autenticación), recibiremos un mensaje de Telegram informándonos. Como hemos dicho al principio, no será importante que alguien se confunda de forma esporádica al escribir su contraseña, pero si se está produciendo un intento de acceso no autorizado, probablemente el autor pruebe con multitud de combinaciones y recibiremos un número elevado de mensajes de aviso.
El objetivo de este artículo es ilustrar cómo podemos vincular un evento a una tarea programada, para automatizar una respuesta. Será útil si alguien realiza varios intentos, de forma manual, para acceder a una cuenta en la que no está autorizado o en la que ha olvidado la contraseña.
Si lo que se produce es un ataque de fuerza bruta por RDP o SMB, el servidor registrará decenas de eventos 4625 por segundo. Levantar una instancia nueva de PowerShell para cada uno provocará picos masivos de uso de CPU y RAM, degradando el rendimiento del sistema.
Por otro lado, Telegram establece una restricción sobre la cantidad de mensajes que un bot puede enviar en determinados periodos de tiempo. Si se produce una ráfaga de eventos, la API devolverá errores HTTP 429 (Too Many Requests) y bloqueará temporalmente el bot, con lo que estaremos perdiendo notificaciones.
Por último, aunque no tan importante para la situación que nos ocupa, debes tener en cuenta que si el script realiza una consulta para buscar «el último evento», ante una ráfaga de eventos del mismo tipo, puede acabar leyendo la información de un evento posterior al que ha producido la llamada.
Y con esto terminamos el contenido del artículo. Espero que te haya resultado interesante.