Mejores registros de eventos con PowerShell
Como no trabajo en un entorno corporativo, no siempre veo oportunidades en las que PowerShell pueda mejorar su vida como profesional de TI. Tengo una amiga, llamémosla Gladys Kravitz. Gladys y yo estábamos charlando y ella mencionó lo complicado que es extraer información de los registros de eventos de Windows. Si mal no recuerdo, estaba mirando 4625 eventos en el registro de seguridad que representan intentos fallidos de inicio de sesión. He aquí un ejemplo:
Al leer el mensaje, queda claro que el usuario Aprils en el dominio de la empresa intentó iniciar sesión en Win10. Pero, ¿cómo obtendrías esa información de los registros de eventos en 100 máquinas? Podrías recurrir a alguna expresión vudú regular para extraer la información. Los valores son en realidad parte del registro de eventos. Es posible que haya visto ReemplazoStrings al usar Get-Eventlog. Cuando se utiliza Get-WinEvent, estos valores se almacenan como propiedades.
Suponiendo que estos valores fueran consistentes, podría escribir una función para crear un objeto personalizado a partir de estos valores. Pero siempre estoy pensando en el panorama más amplio. Lo que Gladys realmente quería es una manera de convertir el registro de eventos en un objeto estructurado que pudiera usar en PowerShell. Este problema con las cadenas de repuesto va más allá de esta situación particular.
XML al rescate
Probablemente no piense en XML como una solución, pero en este caso, XML salva el día. El objeto de registro de eventos que obtiene de Get-WinEvent incluye un método para crear una versión XML.
$r = get-winevent -FilterHashtable @{Logname="Security";ID=4625} -MaxEvents 1 -ComputerName Win10 [xml]$evt = $r.ToXml() Este documento tiene propiedades que exponen los datos utilizados para construir el registro de eventos.
El nodo de datos parece prometedor.
¡Eso casi parece un objeto! Haré uno.
$evt.Event.EventData.Data | foreach-object -Begin {$h = @{}} -Process {
$h.add($_.name,$_.'#text')
} -end { $obj = New-Object -TypeName PSObject -Property $h }Puedo crear una herramienta en torno a esto para convertir registros de eventos en objetos más significativos. Y eso es exactamente lo que hice por Gladys.
Convertir-EventLogRecord
Escribí una función llamada Convert-EventLogRecord que forma parte de la última versión de mi módulo PSScriptTools. La función está diseñada para convertir entradas del registro de eventos en objetos personalizados. La función crea un objeto personalizado con las propiedades de datos que mostré, pero también con otra información, como la identificación del evento, el nombre del registro y el nombre de la computadora.
Ahora Gladys tiene una herramienta PowerShell para obtener la información que desea en la forma que desea.
Esta no es una herramienta perfecta. Algunas incluso las entradas de registro no tienen datos adicionales. O los datos que tienen son solo una lista de cadenas. En esos casos, los datos se almacenan como RawProperties.
Pero una vez que lo sé, puedo escribir un script de control u otras herramientas.
A medida que exploras diferentes eventos en diferentes registros, descubres cómo se ven las cosas. A veces, los datos del registro de eventos no son útiles. Pero con un poco de esfuerzo de PowerShell de su parte, puede crear resultados significativos. Debería poder ejecutar este código en su escritorio.
Get-WinEvent -FilterHashtable @{Logname ='system';ID =7040} -MaxEvent 50 |
Convert-EventlogRecord |
Sort-Object -Property Param4,TimeCreated -Descending |
Format-Table -GroupBy @{Name="Service";Expression={$_.param4}} -Property TimeCreated,
@{Name="OriginalState";Expression = {$_.param2}},
@{Name="NewState";Expression={$_.param3}},ComputernameLos resultados le muestran cuándo los servicios cambiaron de estado.
He estado mostrando resultados como tablas formateadas. Pero puedes hacer lo que quieras porque la función Convert-EventLogRecord escribe un objeto en la canalización. Ejecute cualquier consulta o comando Get-Winevent que desee, convierta los resultados y luego haga lo que necesite con los resultados.
Le di el código a Gladys para que lo probara, pero ahora también puedes obtenerlo en el módulo PSScriptTools, a partir de la versión 2.13. Espero que lo pruebes y me cuentes lo que piensas.