Abfrage von Eventlog-Einträgen mit PowerShell

Eine alltägliche Aufgabe für Administratoren (zumindest für diejenigen, die noch nicht mit dem System Center Operations Manager arbeiten … ;-)  ): Die Abfrage von Einträgen aus dem Eventlog. Das ist mit PowerShell ganz einfach: ‘Get-EventLog’, optional gefiltert z.B. mit ‘-LogName’. Aber wie fragt man Einträge eines bestimmten Zeitraums ab? Die Idee: Filtern mit ‘Where-Object’.

Die folgende Abfrage liefert uns eine kurze Tabelle, der wir die verfügbaren Attribute entnehmen können:

Get-EventLog –LogName System –Newest 10

image

Demnach könnten wir nach ‘Time’ filtern. Also z.B. für alle Einträge vom August:

Get-EventLog –LogName System | Where-Object {$_.Time –eq “Aug*”}

Damit bekommen wir jedoch keinerlei Ergebnis. Ok, erster Fehler: es muß ‘-like’ heißen, nicht ‘-eq’. Sonst bekommen wir nur genaue Übereinstimmungen, und ‘*’ wird nicht als Wildcard interprätiert. Also:

Get-EventLog –LogName System | Where-Object {$_.Time –like “Aug*”}

Nope. Immer noch nichts. Die Lösung bringt ein genauerer Blick auf die Attribute, z.B. mit:

Get-EventLog –LogName System –Newest 1 | fl

image

Es stellt sich heraus, daß die Spalte ‘Time’ in der Tabelle eine formatierte Anzeige des eigentlichen Attributs ‘Time Generated’ ist. Also nächster Versuch, immer noch für Einträge vom August:

Get-EventLog –LogName System | Where-Object {$_.TimeGenerated –like “*.08.*”}

Nope! Denn: die Anzeige des Datums mit ‘fl’ ist ebenfalls formatiert, und zwar entsprechend der Regionalen Einstellungen in der Systemsteuerung. Das PowerShell-Objekt speichert das Datum im US-Format ‘mm/dd/yyyy’, also z.B. ‘08/12/2009’.

Damit bekommen wir folgende Abfrage, die nun auch das gewünschte Ergebnis bringt:

Get-EventLog –LogName System | Where-Object {$_.TimeGenerated –like “08*”}

Mit freundlichen Grüßen!

 

Ralf M. Schnell