Ein vollständiger Leitfaden zur Verwendung des PowerShell-Cmdlets Get-WinEvent

Windows verfügt über mehrere verschiedene Ereignisprotokolle, aber wie können Sie sie schnell abrufen? Das Get-WinEvent-Cmdlet kann klassische Windows-Ereignisprotokolle wie die System- und Anwendungsprotokolle, Protokolle, die von der Windows-Ereignisprotokolltechnologie generiert wurden, und sogar Ereignisverfolgungsprotokolle für Windows (ETW) abrufen!

In diesem Artikel erfahren Sie, wie Sie Get-WinEvent nutzen können, um Ereignisse aus Ereignisprotokollen abzurufen und zu filtern!

Voraussetzungen

Um mitzumachen, benötigen Sie nur eine aktuelle Version von Windows 10 und PowerShell 5.1 und höher. Dieser Artikel verwendet Windows 10 und PowerShell 7.1.

Auflisten verfügbarer Protokolle mit Get-WinEvent

Es ist schwierig zu wissen, welche Protokolleinträge Sie möglicherweise benötigen, ohne alle verfügbaren Protokolle zu kennen. Mit Get-WinEvent können Sie alle verfügbaren Protokolle schnell mithilfe des Parameters -ListLog auflisten. Der Parameterwert * teilt Get-WinEvent mit, alle Protokolle ohne Filterung aufzulisten. Wie unten gezeigt, werden alle Protokolle abgerufen, aber nur eine begrenzte Anzahl von Eigenschaften wird mithilfe des Select-Object-Cmdlets angezeigt.

Get-WinEvent -ListLog * | Select-Object LogName, RecordCount, IsClassicLog, IsEnabled, LogMode, LogType | Format-Table -AutoSize

Nicht alle Protokolle sind standardmäßig aktiviert. Sie müssen möglicherweise den Ereignisbetrachter öffnen, das Protokoll suchen und mit der rechten Maustaste darauf klicken, um das Protokoll zu aktivieren, bevor Ereignisse angezeigt werden.

Listing all available event logs.

Alle Protokolle nach Windows Vista werden als *.evtx-Dateien gespeichert anstelle des älteren *.evt-Formats. Die Eigenschaft IsClassicLog gibt an, ob die Ereignisse im Protokoll in einem Nachrichtendatei im Format *.mc oder in einem Manifest im Format *.xml definiert sind.

Eine interessante Eigenschaft ist das LogMode, das Sie vielleicht bemerkt haben, normalerweise auf Circular gesetzt ist.

  • Circular – Überschreibt den ältesten Protokolleintrag, wenn voll.
  • Retain – Behält alle Ereignisse, bis das Protokoll voll ist, und stoppt das Protokollieren, bis Speicher freigegeben ist.
  • AutoBackup – Sichert und archiviert Ereignisprotokolle automatisch, wenn sie voll sind.
Highlighting the LogMode property.

Zuletzt, bei der Betrachtung der LogType-Eigenschaft gibt es verschiedene Arten von Protokollen. Diese Eigenschaft dient mehr zur Kategorisierung, informiert jedoch typischerweise darüber, wie das Protokoll verwendet wird und welche Arten von Ereignissen angezeigt werden.

  • Administrativ – In erster Linie für Endbenutzer und Administratoren bestimmt.
  • Analytisch – Typischerweise ein Protokoll mit hoher Auslastung, das dazu dient, Programmbetrieb zu beschreiben.
  • Debuggen – Gedacht für Entwickler, die tief in die internen Abläufe des Programms eintauchen müssen.
  • Operativ – Ein Ereignis, das während des Betriebs auftritt und nützlich ist, um Vorkommnisse zu diagnostizieren und Prozesse auszulösen.
Highlighting the LogType property.

Auflisten von Ereignisprotokollanbietern

Jetzt, da Sie ein solides Verständnis für die verschiedenen Protokolle und ihre Eigenschaften haben, hilft es zu verstehen, was ein Ereignisprotokollanbieter ist. Ein Anbieter ist in der Terminologie des Ereignisprotokolls eine Quelle eines Ereignisses.

Ereignisprotokollanbieter sind einzigartig und mit jedem Protokoll verknüpft, wie z. B. Anwendungs- oder Systemprotokolle, und dienen als benannte Quelle, von der ein Ereignis stammt.

