- Get-WinEvent supera a Get-EventLog permitiendo filtros avanzados y acceso a registros modernos
- El uso de tablas hash y XPath optimiza la búsqueda de eventos específicos en grandes volúmenes de logs
- Permite administración de logs locales, remotos y almacenados en archivo con control sobre permisos y credenciales
PowerShell ha evolucionado convirtiéndose en una de las herramientas imprescindibles para la gestión avanzada de sistemas Windows. Entre sus cmdlets más potentes se encuentra Get-WinEvent, que permite a administradores y usuarios obtener registros de eventos, auditar acciones y monitorizar el estado de sus equipos o servidores de manera muy detallada y flexible.
En este artículo descubrirás todo lo que necesitas saber sobre el comando Get-WinEvent de PowerShell: desde su sintaxis, diferencias frente a otros cmdlets clásicos como Get-EventLog, ejemplos prácticos, optimización del filtrado usando tablas hash, detalles sobre parámetros clave y consejos para sacarle todo el partido tanto en el análisis local como remoto de eventos. Si quieres dominar el análisis de logs y la resolución de incidencias en Windows, sigue leyendo.
¿Qué es Get-WinEvent y por qué es tan útil?
Get-WinEvent es un cmdlet exclusivo de plataformas Windows que permite acceder y explorar los registros de eventos del sistema operativo. Su función principal es obtener eventos almacenados tanto en los logs clásicos (como «System» o «Application») como en los registros creados desde Windows Vista en adelante, además de archivos externos (.evtx, .etl y .evt).
Este comando incorpora importantes ventajas respecto a su antecesor, Get-EventLog. Por ejemplo, puede consultar registros que Get-EventLog no alcanza, permite utilizar filtros avanzados (tablas hash, XPath, XML estructurado) y trabajar con registros remotos sin depender del sistema clásico de remoting de PowerShell. Así, se convierte en una herramienta básica para monitorizar, auditar y resolver incidencias o analizar la actividad tanto de sistemas individuales como de grandes infraestructuras de servidores.
Sintaxis general y conjuntos de parámetros
El cmdlet Get-WinEvent presenta una sintaxis versátil que admite múltiples formas de uso según la información que se desee obtener y el tipo de filtro que se aplica. Algunos de los conjuntos de parámetros más habituales son:
- Búsqueda por nombre de registro:
Get-WinEvent >] ... - Listado de registros disponibles:
Get-WinEvent -ListLog * - Consulta de proveedores de registros:
Get-WinEvent -ListProvider * - Filtrado por tabla hash:
Get-WinEvent -FilterHashtable @{ LogName='Application'; Id=1001 } - Filtrado por XPath:
Get-WinEvent -FilterXPath "*]" - Filtrado por XML:
Get-WinEvent -FilterXml $xmlQuery
Nota importante: Sin parámetros, Get-WinEvent recupera todos los eventos de todos los registros en el equipo local, lo cual puede generar una salida muy extensa. Para detener el comando, basta presionar CTRL + C.
Principales parámetros de Get-WinEvent
El cmdlet soporta una gran variedad de parámetros, lo que permite obtener exactamente la información que necesitamos. Aquí tienes un resumen detallado de los más importantes:
- -LogName: Permite especificar uno o varios nombres de registros de eventos. Se aceptan comodines.
- -ProviderName: Filtra los resultados en función de proveedores de eventos concretos. Ideal para identificar el origen de determinados eventos.
- -Path: Permite consultar eventos en archivos guardados con extensión .evtx, .evt o .etl, incluso de otras máquinas.
- -FilterHashtable: Admite una tabla hash con pares clave-valor para filtrar de manera eficaz por múltiples criterios (como LogName, ProviderName, ID, Level, fechas, etc).
- -FilterXPath / -FilterXml: Permiten aplicar filtros basados en XPath o consultas XML para criterios complejos.
- -MaxEvents: Limita el número máximo de eventos devueltos, lo que es muy útil para evitar salidas gigantescas.
- -Oldest: Puede indicarse para recibir los eventos ordenados del más antiguo al más nuevo (por defecto es al revés).
- -ComputerName: Consulta registros en equipos remotos especificando el nombre NetBIOS, FQDN o IP.
- -Credential: Permite autenticarse como otro usuario o con credenciales distintas a las actuales.
- -Force: Obliga a incluir logs de depuración y analíticos en la consulta, además de los habituales.
Muchos de estos parámetros pueden combinarse para lograr una consulta precisa y potente.
Filtrado avanzado: uso de FilterHashtable

