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

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 2019 es que esta posibilidad 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 Ejecutar.

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

  2. Esto hará que se abra la ventana Ejecutar. En ella, escribimos la siguiente orden:

    powershell

    Cuando hayamos acabado 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-2019-002

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

    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-2019-003

  4. Durante la ejecución, PowerShell nos avisa de que lo que estamos haciendo es cambiar 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-2019-004

El cmdlet Set-ExecutionPolicy RemoteSigned sólo debe ejecutarse la primera vez que necesitemos ejecutar scripts de PowerShell en el sistema y, por supuesto, siempre con privilegios de Administrador.

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-2019-005

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-2019-006

Para escribir un script, podemos usar 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-2019-007

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. 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-2019-008

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 (notificar@somebooks.es), con un determinado servidor SMTP (smtp.somebooks.es) y una contraseña (12345).

Lógicamente, son datos de ejemplo, pero, en cualquier caso, es muy recomendable utilizar una cuenta diferenciada para este objetivo y no utilizar, por ejemplo, la cuenta administrador para enviar y para recibir los correos. El motivo es evidente: estamos incluyendo la contraseña en el script y, aunque es poco probable, si se viese comprometida, estaríamos poniendo en riesgo todo el correo del administrador.

Algo que debes tener en cuenta es 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-2019-009

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-2019-010

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.

A modo de ejemplo, cuando usas Gmail, puedes resolverlo visitando la dirección https://support.google.com/accounts/answer/6010255. Una vez en ella, desplegamos el apartado Si está desactivada la opción «Acceso de apps menos seguras»

… y en su interior, hacemos clic sobre el enlace Volver a activarla.

Programar-una-tarea-que-se-ejecute-en-respuesta-a-un-evento-en-Windows-Server-2019-011

Esto nos llevará a una nueva página donde, tras una breve explicación, encontramos el texto Permitir el acceso de aplicaciones poco seguras: No, seguido de un botón de opción

Hacemos clic sobre el botón para cambiar la palabra No por .

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

De esta forma tan sencilla, habremos resuelto el problema (siempre que tu correo sea de Gmail, claro. En otros casos, deberás informarte sobre cómo resolverlo con tu proveedor de correo).

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

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-2019-013

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

En este caso, el Nombre de la tarea aparece predefinido, con la información del evento del que hemos partido. 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-2019-014

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-2019-015

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 podremos establecer acciones de estas categorías.

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-2019-016

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-2019-017

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-2019-018

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-2019-019

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-2019-020

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-2019-021

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-2019-022

Y esto es todo por ahora. Espero que te haya resultado interesante.