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

Publicado por P. Ruiz en

Estos últimos días, hemos estado dedicando algunos artículos a la automatización de tareas y a la supervisión de los sucesos que puedan haber ocurrido en nuestro sistema.

Pues bien, hoy vamos a comprobar cómo podemos combinar ambas habilidades para hacer que nuestro sistema reaccione a una determinada situación llevando a cabo una acción concreta.

En particular, haremos que, el sistema operativo que estamos administrando, nos envíe un correo electrónico cuando alguno de los usuarios cometa un error al autenticarse. Además, 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:

  • Como vamos a 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.
  • 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…

Habilitar a PowerShell para ejecutar scripts de forma local

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

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.

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.

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.

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 y nos remite a una dirección de Internet donde Microsoft nos explica en detalle en qué consisten dichos riesgos.

Si, a pesar de todo, estamos de acuerdo con ejecutar el cmdlet, pulsamos la tecla S y después Intro o simplemente la tecla Intro, ya que es el valor predeterminado.

El cmdlet Set-ExecutionPolicy RemoteSigned sólo debe ejecutarse la primera vez que necesitemos ejecutar script 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.

Crear el script y escribir su contenido

Una vez completado el trámite anterior, ya podemos comenzar con el contenido del script propiamente dicho. Podríamos hacerlo usando simplemente el Bloc de notas de Windows, pero PowerShell dispone de un entorno integrado para escribir scripts, que es mucho más fácil de utilizar, llamado 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.

Esto hará que se abra la ventana Ejecutar. En ella, podríamos escribir la siguiente orden, para abrir la aplicación:

PowerShell_ISE

Esto haría 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 no existe, también estará en blanco el área de trabajo, pero ya hemos creado el archivo (aunque aún esté vacío). Sólo quedará comenzar a escribir órdenes.

Para conseguirlo, escribimos 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.

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

$from       = "notificar@somebooks.es"
              $smtpServer = "smtp.somebooks.es"

              $to         = "admin@somebooks.es"
              $subject    = "Notificación de $($env:computername)"

              $evento = Get-EventLog -LogName "Security" -Newest 1

              $body = @"
              Evento a revisar en $($evento.MachineName)
              Identificador: $($evento.EventId)
              Fuente: $($evento.Source)
              Tipo:  $($evento.EntryType)
              Fecha / Hora:  $($evento.TimeGenerated)
              Texto:  $($evento.Message)
              "@

              $smtpClient = New-Object System.Net.Mail.SmtpClient($smtpServer, 587)
              $smtpClient.EnableSsl = $true
              $smtpClient.Credentials = New-Object System.Net.NetworkCredential("notificar", "12345")
              $smtpClient.Send($from, $to, $subject, $body)

Estamos suponiendo que usamos una cuenta de correo para enviar las notificaciones (notificar@somebooks.es), con un determinado servidor SMTP (smtp.somebooks.es), un usuario (notificar) 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 $smtpClient.EnableSsl = $true por $smtpClient.EnableSsl = $false.

La explicación detallada del funcionamiento del script no se encuentra entre los objetivos de este libro. 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 grabarlo

Hacemos clic sobre el botón Grabar.

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.

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, este es el aspecto del aviso que emite Gmail:

Notificación del servidor de correo

En estos casos, deberás modificar la configuración de tu cuenta de correo para que admita este tipo de orígenes.

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

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 2012 R2.

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 2012 R2).

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.

En la programación de una tarea normal, el siguiente paso correspondería al Desencadenador. Sin embargo, en este caso, al tratarse 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.

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.

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.

Después de esto, habremos llegado al final del Asistente para crear tareas básicas, por lo que 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.

Antes de terminar, 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.

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.

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.

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.

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.

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