So fragen Sie Windows-Ereignisprotokolle mit PowerShell ab

Abrufen der Windows-Ereignisprotokolldaten mit PowerShell – Was Sie wissen müssen

Die Windows-Ereignisprotokolle können ganz schön nervenaufreibend sein, wenn man sich damit nicht auskennt. Wer schon einmal Hunderte oder Tausende von Protokollen durchforstet hat, weiß, wie langsam und umständlich die integrierte Ereignisanzeige sein kann. Oft spart es viel Zeit und Mühe, den Prozess zu automatisieren oder gezielt Informationen von Remote-Servern abzurufen. Hier kommt PowerShells Get-WinEvent ins Spiel – flexibler, schneller und ehrlich gesagt eine echte Erleichterung beim Durchsuchen von Protokollen, insbesondere auf großen oder mehreren Rechnern. In dieser Anleitung erfahren Sie, wie Sie die Funktionen optimal nutzen, effizient filtern und die benötigten Informationen ohne lange Wartezeiten abrufen.

So durchsuchen Sie Ereignisprotokolle mit PowerShell

Mit Get-WinEvent direkt auf die Protokolle zugreifen.

Zunächst sollten Sie sicherstellen, dass Sie PowerShell als Administrator ausführen. Andernfalls stoßen Sie auf Probleme – bestimmte Protokolle, wie beispielsweise das Sicherheitsprotokoll, werden nicht angezeigt. Sobald Sie dies erledigt haben, ist das Abrufen aktueller Ereignisse, beispielsweise aus dem Anwendungsprotokoll, ganz einfach:

Get-WinEvent -LogName Application -MaxEvents 20

Ganz einfach, aber effektiv, um einen Blick auf die Vorgänge zu werfen. Benötigen Sie weitere Protokolle? Fügen Sie einfach den entsprechenden Befehl hinzu, -ListLog *um alle verfügbaren Protokolle anzuzeigen. Wenn Sie beispielsweise Ereignisse der Remotedesktopverbindung einsehen möchten, schauen Sie im Protokoll „Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational“ nach :

Get-WinEvent -LogName Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational

Gleiches gilt für SSH-Protokolle, wenn Sie OpenSSH unter Windows verwenden:

Get-WinEvent -LogName OpenSSH/Operational

Wenn Sie in mehreren Protokollen, wie z. B.System- und Anwendungsprotokollen, nach Fehlern oder Warnungen suchen und nur Protokolle des letzten Tages benötigen, kombinieren Sie Filter:

$StartDate = (Get-Date) - (New-TimeSpan -Days 1) Get-WinEvent -LogName Application, System | Where-Object { ($_. LevelDisplayName -eq "Error" -or $_. LevelDisplayName -eq "Warning") -and $_. TimeCreated -ge $StartDate }

Möchten Sie bestimmte Felder auswählen – wie z. B.den Rechnernamen, den Zeitstempel, die Ereignis-ID oder Benutzerinformationen? Leiten Sie die Ausgabe um durch Format-Table:

Get-WinEvent -LogName System | Format-Table Machinename, TimeCreated, Id, UserID

Oder wandeln Sie Benutzernamen aus irgendeinem Grund in SIDs um, indem Sie einfach eine Eigenschaft wie diese hinzufügen:

Get-WinEvent -FilterHashtable @{LogName='System'} | Select-Object @{Name="Computer";Expression={$_.machinename}}, @{Name="UserSID";Expression={$_. UserId. Translate([System. Security. Principal. NTAccount]).Value}}, TimeCreated

Schnellere Ereignissuche mit FilterHashtable

Hier wird es etwas professioneller. Die vorherige Methode – das Zusammenführen von Filtern mit Where-Object – funktioniert zwar, ist aber bei großen Mengen an Protokollen quälend langsam. Stattdessen können Sie Get-WinEvent mit dem Parameter FilterHashtable direkt mitteilen, was gefiltert werden soll, was die Verarbeitung deutlich beschleunigt. Es ist, als würden Sie Windows genau sagen, was Sie wollen, und jeglichen unnötigen Aufwand überspringen.

Um den Unterschied zu messen: Angenommen, Sie möchten Fehler und Warnungen der letzten 30 Tage erhalten.

$StartDate = (Get-Date).AddDays(-30) # Slow way — uses Where-Object Measure-Command { Get-WinEvent -LogName Application, System | Where-Object { ($_. LevelDisplayName -eq "Error" -or $_. LevelDisplayName -eq "Warning") -and $_. TimeCreated -ge $StartDate } } # Faster way — using FilterHashtable Measure-Command { Get-WinEvent -FilterHashtable @{LogName='System', 'Application'; Level=2, 3; StartTime=$StartDate} } 

In den meisten Konfigurationen ist der FilterHashtable-Ansatz *deutlich* schneller und reduziert die Laufzeit oft erheblich – beispielsweise von über einer Minute auf wenige Sekunden. Kombinieren Sie Filter, wo immer möglich; wenn Sie beispielsweise nach einer bestimmten EventID suchen, fügen Sie einfach id=1234die Hashtabelle hinzu.