Vielleicht möchten Sie Probleme beim Filtern von Protokollen finden und sind nur an Problemen eines bestimmten Anbieters interessiert. Verwenden Sie den Parameter -ListProvider, um alle verfügbaren Anbieter anzuzeigen. Wie unten gezeigt, listet das * alle verfügbaren Anbieter und die Protokolle auf, mit denen die Anbieter verknüpft sind, wie z. B. Windows PowerShell oder System.

Get-WinEvent -ListProvider * | Format-Table -Autosize
Listing event log providers.

Vielleicht möchten Sie nur Anbieter auflisten, die für ein bestimmtes Protokoll verfügbar sind, wie z.B. System. Um dies zu tun, könnten Sie Ereignisse mithilfe des Where-Object-Befehls filtern und die Werte der LogLinks-Eigenschaft verwenden. Die LogLinks-Eigenschaft zeigt die verknüpften Ereignisprotokolle als Liste an.

Um die angeforderten Protokolle mit Where-Object zu filtern, verwenden Sie den -In-Vergleichsoperator, um nur Ereignisse mit System im Wert der LogLinks-Eigenschaft zu filtern. Schließlich erleichtert die Verwendung von Format-Table -AutoSize das Lesen der Ausgabe, wie unten gezeigt.

Get-WinEvent -ListProvider * | Where-Object { 'System' -In ($_ | Select-Object -ExpandProperty Loglinks | Select-Object -ExpandProperty Logname) } | Format-Table -AutoSize
Filtering event log providers to a specific log.

Abrufen von klassischen Ereignisprotokollen mit Get-WinEvent

Der erste Schritt bei der Fehlerbehebung eines Windows-Problems besteht darin, entweder das Anwendungs- oder das Systemprotokoll abzurufen, was klassische Ereignisprotokolle sind. Im unten gezeigten Beispiel werden die ersten 100 Ereignisse mithilfe des Parameters -MaxEvents des Anwendungsereignisprotokolls abgerufen.

Um das Lesen der Ergebnisse zu erleichtern, wählen Sie nur die benötigten Eigenschaften aus, um die Einträge einfacher lesen zu können. Andernfalls werden die Einträge nach dem Anbieternamen gruppiert, was das Parsen der Ergebnisliste erschwert.

Get-WinEvent -LogName 'Application' -MaxEvents 100 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Returning events from the Application log.

Die Suche nach modernen Windows-Ereignissen mit Get-WinEvent

Nachdem Sie Ereignisse aus dem klassischen Anwendungsprotokoll abgerufen haben, wie sieht es mit Ergebnissen aus einem neueren Windows-Ereignisprotokoll aus, wie zum Beispiel Microsoft-Windows-WindowsUpdateClient/Operational?

Im Gegensatz zu einem klassischen Ereignisprotokoll wie System handelt es sich bei Microsoft-Windows-WindowsUpdateClient/Operational um ein modernes Protokoll, bei dem Get-WinEvent genauso funktioniert wie unten beschrieben.

Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Returning Windows Event Log records.

Was ist mit dem Abrufen nur der ältesten Ereignisse? Obwohl Sie die Ergebnisse mit Sort-Object umkehren könnten, verwenden Sie den Parameter -Oldest, um die ersten 10 Ereignisse abzurufen, wie unten gezeigt.

Der Befehl Get-WinEvent filtert für Sie anstelle aller Ergebnisse und Sortierungen, was normalerweise langsamer ist.

Get-WinEvent -LogName 'Microsoft-Windows-WindowsUpdateClient/Operational' -Oldest -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Returning only the oldest events in a Windows Event Log.

Abrufen von Ereignisverfolgungsdateien für Windows (ETW) mit Get-WinEvent

Vielleicht haben Sie eine exportierte *.evtx-Datei von einem anderen Computer oder ein vorhandenes Protokoll gesichert. Sie können diese Protokolle mit dem Cmdlet Get-WinEvent lesen. Wenn Sie Protokolle aus Audit-Gründen aufbewahren müssen, ist Get-WinEvent eine großartige Möglichkeit, diese Protokolle schnell mit Standard-Cmdlets in Skripten abzufragen.

