Programar una tarea que se ejecute en respuesta a un evento en Windows Server 2022

Publicado por P. Ruiz en

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.

En particular, a modo de ejemplo, hoy te explicaremos cómo lograr que, el sistema operativo que estamos administrando, nos envíe un correo electrónico 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 correo electrónico 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:

  1. Explicaremos cómo crear un script en PowerShell que se encargue del envío de los correos electrónicos.

    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.

  2. 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.

  3. Después, crearemos nuestro archivo de script, escribiremos su contenido y comprobaremos que funciona.

  4. Cuando lo tengamos, programaremos la tarea que ejecute el script cada vez que un usuario cometa un error de autenticación.

  5. Por último, comprobaremos que todo funciona correctamente.

Como ves, tenemos por delante un poco de trabajo, así es que, pasaremos a la acción…

Habilitar a PowerShell para ejecutar scripts de forma local

El primer inconveniente que encontraremos, cuando tratemos de ejecutar scripts de PowerShell en Windows Server 2022, 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:

  1. 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 Windows PowerShell.

    Programar-una-tarea-que-se-ejecute-en-respuesta-a-un-evento-en-Windows-Server-2022-001

    Observa que, en el menú, aparecen dos opciones: Windows PowerShellWindows PowerShell (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).

  2. 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

    Escribimos la orden y pulsamos la tecla Intro.

    Programar-una-tarea-que-se-ejecute-en-respuesta-a-un-evento-en-Windows-Server-2022-002

  3. Durante la ejecución, PowerShell nos avisa de que estamos cambiando el lugar desde el que podemos ejecutar scripts en el servidor.

    Además, nos remite a una dirección de Internet donde Microsoft nos explica en detalle en qué consisten los riesgos.

    Si, a pesar de todo, estamos de acuerdo con ejecutar el cmdlet, pulsamos la tecla S y después Intro.

    Programar-una-tarea-que-se-ejecute-en-respuesta-a-un-evento-en-Windows-Server-2022-003

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.

Una vez escrita la orden, pulsamos la tecla Intro.

Programar-una-tarea-que-se-ejecute-en-respuesta-a-un-evento-en-Windows-Server-2022-004

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.

Escribimos la orden y pulsamos la tecla Intro.

Programar-una-tarea-que-se-ejecute-en-respuesta-a-un-evento-en-Windows-Server-2022-005

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.

En el menú de contexto que aparece, elegimos Ejecutar.

Programar-una-tarea-que-se-ejecute-en-respuesta-a-un-evento-en-Windows-Server-2022-006

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

A continuación, pulsamos la tecla Intro o hacemos clic sobre el botón Aceptar.

Programar-una-tarea-que-se-ejecute-en-respuesta-a-un-evento-en-Windows-Server-2022-007

Cuando se abra el entorno del programa, sólo tendremos que comenzar a escribir el siguiente script en su área de trabajo:

$ServidorSMTP = "smtp.somebooks.es"
$PuertoSMTP = "587"
$UsuarioEmailSMTP = "notificar@somebooks.es"
$PasswordSMTP = "12345"

$emailOrigen = "notificar@somebooks.es"
$emailDestino = "admin@somebooks.es"

$Mensaje = New-Object System.Net.Mail.MailMessage( $emailOrigen , $emailDestino )
$evento = Get-EventLog -LogName "Security" -Newest 1
$Mensaje.Body = @"
Evento a revisar en $($evento.MachineName)
Identificador: $($evento.EventId)
Fuente: $($evento.Source)
Tipo:  $($evento.EntryType)
Fecha / Hora:  $($evento.TimeGenerated)
Texto:  $($evento.Message)
"@
$Mensaje.Subject = "Notificación de $($env:computername)"

$ClienteSMTP = New-Object System.Net.Mail.SmtpClient( $ServidorSMTP , $PuertoSMTP )
$ClienteSMTP.EnableSsl = $True
$ClienteSMTP.Credentials = New-Object System.Net.NetworkCredential( $UsuarioEmailSMTP , $PasswordSMTP );
$ClienteSMTP.Send( $Mensaje )

