Una Guía Completa para Usar el Cmdlet de PowerShell Get-WinEvent

Windows tiene varios registros de eventos diferentes, pero ¿cómo se recuperan rápidamente? El cmdlet Get-WinEvent puede recuperar registros de eventos clásicos de Windows, como los registros del Sistema y de Aplicaciones, registros generados por la tecnología de registro de eventos de Windows, ¡e incluso registros de Event Tracing for Windows (ETW)!

En este artículo, aprende cómo aprovechar Get-WinEvent para recuperar y filtrar eventos de registros de eventos.

Prerrequisitos

Para seguir, solo necesitas una versión actual de Windows 10 y PowerShell 5.1 o superior. Este artículo utiliza Windows 10 y PowerShell 7.1.

Listar registros disponibles con Get-WinEvent

Es difícil saber qué entradas de registro puedes necesitar sin conocer todos los registros disponibles. Con Get-WinEvent, puedes listar rápidamente todos los registros disponibles usando el parámetro -ListLog. El valor * en el parámetro le dice a Get-WinEvent que liste todos los registros sin filtrar. Como se muestra a continuación, se recuperan todos los registros, pero solo se muestran un conjunto limitado de propiedades utilizando el Select-Object cmdlet.

Get-WinEvent -ListLog * | Select-Object LogName, RecordCount, IsClassicLog, IsEnabled, LogMode, LogType | Format-Table -AutoSize

No todos los registros están habilitados por defecto. Es posible que necesites abrir el Visor de eventos, localizar el registro y hacer clic derecho para Habilitar el registro antes de que aparezcan eventos.

Listing all available event logs.

Todos los registros posteriores a Windows Vista se guardan como archivos *.evtx en lugar del formato anterior *.evt. La propiedad IsClassicLog indica si los eventos del registro están definidos en un archivo de Mensajes, formato *.mc, o en un manifiesto, formato *.xml.

Una propiedad interesante es el LogMode, que probablemente hayas notado que generalmente se establece en Circular.

  • Circular – Sobrescribe la entrada de registro más antigua una vez que esté llena.
  • Retener – Conserva todos los eventos hasta que el registro esté lleno y deja de registrar hasta que se libere espacio.
  • AutoBackup – Realiza automáticamente copias de seguridad y archiva los registros de eventos una vez que estén llenos.
Highlighting the LogMode property.

Por último, al observar la propiedad LogType, hay varios tipos diferentes de registros. Esta propiedad sirve más como una propiedad de categorización, pero generalmente informa cómo se utiliza el registro y los tipos de eventos que muestra.

  • Administrativo – Principalmente destinado para usuarios finales y usuarios administrativos.
  • Analítico – Normalmente, un registro de alto volumen, destinado a describir las operaciones del programa.
  • Depuración – Destinado para desarrolladores que necesitan una inmersión profunda en los internos del programa.
  • Operativo – Un evento que ocurre durante la operación y es útil para diagnosticar ocurrencias y activar procesos.
Highlighting the LogType property.

Listado de Proveedores de Registro de Eventos

Ahora que tienes una comprensión sólida de los diferentes registros y sus propiedades, ayuda entender qué es un Proveedor de Registro de Eventos. Un proveedor, en la terminología de registro de eventos, es una fuente de un evento.

Los proveedores de registro de eventos son únicos y están vinculados a cada registro, como los registros de Aplicación o Sistema, y servirán como la fuente nombrada donde se origina un evento.

Tal vez te gustaría encontrar problemas al filtrar registros, y quizás solo estés interesado en problemas de un proveedor en particular. Para listar qué proveedores están disponibles, utiliza el parámetro -ListProvider. Como se muestra a continuación, el * lista todos los proveedores disponibles y a qué registro están vinculados, como Windows PowerShell o System.

Get-WinEvent -ListProvider * | Format-Table -Autosize
Listing event log providers.

Quizás quieras listar solo los proveedores disponibles para un registro específico, como System. Para hacerlo, podrías filtrar eventos usando el comando Where-Object utilizando los valores de la propiedad LogLinks. La propiedad LogLinks muestra los registros de eventos vinculados como una lista.

Para filtrar los registros solicitados con Where-Object, utiliza el operador de comparación -In para filtrar solo aquellos eventos con System en el valor de la propiedad LogLinks. Finalmente, el uso de Format-Table -AutoSize facilita la lectura de la salida, como se muestra a continuación.

Get-WinEvent -ListProvider * | Where-Object { 'System' -In ($_ | Select-Object -ExpandProperty Loglinks | Select-Object -ExpandProperty Logname) } | Format-Table -AutoSize
Filtering event log providers to a specific log.