Uno de los mayores puntos fuertes de Get-WinEvent es su capacidad para filtrar eventos usando tablas hash. En vez de obtener todos los eventos y después filtrarlos en un segundo paso (algo poco eficiente), FilterHashtable aplica los filtros en el propio proceso de obtención, mejorando el rendimiento y reduciendo el consumo de recursos, especialmente en logs voluminosos.
Una tabla hash en este contexto consiste en pares clave-valor como @{ LogName='Application'; Id=1001; Level=2 }. Cada pareja será un criterio de búsqueda. Las claves principales aceptadas incluyen:
- LogName (admite comodines): nombre del registro.
- ProviderName (admite comodines): origen del evento.
- Path: ruta de archivos de logs guardados.
- Id: identificador numérico del evento.
- Level: nivel de severidad (Error=2, Warning=3, Informational=4…)
- Keywords: filtro por palabras clave técnicas (tipo Long[]).
- StartTime / EndTime: filtrar por rango de fechas.
- UserID: SID o nombre de usuario asociado al evento.
- Data o <named-data>: datos personalizados del evento.
Por ejemplo, para obtener eventos críticos de un proveedor concreto en el registro de aplicaciones desde hace 2 días:
$fecha = (Get-Date).AddDays(-2)
Get-WinEvent -FilterHashtable @{ LogName='Application'; ProviderName='.NET Runtime'; Level=1; StartTime=$fecha }
Consejo: Cada clave de la tabla hash debe aparecer solo una vez y los comodines solo son válidos en LogName y ProviderName.
Ejemplos prácticos de uso
Consultar y analizar registros de eventos puede parecer tedioso, pero con la versatilidad de este cmdlet las posibilidades son inmensas. Aquí tienes algunos ejemplos basados en escenarios reales:
- Listar todos los registros de eventos disponibles en el sistema:
Get-WinEvent -ListLog * - Obtener los eventos más recientes del registro ‘System’:
Get-WinEvent -LogName System -MaxEvents 10 - Filtrar solo los errores de aplicaciones:
Get-WinEvent -FilterHashtable @{ LogName='Application'; Level=2 } - Ver eventos generados por un proveedor:
Get-WinEvent -FilterHashtable @{ LogName='Application'; ProviderName='Application Error' } - Consultar eventos en logs de otros equipos:
Get-WinEvent -LogName System -ComputerName Servidor01 - Leer archivos guardados:
Get-WinEvent -Path 'C:\Test\Windows PowerShell.evtx' - Obtener eventos de una palabra clave concreta:
Get-WinEvent -LogName *PowerShell*, Microsoft-Windows-Kernel-WHEA* | Group-Object -Property LevelDisplayName, LogName -NoElement | Format-Table -AutoSize
Salida, objetos devueltos y compatibilidad
Dependiendo de los parámetros utilizados, Get-WinEvent puede devolver objetos de distintos tipos:
- EventLogConfiguration: al usar -ListLog, proporciona configuración y propiedades de cada registro.
- ProviderMetadata: con -ListProvider, muestra metadatos de proveedores de eventos.
- EventLogRecord: por defecto, representa cada evento concreto y sus atributos (fecha, ID, mensaje, etc).
Se pueden procesar en pipeline y filtrar, agrupar o exportar a otros formatos (CSV, HTML, XML…). Cabe recordar que Get-WinEvent sustituye progresivamente a Get-EventLog, que estaba más limitado y solo soporta logs clásicos.
Visualización y análisis avanzado de logs
Además del análisis de eventos a través de consola o scripts, puedes inspeccionar logs mediante el Visor de eventos de Windows ((https://mundobytes.com/como-usar-el-visor-de-eventos-de-windows-para-detectar-y-anticipar-problemas/)), aunque Get-WinEvent permite mayor automatización, integración y uso remoto.
Para analizar tendencias o incidencias, aprovecha cmdlets como Group-Object para agrupar eventos por ID, Sort-Object para ordenarlos, y Select-Object para limitar los campos mostrados. Por ejemplo, para ver cuántos eventos de cada tipo tienes en el log:
$eventos = Get-WinEvent -LogName 'Windows PowerShell'
$eventos | Group-Object -Property LevelDisplayName | Format-Table Count, Name
Filtrado por XPath y XML: cuando necesitas precisión máxima
En escenarios especialmente complejos puede ser útil usar parámetros como -FilterXPath y -FilterXml para consultas avanzadas. Por ejemplo, para encontrar eventos de cierto nivel y fecha concreta en el log de Windows PowerShell:
# Filtrado por XPath
Get-WinEvent -LogName 'Windows PowerShell' -FilterXPath "*]]"
# Filtrado por XML
$xmlQuery = @'
<QueryList>
<Query Path="Windows PowerShell">
<Select Path="System">*]]</Select>
</Query>
</QueryList>'
Get-WinEvent -FilterXml $xmlQuery
Comparativa con Get-EventLog y buenas prácticas