Um das Abrufen von Protokolleinträgen aus einer *.evtx-Datei zu demonstrieren, benötigen Sie eine exportierte Protokolldatei.

1. Öffnen Sie den Ereignisanzeige und navigieren Sie zu einem Protokoll. In diesem Beispiel das Protokoll Anwendungs- und Dienstprotokolle → Windows PowerShell.

Navigate to a Windows Event Viewer log.

2. Klicken Sie dann auf den Menüpunkt Alle Ereignisse speichern unter… im Aktionen-Bereich.

Save the log file.

3. Speichern Sie die Datei an einem Speicherort auf der Festplatte, um sie mit dem Befehl Get-WinEvent abzurufen.

Choose a location to save the log file.

Jetzt, da Sie eine Protokolldatei exportiert haben, geben Sie den Dateispeicherort über den Parameter -Path an, um die Ereignisse zu lesen. Im unten gezeigten Beispiel wird das Windows PowerShell-Protokoll exportiert, um es später zu verwenden.

Get-WinEvent -Path 'C:\Articles\WindowsPowerShell.evtx' -MaxEvents 10 | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Retrieving specific events from the exported event file.

Filtern von Windows-Ereignisprotokollen mit Get-WinEvent

Auch wenn Sie Protokolle mit dem Standard-Where-Object-Cmdlet filtern könnten, bietet Get-WinEvent integrierte Filter. Indem Sie alle Ergebnisse zurückgeben und dann filtern, wird mehr Arbeit geleistet, als notwendig ist. Stattdessen sollten Sie immer versuchen, so viel wie möglich bereits an der Quelle zu filtern.

Das Get-WinEvent-Cmdlet bietet drei Parameter, um Ihnen bei der Filterung durch Tausende von Ereignissen zu helfen, genannt -FilterHashTable, -FilterXPath und -FilterXML. Jeder Parameter erledigt im Allgemeinen die gleiche Aufgabe, jedoch auf eine andere Weise.

Filtern von Ereignisprotokollen mit FilterHashTable

Der Parameter -FilterHashTable filtert Inhalte basierend auf den übereinstimmenden Eigenschaften, wie z.B. LogName. Anstatt den Parameter -LogName zu verwenden, um nach einem bestimmten Protokoll zu filtern, können Sie stattdessen eine Hashtabelle verwenden, wie z.B. @{'LogName' = 'Anwendung'}, die der Ereigniseigenschaft LogName entspricht.

Das unten gezeigte Beispiel stellt eine Hashtabelle für den Parameter -FilterHashTable bereit, die nur nach dem Anwendungsprotokoll sucht und mit einer Startzeit, die alle Ereignisse nach Mitternacht des aktuellen Tages umfasst, liefert Get-WinEvent schnell Ergebnisse.

Get-WinEvent -FilterHashTable @{'LogName' = 'Application'; 'StartTime' = (Get-Date -Hour 0 -Minute 0 -Second 0)} | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Filtering events with the FilterHashTable parameter.

Vergleichen Sie die Filtergeschwindigkeiten des oben genannten Befehls mit einem, der über Where-Object anstelle des Parameters -FilterHashTable in der Pipeline gefiltert wird. Wie Sie sehen können, ist der Befehl, der Where-Object verwendet, viel langsamer als derjenige, der den Parameter -FilterHashTable verwendet.

Comparing filtering with FilterHashTable and Where-Object.

Filtern von Ereignisprotokollen mit dem Parameter FilterXPath

Ereignisprotokolleinträge werden als XML-Dateien gespeichert, und daher können Sie die XPath-Sprache, eine XML-Abfragesprache, verwenden, um durch die Protokolleinträge zu filtern. Durchführen des oben verwendeten gleichen Befehls und Übersetzen in XPath können Sie die gleichen Ergebnisse erzielen.

Um eine XPath-Abfrage zu erstellen, verwenden Sie die Filterfunktion im Windows-Ereignisprotokoll, wie unten gezeigt.

1. Öffnen Sie den Ereignisanzeige und navigieren Sie zu einem Protokoll, wie z.B. dem Windows-Protokolle → Anwendung Protokoll.

Opening the Windows Event Viewer.

2. Klicken Sie anschließend auf den Link Filter Current Log im rechten Bereich.