Recuperación de Registros de Eventos Clásicos con Get-WinEvent

El primer paso para solucionar un problema de Windows es recuperar el registro de eventos de la Aplicación o del Sistema, que resultan ser Registros de Eventos Clásicos. En el ejemplo que se muestra a continuación, recuperarás los primeros 100 eventos usando el parámetro -MaxEvents del registro de eventos de la Aplicación.

Para facilitar la lectura de los resultados, selecciona solo las propiedades necesarias para leer las entradas más fácilmente. De lo contrario, las entradas están agrupadas por el nombre del proveedor, lo que dificulta el análisis de la lista de resultados.

Get-WinEvent -LogName 'Application' -MaxEvents 100 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Returning events from the Application log.

Encontrar Eventos Modernos de Windows con Get-WinEvent

Ahora que ha recuperado eventos del registro de aplicaciones clásico, ¿qué pasa con los resultados de un registro de eventos de Windows más nuevo, como Microsoft-Windows-WindowsUpdateClient/Operational?

A diferencia de un registro de eventos clásico, como System, el registro Microsoft-Windows-WindowsUpdateClient/Operational es un registro moderno, y Get-WinEvent funciona igual que a continuación.

Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Returning Windows Event Log records.

¿Qué tal si solo quiere obtener los eventos más antiguos? Aunque podría revertir el orden de los resultados con Sort-Object, utilice el parámetro -Oldest para recuperar los primeros 10 eventos, como se muestra a continuación.

El comando Get-WinEvent hace el filtrado por usted en lugar de devolver todos los resultados y ordenarlos, lo cual suele ser más lento.

Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' -Oldest -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Returning only the oldest events in a Windows Event Log.

Recuperación de Archivos de Event Tracing for Windows (ETW) con Get-WinEvent

Tal vez tenga un archivo exportado *.evtx de otra computadora o haya respaldado un registro existente. Puede leer esos registros con el cmdlet Get-WinEvent. Si necesita mantener registros para fines de auditoría, Get-WinEvent es una excelente manera de consultar esos registros con cmdlets estándar dentro de scripts rápidamente.

Para demostrar cómo recuperar entradas de registro de un archivo *.evtx, necesitas un archivo de registro exportado.

1. Abre el Visor de eventos y navega hasta un registro. En este ejemplo, el registro Aplicación y Servicios → Registros de Windows PowerShell.

Navigate to a Windows Event Viewer log.

2. Luego, haz clic en la opción Guardar todos los eventos como… en el panel de Acciones.

Save the log file.

3. Guarda el archivo en una ubicación del disco para que pueda ser recuperado por el comando Get-WinEvent.

Choose a location to save the log file.

Ahora que has exportado un archivo de registro, pasa la ubicación del archivo de registro mediante el parámetro -Path para leer los eventos. En el ejemplo mostrado a continuación, el registro de Windows PowerShell se exporta para su posterior consumo.

Get-WinEvent -Path 'C:\Articles\WindowsPowerShell.evtx' -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Retrieving specific events from the exported event file.

Filtrado de Registros de Eventos de Windows Usando Get-WinEvent

Aunque podrías filtrar registros con el cmdlet estándar Where-Object, Get-WinEvent ofrece filtros integrados. Al devolver todos los resultados y luego filtrar, se realiza más trabajo del necesario. En cambio, siempre debes intentar filtrar en la fuente tanto como sea posible.

El cmdlet Get-WinEvent proporciona tres parámetros para ayudarte a filtrar a través de miles de eventos llamados -FilterHashTable, -FilterXPath y -FilterXML. Cada parámetro generalmente realiza la misma tarea solo que de una manera diferente.

Filtrado de Registros de Eventos con FilterHashTable

El parámetro -FilterHashTable filtra el contenido según las propiedades coincidentes, como LogName. En lugar de utilizar el parámetro -LogName para filtrar por un registro específico, puede utilizar en su lugar una tabla hash, como @{'LogName' = 'Application'}, que correspondería a la propiedad de evento LogName.

El ejemplo mostrado a continuación proporciona una tabla hash al parámetro -FilterHashTable que busca solo el registro de aplicación y con una hora de inicio que son todos los eventos pasados la medianoche del día actual, Get-WinEvent devuelve resultados rápidamente.

Get-WinEvent -FilterHashTable @{'LogName' = 'Application'; 'StartTime' = (Get-Date -Hour 0 -Minute 0 -Second 0)} | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Filtering events with the FilterHashTable parameter.

