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

Comments

  • Anonymous
    January 01, 2003
    Hallo zusammen! Nun, dann gibt es hier offensichtlich noch eine Abhängigkeit, die ich nicht berücksichtigt hatte. Ich vermute: zur PowerShell-Version bzw. zum installierten Betriebssystem. Ich habe ein deutsches Windows 7-System mit entsprechenden Regionalen Einstellungen und Powershell v2 zum Testen benutzt. Insbesondere bei der Implementierung der unterschiedlichen Sprachversionen gibt es signifikante Unterschiede zwischen Windows XP und Windows Vista bzw. Windows 7. Ob nun die Formatierung des Datums mit PowerShell v1 oder mit Windows XP zusammenhängt, kann ich nicht sagen - dazu muß ich erstmal einige Testsysteme aufsetzen. Mit freundlichen Grüßen! Ralf M. Schnell

  • Anonymous
    August 14, 2009
    Bei mir unter Windows XP Prof. 32 Bit Deutsch SP3 (PowerShell v1) funktioniert das nicht so ganz. Mit dem letzten Befehl werden alle Ereignisse vom "Aug 08" angezeigt (also 8. August?). Es sollten aber doch alle "Aug" ausgegeben werden oder? Mit Get-EventLog –LogName System | Where-Object {$_.TimeGenerated –like “04*”} bekomme ich dann alle vom "Aug 04" angezeigt.

  • Anonymous
    August 17, 2009
    Hallo bei mir erscheinen in diesem Fall nur Einträge vom Jul 08! Index Time          Type Source                EventID Message ----- ----          ---- ------                ------- ------- 40351 Jul 08 19:18  Info Service Control M...     7036 Dienst "Sitzungs-Manager f³r Remotedeskto... 40350 Jul 08 19:11  Info Service Control M...     7035 Der Steuerbefehl "beenden" wurde erfolgre... 40349 Jul 08 19:11  Info Service Control M...     7036 Dienst "GFTDeblockService" befindet sich ... 40348 Jul 08 19:10  Info Service Control M...     7035 Der Steuerbefehl "starten" wurde erfolgre...

  • Anonymous
    November 25, 2009
    Hallo Herr Schnell! Das hat nichts mit dem installierten System zu tun sondern mit der falschen Abfragesyntax. Da ja alles Objekte sind wäre die korrekte Abfrage für August: Get-EventLog -LogName System | Where-Object {$.TimeGenerated.Month -eq 8} Problem dabei ist allerdings, dass man dann auch August 2008, 2007 usw. angezeigt bekommt, also sollte man die Abfrage gegebenfalls noch um das Jahr ergänzen. Man ergänzt also noch -and $.TimeGenerated.Year -eq 2009