Aunque Get-EventLog sigue existiendo para compatibilidad retroactiva, sus capacidades son notoriamente inferiores. Por ejemplo, solo accede a logs clásicos y no permite filtrar por proveedor o mediante XPath/Hashtable. En cuanto PowerShell avance y crezcas tus necesidades, lo recomendable es familiarizarse con Get-WinEvent y aprovechar filtros avanzados y procesamiento de grandes volúmenes de eventos con menor impacto en rendimiento.
Algunas recomendaciones útiles:
- Utiliza Get-EventLog para consultas rápidas en logs de sistema o seguridad.
- Aplica Get-WinEvent para filtrar y analizar logs modernos, registros archivados y escenarios complejos.
- Para buscar la ruta exacta de los logs no clásicos, usa primero el Visor de Eventos y copia la ruta para el parámetro -LogName.
- Evita volcar todos los eventos en consola: usa -MaxEvents para limitar la salida o filtra con tablas hash.
- Cuando trabajes con logs grandes o en equipos múltiples, automatiza tareas con scripts y pipelines.
Variables y personalización del registro de PowerShell
PowerShell permite configurar qué tipos de eventos se registran editando variables de preferencia como $LogEngineLifeCycleEvent o $LogCommandHealthEvent. Así puedes decidir si registrar detalles del motor, proveedores, o comandos ejecutados, ajustando la granularidad según tus necesidades.
La activación/desactivación se realiza así:
$LogCommandLifeCycleEvent = $true # Para registrar inicio/fin de comandos
$LogProviderHealthEvent = $false # Para desactivar eventos de proveedor
Los cambios afectan solo a la sesión actual, a menos que se añadan al perfil de PowerShell.
Preguntas frecuentes sobre Get-WinEvent y registros de eventos
- ¿Puedo limpiar el registro de eventos de PowerShell?
Sí, conClear-EventLog -LogName "Windows PowerShell"o desde el Visor de eventos (botón derecho > Vaciar registro). - ¿Dónde se almacenan los archivos de log de eventos?
Se localizan en%SystemRoot%\System32\winevt\Logsen archivos .evtx. - ¿Es posible reenviar logs a un sistema centralizado?
Correcto. Se puede configurar Windows para reenviar registros de eventos a un servidor central mediante servicios nativos o herramientas externas. - ¿Get-WinEvent funciona en cualquier versión de Windows?
Solo está soportado en Windows Vista, Server 2008 R2 en adelante. No funciona en Windows PE ni en Nano Server.
Índice
- 1 ¿Qué es Get-WinEvent y por qué es tan útil?
- 2 Sintaxis general y conjuntos de parámetros
- 3 Principales parámetros de Get-WinEvent
- 4 Filtrado avanzado: uso de FilterHashtable
- 5 Ejemplos prácticos de uso
- 6 Salida, objetos devueltos y compatibilidad
- 7 Visualización y análisis avanzado de logs
- 8 Filtrado por XPath y XML: cuando necesitas precisión máxima
- 9 Comparativa con Get-EventLog y buenas prácticas
- 10 Variables y personalización del registro de PowerShell
- 11 Preguntas frecuentes sobre Get-WinEvent y registros de eventos