Compare las velocidades de filtrado del mismo comando anterior con uno filtrado a través de Where-Object en lugar del parámetro -FilterHashTable en el pipeline. Como puede ver, el comando que utiliza Where-Object es mucho más lento que el que utiliza el parámetro -FilterHashTable.

Comparing filtering with FilterHashTable and Where-Object.

Filtrado de registros de eventos usando el parámetro FilterXPath

Las entradas de registro de eventos se almacenan como archivos XML, y por lo tanto puede utilizar el lenguaje XPath, un lenguaje de consulta XML, para filtrar las entradas del registro. Realizando el mismo comando utilizado anteriormente y traduciéndolo a XPath, puede lograr los mismos resultados.

Para crear una consulta XPath, utilice la capacidad de filtrado en el Visor de eventos de Windows, como se muestra a continuación.

1. Abra el Visor de eventos y navegue hasta un registro, como el registro de Windows → Aplicación.

Opening the Windows Event Viewer.

2. A continuación, haz clic en el enlace Filtrar registro actual en el panel derecho.

Choosing to Filter the Current Log.

3. Ingresa los parámetros que deseas utilizar para filtrar el registro.

Creating a filter for the current log.

4. Haz clic en la pestaña XML y copia la sección contenida dentro de la etiqueta Select.

Copying the XPath command.

5. Ahora, copia y pega el contenido copiado con el parámetro -FilterXPath. Ahora puedes ver que utilizando la sintaxis XPath encontrada en el visor de registros de eventos, puedes construir una consulta para filtrar solo la información necesaria.

Get-WinEvent -LogName 'Application' -FilterXPath "*[System[(Level=1  or Level=3)]]" | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Demonstrating the use of the FilterXPath parameter.

Adentrarse en cómo crear consultas XPath está fuera del alcance de este artículo, pero el formato básico se muestra a continuación. Cuando el parámetro FilterXPath filtra una fecha, verás una gran diferencia: necesitas utilizar un formato de fecha más específico, yyyy-MM-ddTHH:mm:ss.fffZ, y la fecha debe devolverse en UTC, lo cual se indica con el interruptor -AsUTC.

Get-WinEvent -LogName 'Application' -FilterXPath "*[System[TimeCreated[@SystemTime >= '$(Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0 -Format "yyyy-MM-ddTHH:mm:ss.fffZ" -AsUTC)']]]" | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Filtering events using XPath.

Filtrando Resultados del Registro de Eventos con FilterXML

Finalmente, el último parámetro de filtrado disponible es el parámetro -FilterXML. A diferencia de los parámetros -FilterXPath y -FilterHashTable, este parámetro toma XML que luego se utiliza para filtrar los eventos. El parámetro -FilterXML permite reglas más complejas y, como se muestra a continuación, puede replicar los ejemplos de filtrado anteriores.

Como se muestra en el ejemplo anterior, puede recuperar una consulta preformateada de la capacidad Visor de eventos → Filtrar registro actual. En lugar de seleccionar solo el contenido en el nodo Seleccionar, utilizará toda la consulta. No se eligen filtros reales, como se indica por el * en el nodo Seleccionar. Esto proporcionará el marcado general para el próximo ejemplo.

Selecting the entire XML query from Filter Current Log in the Event Viewer.

En lugar de crear un comando de una línea, primero separe la consulta XML y asigne el marcado a una variable, $Consulta, en el ejemplo a continuación. Asignar la consulta a una variable facilita su uso y legibilidad. A continuación, pase la variable $Consulta al parámetro -FilterXML de Get-WinEvent.

Como se muestra a continuación, verá los resultados de la consulta más compleja que devuelve todos los eventos de ese día y almacenados en el registro Aplicación.

$Query = "<QueryList>
  <Query Id='0' Path='Application'>
    <Select Path='Application'>*[System[TimeCreated[@SystemTime >= '$(Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0 -Format "yyyy-MM-ddTHH:mm:ss.fffZ" -AsUTC)']]]</Select>
  </Query>
</QueryList>"

Get-WinEvent -FilterXML $Query | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Showing how FilterXML works.

Conclusión

El cmdlet Get-WinEvent hace un trabajo rápido de consultar múltiples fuentes de registros de eventos con potentes capacidades de filtrado. Desde auditorías hasta resolución de problemas, el cmdlet Get-WinEvent es una adición crucial a cualquier conjunto de herramientas de administradores de sistemas.

Source:
https://adamtheautomator.com/get-winevent/