Choosing to Filter the Current Log.

3. Geben Sie die Parameter ein, die Sie zum Filtern des Protokolls verwenden möchten.

Creating a filter for the current log.

4. Klicken Sie auf die XML-Schaltfläche und kopieren Sie den Abschnitt, der innerhalb des Select-Tags enthalten ist.

Copying the XPath command.

5. Kopieren und fügen Sie nun den kopierten Inhalt mit dem -FilterXPath-Parameter ein. Sie können jetzt unten sehen, dass Sie mithilfe der XPath-Syntax aus dem Ereignisprotokoll-Viewer eine Abfrage erstellen können, um nur die erforderlichen Informationen zu filtern.

Get-WinEvent -LogName 'Application' -FilterXPath "*[System[(Level=1  or Level=3)]]" | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Demonstrating the use of the FilterXPath parameter.

Das Eintauchen in die Erstellung von XPath-Abfragen fällt nicht in den Rahmen dieses Artikels, aber das grundlegende Format wird unten gezeigt. Wenn der FilterXPath-Parameter ein Datum filtert, sehen Sie einen großen Unterschied: Sie müssen ein spezifischeres Datumsformat verwenden, yyyy-MM-ddTHH:mm:ss.fffZ, das Datum muss in UTC zurückgegeben werden, was durch den -AsUTC-Schalter angegeben ist.

Get-WinEvent -LogName 'Application' -FilterXPath "*[System[TimeCreated[@SystemTime >= '$(Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0 -Format "yyyy-MM-ddTHH:mm:ss.fffZ" -AsUTC)']]]" | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Filtering events using XPath.

Filtern von Ereignisprotokollergebnissen mit FilterXML

Zuletzt ist der letzte verfügbare Filterparameter der -FilterXML-Parameter. Im Gegensatz zu den -FilterXPath– und -FilterHashTable-Parametern nimmt dieser Parameter XML an, das dann zum Filtern der Ereignisse verwendet wird. Der -FilterXML-Parameter ermöglicht komplexere Regeln und kann wie unten gezeigt die früheren Filterbeispiele replizieren.

Wie im vorherigen Beispiel gezeigt, können Sie eine vorformatierte Abfrage aus der Ereignisanzeige → Aktuelles Protokoll filtern-Fähigkeit abrufen. Anstatt nur den Inhalt im Select-Knoten auszuwählen, verwenden Sie die gesamte Abfrage. Es wurden keine tatsächlichen Filter ausgewählt, wie durch das * im Select-Knoten angegeben. Dies liefert die allgemeine Markup für das nächste Beispiel.

Selecting the entire XML query from Filter Current Log in the Event Viewer.

Statt einen Einzeiligen Befehl zu erstellen, trennen Sie zunächst die XML-Abfrage und weisen Sie das Markup einer Variablen $Query im folgenden Beispiel zu. Das Zuweisen der Abfrage an eine Variable erleichtert die Verwendung und Lesbarkeit. Übergeben Sie anschließend die Variable $Query an den -FilterXML-Parameter von Get-WinEvent.

Wie unten gezeigt, sehen Sie die Ergebnisse der komplexeren Abfrage, die alle Ereignisse dieses Tages zurückgibt und im Anwendungs-Protokoll gespeichert ist.

$Query = "<QueryList>
  <Query Id='0' Path='Application'>
    <Select Path='Application'>*[System[TimeCreated[@SystemTime >= '$(Get-Date -Hour 0 -Minute 0 -Second 0 -Millisecond 0 -Format "yyyy-MM-ddTHH:mm:ss.fffZ" -AsUTC)']]]</Select>
  </Query>
</QueryList>"

Get-WinEvent -FilterXML $Query | Select-Object TimeCreated, ID, ProviderName, LevelDisplayName, Message | Format-Table -AutoSize
Showing how FilterXML works.

Zusammenfassung

Das Cmdlet Get-WinEvent erleichtert das Abfragen mehrerer Ereignisprotokollquellen mit leistungsstarken Filterfunktionen. Vom Auditieren bis zur Problembehebung ist das Cmdlet Get-WinEvent eine wichtige Ergänzung für jeden Systemadministrator!

Source:
https://adamtheautomator.com/get-winevent/