Windows Event Logs mit PowerShell überprüfen (Get-EventLog)

Windows Event Logs ist eines der ersten Tools, nach dem ein Administrator greift, um Probleme zu analysieren und deren Ursache zu finden. Es ist jedoch nicht der einzige Weg, in dem man es nutzen kann. In diesem Artikel zeige ich Ihnen, wie Sie mithilfe von PowerShell und Get-EventLog einige Event-Log-Zauber ausführen können. Aber zuerst ein paar Worte über die Logs selbst.

Windows Event Logs mit PowerShell überprüfen (Get-EventLog)

Event-Logging in Windows

Zunächst gibt es zwei Zugriffsmöglichkeiten auf die in Windows geloggte Events – über den Event Viewer und mithilfe der Get-EventLog- / Get-WinEvent-Cmdlets. Der Event Viewer ist ein intuitives Tool, mit dem Sie alle benötigten Informationen finden können, soweit Sie wissen, wonach Sie suchen. Das Durchsuchen der Logs mit PowerShell hat jedoch einen gewissen Vorteil: Sie können Events auf lokalen sowie Ferncomputern viel schneller mit der Konsole überprüfen. Es ist ein unschätzbarer Vorteil, wenn es sich um die Überwachung des Serverzustands handelt. PowerShell ermöglicht es Ihnen, automatische Berichte über die wichtigsten Events zu erstellen und sie bei Ihrem Morgenkaffee zu lesen.

Get-WinEvent kontra Get-EventLog

Vielleicht fragen Sie sich, was der Unterschied zwischen Get-WinEvent und Get-EventLog ist. Get-WinEvent ist eine neuere Version von Get-EventLog. Die Cmdlets haben ähnliche Funktionsweise, wobei Get-EventLog für die meisten Fällen ausreichend ist. Laut TechNet besteht der Hauptunterschied darin, dass Get-WinEvent mit der in Windows Vista eingeführten Windows-Event-Log-Technologie arbeitet. Um eine klarere Erklärung zu erhalten, können Sie zwei einfache Cmdlets verwenden:

Get-EventLog -list

Get-WinEvent -ListLog * | where {$_.RecordCount -gt 0}

Wie Sie sehen, ist Get-WinEvent ein klarer Gewinner, wenn es um die Menge der Daten geht, auf die es zugreifen kann.

Beachten Sie, dass die Namen einiger Attribute in diesen beiden Cmdlets unterschiedlich sind. Daher müssen Sie möglicherweise etwas übersetzen, wenn Sie die Syntax vom Get-WinEvent mit dem Get-EventLog verwenden möchten. Wenn Sie wissen möchten, wie Sie die Ergebnisse filtern können, tippen Sie Folgendes ein:

Get-EventLog application -newest 1 | Get-Member

Obwohl Get-EventLog ein „Legacy-Cmdlet“ ist, funktioniert es in den meisten Diagnosefällen immer noch tadellos. Es hat auch einen klaren Vorteil: Sie können die Attribute „-After“ und „-Before“ verwenden, um Ergebnisse nach Datum zu filtern. Dank dieser Funktion werden datenbezogene Abfragen viel schneller ausgeführt.

Bevor Sie mit dem Durchsuchen der Logs nach bestimmten Ereignissen beginnen, ist es eine gute Idee, sich mit der Struktur vertraut zu machen und eine allgemeine Vorstellung davon zu bekommen, wie der Logging-Mechanismus funktioniert. Der Event Viewer ist genau das richtige Tool, um damit loszulegen.

Der Event Viewer

Die Menge an Logging-Informationen kann überwältigend sein. Das macht Datenfilterung zu Ihrer Priorität. Um sich mit der Struktur vertraut zu machen, können Sie den Event Viewer verwenden.

Der schnellste Weg zum Starten vom Event Viewer ist es, die Tastenkombination Win + R zu verwenden und eventvwr auszuführen:

Event Viewer betätigen

Diese Aktion öffnet den Event Viewer:

Der Event Viewer

In der Baumstruktur auf der linken Seite können Sie alle Einträge des Event Viewers durchsuchen. Die am häufigsten verwendeten Logs sind Application, System und Security.

