Für die Fehlerbehebung oder Untersuchung potenzieller Datenschutzverletzungen stellt das Windows-Ereignisprotokoll einen guten Ausgangspunkt dar. Windows bietet eine umfangreiche Liste verschiedener Ereignisprotokolle, die nach Anbieter gruppiert sind und teilweise eine sehr große Anzahl von aufgezeichneten Ereignissen enthalten. Da alle Ereignisse aufgezeichnet werden, lässt sich nur sehr schwer herauszufinden, was wirklich vor sich geht. PowerShell bietet eine Möglichkeit, mit der Sie nicht nur auf einem, sondern auf Hunderten von Servern gleichzeitig nach Ereignisprotokollen suchen können.
PowerShell verfügt über zwei wesentliche Befehle, mit denen Sie Ereignisprotokolle abfragen können, „Get-EventLog“ und „Get-WinEvent“. In diesem Artikel konzentrieren wir uns auf den Befehl „Get-WinEvent“, da dieser alle Arten von Ereignisprotokollen unterstützt und über bessere Filterfunktionen verfügt.
Die Abfrage von Ereignissen von Servern mit „Get-WinEvent“ ist einfach. Das Cmdlet „Get-WinEvent“ verwendet den Parameter „ComputerName“, um einen Remote-Server festzulegen. Wir müssen auch den Namen des Ereignisprotokolls angeben, das mit dem Parameter „LogName“ abgefragt wird. Unten sehen Sie, dass die Ausgabe nach Anbieter gruppiert ist.
Wir wollen normalerweise nicht alle Ereignisse in einem bestimmten Protokoll finden. Daher gibt es Optionen, um die Ausgabe einzuschränken. Als Erstes können wir den Parameter „MaxEvents“ verwenden. Dieser filtert die Ergebnisse nicht, sondern begrenzt lediglich die Anzahl der zurückgegebenen Ereignisse.
PS> Get-WinEvent -ComputerName SRV1 -LogName System -MaxEvents 1
Eine Möglichkeit die Suche einzugrenzen und die Ereignisse mit dem Befehl „Get-WinEvent“ zu filtern, ist die Verwendung des Parameters „FilterHashTable“. Mit diesem Parameter können Sie einen Hashtable als Eingabe bereitstellen, der verschiedene Attribute zum Filtern von Ereignissen festlegt.
Beispielsweise könnten wir Ereignisse danach filtern, wie kritisch sie sind, indem wir den Ebenenschlüssel (Level Key) innerhalb des Parameters „FilterHashTable“ verwenden. Im folgenden Beispiel werden bei der Abfrage nur kritische Ereignisse und Fehler vom SRV2-Server zurückgeben.
Get-WinEvent -ComputerName SRV1 -FilterHashtable @{
LogName = 'System'
Level = 1,2 # 1 Critical, 2 Error, 3 Warning, 4 Information
}
Wir können auch andere Ereignisprotokollabfragen durchführen, indem wir Kontosperrungen suchen, die ein Ereignis mit ID 4740 im Sicherheitsprotokoll erstellen. Oder wir können nach dem Anbieter filtern. Es gibt viele verschiedene Arten, wie man Ereignisprotokolle durchsuchen kann.
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
ID = 4740
}
Get-WinEvent -FilterHashtable @{
LogName = 'System'
ProviderName = 'Microsoft-Windows-GroupPolicy'
}
Da wir nun eine gute Vorstellung davon haben, wie man Ereignisse abfragt und filtert, können wir das Ganze auf die Durchführung von Abfragen auf mehreren Computern ausweiten. Dazu müssen Sie den Befehl „Get-WinEvent“ für jeden einzelnen Remote-Computernamen ausführen. Außerdem müssen wir eine ForEach-Schleife erstellen, um alle unsere Server abzufragen.
Nehmen wir an, ich habe eine Liste von Servern in einer Textdatei, und ich möchte alle Server auf Ereignisprotokolle durchsuchen. Um die Textdatei zu lesen, kann ich den Befehl „Get-Content“ verwenden. Es werden alle Servernamen zurückgegeben, die ich anschließend an den Parameter „ComputerName“ des Befehls „Get-WinEvent“ übergeben kann. Das folgende Beispiel fragt das Systemereignisprotokoll ab und gibt die ersten fünf Ereignisse von jedem Server zurück, der in der Textdatei „C:\servers.txt“ definiert ist.
$servers = Get-Content -Path C:\servers.txt
foreach ($server in $servers) {
Get-WinEvent -ComputerName $server -MaxEvents 5 -FilterHashtable @{
LogName = 'System'
}
}
Dabei werden die erwarteten Ereignisse zurückgegeben, aber Sie können nicht erkennen, von welchem Server das jeweilige Ereignis stammt. Um dieses Problem zu umgehen, kann ich festlegen, dass die Eigenschaft „MachineName“ nur mit den Eigenschaften zurückgegeben wird, die mir wichtig sind. Vielleicht möchte ich die Ereignis-ID und den Servernamen angezeigt bekommen. Ich kann die Ausgabe durch diese Eigenschaften einschränken, indem ich „Select-Object“ verwende.
$servers = Get-Content -Path C:\servers.txt
foreach ($server in $servers) {
Get-WinEvent -ComputerName $server -MaxEvents 5 -FilterHashtable @{
LogName = 'System'
} | Select-Object -Property ID, MachineName
}
Id MachineName
-- -----------
7036 SRV1.techsnips.local
10016 SRV2.techsnips.local
7036 SRV3.techsnips.local
Sie werden sehen, dass eine Ausweitung der Suche auf mehrere Server mit einer ForEach-Schleife einfach ist, sobald der passende Filter für einen einzelnen Computer definiert ist. Nach der Durchführung ist das einzige Problem, das Sie noch beheben müssen die Ausgabe und die Verwendung von „Select-Object“. Sie können eine beliebige Eigenschaft erstellen, die Sie in Ihrem Abschlussbericht anzeigen möchten.