Usar PowerShell para exportar los eventos de seguridad de Windows en formato XML

Vamos a seguir hablando de cosillas del PowerShell de Windows y vamos a ver cómo podríamos ver el log de eventos de seguridad de Windows y como podríamos exportarlo a formato XML.

El comando Get-EventLog es, en este caso, el que nos permitirá extraer datos de los logs de eventos de Windows. Para filtrar los eventos de seguridad le pasaremos como parámetro -LogName, con el valor Security. Nos quedaría este comando:

Get-EventLog -LogName Security

Os dejo una captura de la salida del comando (si mi consola os luce un poco rara, podéis ver esta entrada sobre cómo personalizar la apariencia de la misma). Para mi ejemplo he llamado después al comando Select-Object especificando que se muestren solo las primeras 40 filas.

Powershell salida

Bien, con esto tenemos la salida de datos en pantalla, pero lo que queremos es tener los datos en un fichero XML, un fichero al que llamaremos RegistroSeguridad.xml. ¿Cómo lo formatemos? Tenemos dos opciones:

  • Usar el comando Convert-XML y dirigir la salida a un fichero con Out-File
  • Usar el comando Export-Clixml, que en una sola acción hace lo mismo que los dos comandos comentados arriba.

El primer comando sería algo como esto (para no hacer un fichero demasiado descomunal he añadido que solo se cojan los primeros 400):

 Get-EventLog -LogName Security | Select-Object -First 400 | ConverTo-XML | Out-File RegistroSeguridad.xml

El segundo comando sería así:

 Get-EventLog -LogName Security | Select-Object -First 400 |Export-Clixml RegistroSeguridad.xml

¿Por qué es mejor que usemos la segunda opción? Pues porque además de tener una sintaxis más simplicada también obtiene un mejor rendimiento al usar una función que está diseñada específicamente para la conversión y exportación directa, en lugar de llamar a dos (una para conversión y otra para exportación).

Modificando la apariencia de PowerShell

No se a vosotros, pero a mi la apariencia de la interfaz por defecto del PowerShell de Windows no me seduce nada, y estos días tengo que trabajar bastante con él:

Ni la tipografía me resulta cómoda a la hora de leer, ni el color de fondo me convence y hasta me parece demasiado pequeño el tamaño de la consola. Pero podemos personalizar esta interfaz. Basta con hacer click sobre el icono de Powershell que hay en la esquina izquierda de la ventana, al lado del nombre:

Icono sobre el que pulsar

Ahí podéis ir a al menú “Propiedades“. Si no ejecutamos el PowerShell con permisos de administrador los cambios no serán permanentes y se perderán al cerrar la ventana.

La primera pestaña, Opciones, nos permitirá activar o desactivar las opciones de autocompletado, de inserción (pegar en un solo click) o de edición rápida. También nos dejará definir el tamaño del buffer o el del cursor:

La segunda pestaña, Fuente, nos permitirá cambiar la tipografía y su tamaño:

La tercera pestaña, Diseño, nos permite definir el tamaño del buffer, el de la ventana y la posición de la misma:

Y finalmente en la pestaña Colores podremos elegir el color de fondo y de letra para la pantalla de PowerShell y para las pantallas emergentes.

Trasteando un poco lo podemos dejar a nuestro gusto. En mi caso me gusta que parezca una venta clásica de MS-DOS, puede que por nostalgia o por la fuerza del hábito.

Cómo saber qué programa está usando o bloqueando un puerto con netstat en Windows

Me pasó ayer que no me arrancaba una aplicación web en un servidor Windows que no gestiona en su totalidad mi empresa. Intentabas arrancar pero había algo ocupando el puerto 80. ¿Cómo podía encontrar qué programa estaba ocupando ese puerto? Pues sirviéndome de netstat.

El comando a ejecutar sería el siguiente

netstat -ano -p tcp

De esta forma podemos ver todos los puertos, incluyendo los que están en escucha (parámetro -a), se muestran los puertos de forma numérica (parámetro -n) y el número de proceso (parámetro -o), filtrando por protocolo (parámetro -p) para mostrar solo los de TCP. Pero claro, esto nos saldría una salida enorme porque mostraría todos los puertos TCP y nosotros solo queremos el puerto 80. Podemos filtrar más:

netstat -ano -p tcp | find ":80"

Añadiendo una tubería para el filtrado podemos usar el comando find para que muestre solo los que tengan una referencia al puerto 80, quitándonos mucha información de encima.

Finalmente, si hemos localizado el proceso y queremos matarlo podemos abrir el Administrador de Tareas o simplemente usar el comando taskkill para eliminarlo usando el PID, por ejemplo si el PID fuera el 881 sería así:

taskkill /PID 881

Powershell: arrancar o parar el servidor web IIS.

¿Cómo arrancamos, paramos o reiniciamos el servidor web IIS desde comandos con Powershell?

Reiniciar: IISReset /RESTART
Parar: IISReset /STOP
Arrancar: IISReset /START

Esto para y arranca todo el servidor web. ¿Y si queremos arrancar o parar un sitio web concreto? Tenemos dos comandos que lo hacen por el nombre de sitio, que varían según la versión de nuestro sistema operativo:

Arrancar (Windows 8 o Windows server 2012): Start-WebSite -Name “Nombre de Nuestra Web”
Arrancar (Windows 10 o Windows server 2016): Start-IISSite -Name “Nombre de Nuestra Web”

Parar (Windows 8 o Windows server 2012): Stop-WebSite -Name “Nombre de Nuestra Web”
Parar (Windows 10 o Windows server 2016): Stop-IISSite -Name “Nombre de Nuestra Web”

Esta es la sintaxis básica, pero tanto Start-WebSite como Stop-WebSite tienen una serie de parámetros extra que puedes revisar en la web de Microsoft en los enlaces anteriores.