Probleme auf mehreren Computern mit PowerShell diagnostizieren

Die größte Herausforderung bei der Einrichtung der Cmdlets Get-EventLog oder Get-WinEvent ist die Filterung von Ergebnissen. Zuerst ist es wichtig zu wissen, wonach man sucht. Als Nächstes braucht man sicherzustellen, dass Ihre Abfrage nicht dazu führt, dass die PowerShell-Konsole durchdreht.

Eine Diagnose kann beispielsweise durch die Verwendung des folgenden Skripts durchgeführt werden:

$servers = Get-TransportService;
foreach ($server in $servers);
{Write-Host "Scanning the event log of: " -NoNewLine; Write-Host $server;
Get-EventLog system -After (Get-Date).AddHours(-12) | where {($_.EntryType -Match "Error") -or
($_.EntryType -Match "Warning")} | ft -wrap >> "C:/$server.csv";
Get-EventLog application -After (Get-Date).AddHours(-12) | where {($_.EntryType -Match "Error") -or
($_.EntryType -Match "Warning")} | ft -wrap >> "C:/$server.csv"}

Das Skript ruft Informationen über alle Error- und Warning-Events ab, die in den letzten 12 Stunden in System-and-Application-Logs für eine Liste von Servern generiert wurden. Sie können das Get-TransportService-Cmdlet durch eine andere Liste von Maschinen ersetzen, die Sie diagnostizieren möchten.

Anmelde- und Abmeldezeit mit PowerShell überprüfen

Es gibt einige Möglichkeiten zu überprüfen, wann ein bestimmtes Gerät eingeschaltet wurde. Wenn Sie nur sehen möchten, wann ein Benutzer zum ersten Mal an einem bestimmten Datum angemeldet ist, verwenden Sie das folgende Cmdlet:

Get-EventLog system -after (get-date).AddDays(-1) | where {$_.InstanceId -eq 7001}

Um zu erfahren, wann der Computer an einem bestimmten Datum eingeschaltet wurde, können Sie das erste geloggte Event auswählen:

$today = get-date -Hour 0 -Minute 0;
Get-EventLog system -after $today | sort -Descending | select -First 1

Diese Cmdlets funktionieren jedoch nicht, wenn Sie die Verwendung eines gemeinsam genutzten Computers überwachen möchten.

Sie könnten die Security-Events durchsuchen und nach Ereignis-IDs 4624 (Anmeldung) und 4625 (Abmeldung) suchen. Das Security-Log enthält jedoch normalerweise eine größte Anzahl von Datensätzen, was das Durchsuchen sehr zeitaufwendig machen kann. Glücklicherweise speichert das System-Log auch Anmelde- und Abmeldedaten und die Angabe der genauen Quelle des Log-Eintrags ermöglicht eine relativ schnelle Suche. Das folgende Skript gibt eine Liste der Anmelde- und Abmelde-Events auf dem Zielcomputer mit den genauen Zeiten und Benutzern aus den letzten sieben Tagen zurück.

$logs = get-eventlog system -ComputerName <name of the monitored computer> -source Microsoft-Windows-
Winlogon -After (Get-Date).AddDays(-7);
$res = @(); ForEach ($log in $logs) {if($log.instanceid -eq 7001) {$type = "Logon"} Elseif
($log.instanceid -eq 7002){$type="Logoff"} Else {Continue} $res += New-Object PSObject -Property
@{Time = $log.TimeWritten; "Event" = $type; User = (New-Object
System.Security.Principal.SecurityIdentifier
$Log.ReplacementStrings[1]).Translate([System.Security.Principal.NTAccount])}};
$res

Ergebnis:

Anmelde- und Abmeldezeit

Wenn Sie detailliertere Ergebnisse benötigen, können Sie die Security-Log-Event-IDs 4800 und 4801 für Lock- und Unlock-Events hinzufügen. Beachten Sie, dass Sie dazu ein weiteres Get-EventLog-Skript ausführen müssen, um Informationen aus dem Security-Log zu erhalten. Dadurch erhöht sich auch die Zeit, die Ihre PowerShell-Konsole zum Abschluss der Aufgabe benötigt.

Lesen Sie auch:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*