Get-WinEvent -FilterHashtable @{LogName='System'; ID=1074} | Format-Table TimeCreated, Id, Message

Mit einem solchen Filter lassen sich genau die Informationen finden, die Sie suchen – wie etwa Abschaltereignisse, Neustartprotokolle oder Anmeldefehler –, ohne dass irrelevante Einträge angezeigt werden.

Erweiterte Filterung mit FilterXml

Manchmal reicht FilterHashtable nicht aus, wenn Ihre Filteranforderungen komplex sind. Hier kommt FilterXml ins Spiel – die magische XML-Abfragesprache, die komplexe Suchvorgänge mit mehreren Kriterien ermöglicht. Klingt kompliziert, aber Sie können diese Abfragen über die grafische Oberfläche der Ereignisanzeige erstellen (oder bestehende wiederverwenden).

Hier ein kurzes Beispiel: Ermitteln Sie die letzten kritischen Fehler aus dem Systemprotokoll des vergangenen Monats:

$xmlQuery = @' <QueryList> <Query Id="0" Path="System"> <Select Path="System"> *[System[(Level=2 or Level=3) and TimeCreated[timediff(@SystemTime) <= 2592000000]]] </Select> </Query> </QueryList> '@

Führen Sie es aus mit:

Get-WinEvent -FilterXML $xmlQuery

XML-Abfragen direkt aus der Ereignisanzeige kopieren: Führen Sie den Befehl aus eventvwr.msc, filtern Sie ein Protokoll, wechseln Sie zur Registerkarte „XML“ und kopieren Sie den XPath-Code. Sie können diese Zeile bei Bedarf manuell anpassen. Ganze Protokolllisten können Sie mit folgendem Befehl als CSV-Datei exportieren:

$events = Get-WinEvent -FilterXML $xmlQuery $events | Export-CSV "C:\Logs\FilteredEvents.csv" -NoTypeInformation -Encoding UTF8

Abrufen von Protokollen von Remote-Rechnern

Möchten Sie Protokolle von anderen Rechnern in Ihrem Netzwerk erhalten? Geben Sie einfach den Parameter „-ComputerName“ an und fügen Sie den Namen des Remote-Hosts hinzu:

$server = 'mun-dc01' Get-WinEvent -ComputerName $server -LogName System -MaxEvents 50 | Select-Object Message, Id, TimeCreated

Bei mehreren Servern können Sie eine Liste aus einer Textdatei lesen:

$servers = Get-Content -Path C:\ps\servers.txt foreach ($srv in $servers) { Get-WinEvent -ComputerName $srv -LogName System -MaxEvents 5 | Select-Object MachineName, Id, Message, TimeCreated } 

Und für domänenweite Suchvorgänge, insbesondere zu Sicherheitsereignissen wie Kontosperrungen, könnten Sie alle Domänencontroller abfragen:

$Username = 'a.muller' Get-ADDomainController -Filter * | ForEach-Object { $GweParams = @{ 'ComputerName' = $_. Hostname 'LogName' = 'Security' 'FilterXPath' = "*[System[EventID=4740] and EventData[Data[@Name='TargetUserName']='$Username']]" } Get-WinEvent @GweParams } 

Es ist schon erstaunlich, wie viele Informationen man mit ein bisschen Skripting abrufen kann. Der Schlüssel liegt darin, die richtigen Filterkriterien zu kennen und die Abfragen effizient zu strukturieren.

Zusammenfassung

Das PowerShell- Tool Get-WinEvent ist nahezu unverzichtbar, wenn Sie regelmäßig mit Protokollen arbeiten oder schnell detaillierte Informationen aus verschiedenen Quellen benötigen. Die Kombination integrierter Filter mit benutzerdefinierten XML-Abfragen spart Zeit und vereinfacht die Fehlersuche erheblich. Manchmal macht es den entscheidenden Unterschied, die richtigen Befehle und Filter zu kennen oder zu wissen, wo man serverseitig suchen muss. Zugegeben, es kann schnell komplex werden, aber mit etwas Übung erkennen Sie das Potenzial der Automatisierung.

Zusammenfassung

  • Führen Sie PowerShell als Administrator aus, um auf alle Protokolle zuzugreifen.
  • Get-WinEvent -LogName...Zur einfachen Holzernte geeignet.
  • Mit FilterHashtable schneller filtern.
  • Komplexe Abfragen? Verwenden Sie FilterXml mit generiertem XML.
  • Für Remote-Protokolle geben Sie -ComputerName an.
  • Kombinieren Sie mehrere Filter für effiziente Suchvorgänge.

Zusammenfassung

Hoffentlich beschleunigt das die Protokollanalyse oder die Automatisierung von Aufgaben. Sobald man den Dreh raus hat, ist es ganz einfach – und viel schneller als das Durchklicken der Ereignisanzeige. Warum also nicht die Arbeit vereinfachen und Zeit sparen?