Estamos suponiendo que usamos una cuenta de correo para enviar las notificaciones (en nuestro ejemplo, notificar@somebooks.es, de la que necesitaremos dos datos:

  1. El servidor SMTP, que en nuestro ejemplo será smtp.somebooks.es, pero que también podría ser algo como mail.somebooks.es, dependiendo del proveedor que estemos usando.

  2. La contraseña de la cuenta. Para el ejemplo usaremos 12345 pero, en el mundo real, deberá ser algo más sólida.

Como hemos dicho, aquí sólo son datos de ejemplo pero, en cualquier caso, es muy recomendable utilizar una cuenta diferenciada para este objetivo. Si utilizáramos, por ejemplo, la cuenta del administrador para enviar y recibir los correos, necesitaríamos incluir su contraseña en el script y, aunque es poco probable, si se viese comprometida, estaríamos poniendo en riesgo todo el correo del administrador.

También debes tener en cuenta que el valor 587 hace referencia al puerto que utiliza el protocolo SMTP para enviar correos mediante SSL (Secure Sockets Layer). Si el servidor SMTP que usamos no utiliza SSL, habría que sustituir este valor por 25 y cambiar la línea $ClienteSMTP.EnableSsl = $True por $ClienteSMTP.EnableSsl = $False.

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 sobre la clase SmtpClient en la siguiente dirección: http://msdn.microsoft.com/es-es/library/system.net.mail.smtpclient%28v=vs.110%29.aspx

En cuanto al cmdlet Get-EventLog, puedes encontrar más información en: http://technet.microsoft.com/en-us/library/hh849834.aspx

Cuando termines de escribir (o copiar) el código del script, sólo tienes que guardarlo.

Hacemos clic sobre el botón Grabar.

Programar-una-tarea-que-se-ejecute-en-respuesta-a-un-evento-en-Windows-Server-2022-008

Si quieres, puedes probar a ejecutarlo desde la propia interfaz gráfica. Si todo es correcto, debes recibir un e-mail en la cuenta de destino con el último evento que se haya producido en la categoría Security.

El mensaje recibido se parecerá a este

Programar-una-tarea-que-se-ejecute-en-respuesta-a-un-evento-en-Windows-Server-2022-009

En ocasiones, tu servidor de correo puede detectar que se está haciendo uso de la cuenta de e-mail desde un script y puede considerar que se trata de una situación potencialmente peligrosa.

En estos casos, es probable que se bloqueen todos los envíos que se produzcan desde ese origen y no recibas las notificaciones que esperabas.

Como es lógico, la forma de resolverlo dependerá del servidor de correo que estés utilizando.

Por último, puede que no encuentres los mensajes recibidos en tu bandeja de entrada, porque hayan sido enviados a spam. En ese caso, deberás indicar a tu servidor de correo que los mensajes de ese tipo no debe considerarlos en dicha categoría.

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.

Como-usar-el-Visor-de-eventos-de-Windows-Server-2022-001

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.

Como-usar-el-Visor-de-eventos-de-Windows-Server-2022-002

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 2022.

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

Programar-una-tarea-que-se-ejecute-en-respuesta-a-un-evento-en-Windows-Server-2022-012

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 2022).

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.

Si no queremos hacer modificaciones, podemos limitarnos a hacer clic sobre el botón Siguiente.

Programar-una-tarea-que-se-ejecute-en-respuesta-a-un-evento-en-Windows-Server-2022-013

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.

Si estamos de acuerdo, hacemos clic sobre el botón Siguiente.

Programar-una-tarea-que-se-ejecute-en-respuesta-a-un-evento-en-Windows-Server-2022-014

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.

Por lo tanto, elegimos Iniciar un programa y hacemos clic sobre el botón Siguiente.

Programar-una-tarea-que-se-ejecute-en-respuesta-a-un-evento-en-Windows-Server-2022-015

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

Cuando hayamos terminado, hacemos clic sobre el botón Siguiente.

Programar-una-tarea-que-se-ejecute-en-respuesta-a-un-evento-en-Windows-Server-2022-016

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.

Si todo es correcto, haremos clic sobre el botón Finalizar.

Programar-una-tarea-que-se-ejecute-en-respuesta-a-un-evento-en-Windows-Server-2022-017

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.

Después, sólo quedará hacer clic sobre el botón Aceptar.

Programar-una-tarea-que-se-ejecute-en-respuesta-a-un-evento-en-Windows-Server-2022-018

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.

Escribimos la contraseña correcta y hacemos clic sobre el botón Aceptar.

Programar-una-tarea-que-se-ejecute-en-respuesta-a-un-evento-en-Windows-Server-2022-019

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.

Hacemos clic, de nuevo, sobre el botón Aceptar.

Programar-una-tarea-que-se-ejecute-en-respuesta-a-un-evento-en-Windows-Server-2022-020

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), el administrador recibirá un correo electrónico informándolo. Como hemos dicho al principio, no será importante que alguien se confunda de forma esporádica al escribir su contraseña, pero si alguien está intentando acceder de forma no autorizada, probablemente probará con multitud de combinaciones y recibiremos un número elevado de correos de aviso.

Contenido del correo producido por el evento.

Programar-una-tarea-que-se-ejecute-en-respuesta-a-un-evento-en-Windows-Server-2022-021

Y esto es todo por el momento. Espero que el contenido del artículo te haya resultado interesante.