Exportiertes Security-Protokoll auswerten via PS
Hallo zusammen,
Was ich möchte ist folgendes:
1. Wir möchten aus den Security-Protokolle gewissen Event-IDs auswerten. Je nachdem welches Event es sein soll, brauchen wir 3 Möglichkeiten:
Die ersten beiden Punkte haben sich wunderbar mittels Get-Eventlog lösen lassen und laufen auch. Nur beim Auslesen aus einem Gespeicherten Log, komme ich so an meine Grenzen. Das Skript einmal hier:
Vorweg. Das Skript an sich funktioniert und liest auch die entsprechende Datei ein. Die anderen knapp 150 Zeilen des Skriptes erspar ich euch an der Stelle. Allerdings sind die Log-Dateien genau 20 MB groß, die es auszuwerten gibt. Das Skript braucht für die Auswertung der eingelesen Datei bei 20 MB etwa 55 Minuten. Das ist mir ein wenig zu lagen.
Frage 1 lautet daher: Wie kann ich das Skript beschleunigen. Eine Abfrage mit dem Parameter funktioniert nicht in Verbindung mit dem einlesen einer lokal gespeicherten EVTX-Datei. Daher kam mir die Idee einfach die EVTX-Datei zu verkleinern.
Frage 2 lautet: Wie kann ich das Windows-Protokoll via Powershell für einen Tag exportieren, so dass es via get-winevent wieder eingelesen werden kann? Auch hier haben meine Versuche bislang keinen Erfolg gehabt. Ich kann das Protokoll zwar exportieren (TXT-Datei, CSV-Datei oder HTML-Datei), aber nicht wieder einlesen. Einlesen kann ich nur EVTX-, ETL- und EVT-Dateien. Bei allen anderen Dateiformat meckert er rum. Einzige Möglichkeit, die ich in meinen Recherchen gefunden habe: Das Protokoll löschen und alles rauswerfen was älter als 2 Tage ist, dann das gesamte Protokoll exportieren. Damit würde ich dann aber die kompletten Logs auf dem Rechner stückeln und löschen, was für andere Auswertung aber wiederum benötigt wird. Ist also auch keine Lösung/Option.
Frage 1 hat eigentlich Priorität. Wenn die Auswertung schneller wäre, dann könnte ich ruhig das gesamte Log-File exportieren und auswerten. Frage 2 ist eigentlich eher eine Frage aus Interesse bzw. eine Umschiffung der Probleme aus Frage 1. Dennoch muss es doch irgendwie möglich sein, die Logs aus einem Tag zu exportieren ohne es zu löschen und diese dann in einem Format zu erhalten, welches auch wieder als gespeichertes Protokoll eingelesen werden kann.
Gruß
Doskias
Was ich möchte ist folgendes:
1. Wir möchten aus den Security-Protokolle gewissen Event-IDs auswerten. Je nachdem welches Event es sein soll, brauchen wir 3 Möglichkeiten:
- das Event am aktuellen Tag finden
- Das Event am Vergangen Tag finden
- Das Event aus einem Gespeicherten Log auslesen
Die ersten beiden Punkte haben sich wunderbar mittels Get-Eventlog lösen lassen und laufen auch. Nur beim Auslesen aus einem Gespeicherten Log, komme ich so an meine Grenzen. Das Skript einmal hier:
## Deklarationen:
# Protokollpfad
$Protokoll_Ort='C:\Temp\Log.evtx'
# Tag auswählen im Format dd.mm.yyyy
$Auswahl_Datum="09.02.2021"
# letzten Tag ermittelln
$Check_Datum=((get-date($Auswahl_Datum)))
$day_after=((get-date($Auswahl_Datum)).adddays(+1))
#ID Auswahl eingeben
$ID_Check=16
### Ab hier nichts mehr verändern ###
$Start=get-date
$array_Check=Get-winevent -Path $Protokoll_Ort |? Id -eq $ID_Check| ? TimeCreated -gt $Check_Datum |? TimeCreated -lt $day_after
Vorweg. Das Skript an sich funktioniert und liest auch die entsprechende Datei ein. Die anderen knapp 150 Zeilen des Skriptes erspar ich euch an der Stelle. Allerdings sind die Log-Dateien genau 20 MB groß, die es auszuwerten gibt. Das Skript braucht für die Auswertung der eingelesen Datei bei 20 MB etwa 55 Minuten. Das ist mir ein wenig zu lagen.
Frage 1 lautet daher: Wie kann ich das Skript beschleunigen. Eine Abfrage mit dem Parameter
-FilterHashtable @(StartTime=$Check_Datum; Id=$ID_Check }
Frage 2 lautet: Wie kann ich das Windows-Protokoll via Powershell für einen Tag exportieren, so dass es via get-winevent wieder eingelesen werden kann? Auch hier haben meine Versuche bislang keinen Erfolg gehabt. Ich kann das Protokoll zwar exportieren (TXT-Datei, CSV-Datei oder HTML-Datei), aber nicht wieder einlesen. Einlesen kann ich nur EVTX-, ETL- und EVT-Dateien. Bei allen anderen Dateiformat meckert er rum. Einzige Möglichkeit, die ich in meinen Recherchen gefunden habe: Das Protokoll löschen und alles rauswerfen was älter als 2 Tage ist, dann das gesamte Protokoll exportieren. Damit würde ich dann aber die kompletten Logs auf dem Rechner stückeln und löschen, was für andere Auswertung aber wiederum benötigt wird. Ist also auch keine Lösung/Option.
Frage 1 hat eigentlich Priorität. Wenn die Auswertung schneller wäre, dann könnte ich ruhig das gesamte Log-File exportieren und auswerten. Frage 2 ist eigentlich eher eine Frage aus Interesse bzw. eine Umschiffung der Probleme aus Frage 1. Dennoch muss es doch irgendwie möglich sein, die Logs aus einem Tag zu exportieren ohne es zu löschen und diese dann in einem Format zu erhalten, welches auch wieder als gespeichertes Protokoll eingelesen werden kann.
Gruß
Doskias
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 649677
Url: https://administrator.de/contentid/649677
Ausgedruckt am: 21.11.2024 um 13:11 Uhr
7 Kommentare
Neuester Kommentar
Zu 1:
Filtere mittels XPath , z.B. Event ID 16 innerhalb der letzten 24h
Zu 2:
Filtere das Log nach Zeit und exportiere erst dann über "Gefilterte Protokolldatei speichern" in der MMC.
Gruß j.
Filtere mittels XPath , z.B. Event ID 16 innerhalb der letzten 24h
Get-WinEvent -Path .\test.evtx -FilterXPath "*[System[(EventID=16) and TimeCreated[timediff(@SystemTime) <= 86400000]]]"
Filtere das Log nach Zeit und exportiere erst dann über "Gefilterte Protokolldatei speichern" in der MMC.
Gruß j.
Zitat von @Doskias:
Was bringt mit das? wie ich geschrieben habe funktioniert es für den aktuellen und den letzten Tag. Aber nicht aus einem Protokoll.
Doch das funktioniert, musst nur noch einen Tippfehler im Filter korrigieren, funktioniert hier problemlos mit einer exportierten LOG-Datei!Was bringt mit das? wie ich geschrieben habe funktioniert es für den aktuellen und den letzten Tag. Aber nicht aus einem Protokoll.
Beim Protokoll muss ich sagen können. Ich brauche heute (09.02) die Daten vom 02.02 und 04.02. Sprich: Ich muss ein Datum angeben können. Für die letzten 24 Stunden habe ich eine Lösung, die mit den Live-Protokollen ohne Export auskommt. Ein einzeiliger Code ohne weitere Erklärung hilft mir hier nicht weiter.
Du kannst im XPath Filter auch explizite Datum-Werte angeben. Kannst du dir auch selbst bauen indem du dir über den Dialog den Filter mal zusammenbaust und dann auf den Reiter "XML" wechselst das kannst du fast 1zu1 in dein Skript übernehmen, deine Variablen in den String einbauen, fertig!Beispiel für expliziten Zeitfilter
"*[System[TimeCreated[(EventID=16) and @SystemTime>='2021-02-08T23:00:00.000Z' and @SystemTime<'2021-02-09T23:00:00.999Z']]]"
Zu 2:
Filtere das Log nach Zeit und exportiere erst dann über "Gefilterte Protokolldatei speichern" in der MMC.
Leider auch keine Option. Im Titel steht via Powershell und der Export soll auch per Powershell (oder anderweitig) automatisiert erfolgen.Filtere das Log nach Zeit und exportiere erst dann über "Gefilterte Protokolldatei speichern" in der MMC.
Hier mal ein funktionierendes Beispiel:
Hier einwandfrei getestet. Liefert hier die gewünschte Ergebnisse.
Zu XPath, das ist eine einheitliche XML-Abfragesprache die nicht nur im Eventlog zum Einsatz kommt ...
https://blog.backslasher.net/filtering-windows-event-log-using-xpath.htm ...
https://www.w3schools.com/xml/xpath_syntax.asp
$eventid = 16
$von = get-date '30.11.2020'
$bis = $von.AddDays(1)
$logfile = 'D:\test.evtx'
Get-WinEvent -Path $logfile -FilterXPath "*[System[(EventID=$eventid) and TimeCreated[@SystemTime>='$($von.toString('s'))' and @SystemTime<'$($bis.toString('s'))']]]"
Zu XPath, das ist eine einheitliche XML-Abfragesprache die nicht nur im Eventlog zum Einsatz kommt ...
https://blog.backslasher.net/filtering-windows-event-log-using-xpath.htm ...
https://www.w3schools.com/xml/xpath_syntax.asp