doskias
Goto Top

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:
  • 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 } 
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

Content-Key: 649677

Url: https://administrator.de/contentid/649677

Printed on: April 19, 2024 at 17:04 o'clock

Mitglied: 147323
147323 Feb 09, 2021 updated at 14:36:42 (UTC)
Goto Top
Zu 1:
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]]]"  
Zu 2:

Filtere das Log nach Zeit und exportiere erst dann über "Gefilterte Protokolldatei speichern" in der MMC.

screenshot

screenshot

Gruß j.
Member: Doskias
Doskias Feb 09, 2021 updated at 14:45:54 (UTC)
Goto Top
Hallo Jokari

Danke aber ...
Zitat von @147323:
Zu 1:
Z.B. Event ID 16 innerhalb der letzten 24h
> Get-WinEvent -Path .\test.evtx -FilterXPath "*[System[(EventID=16) and TimeCreated[timediff(@SystemTime) &lt;= 86400000]]]"  
> 
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.

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. Wie ich erklärt habe, spare ich die anderen 150 Zeilen des Skriptes. Hintergrund der Notwendigkeit der Automatisierung ist, dass das Protokoll täglich um 0:01 bzw. beim Start des Gerätes den letzten vollen Tag in eine EVTX ablegt und diese dann ausgewertet werden kann. Ich habe keine Zeit (und auch keinen Praktikanten ) um täglich für ca. 200 Rechner/Server das Protokoll händisch zu exportieren.

Danke dir für deinen Beitrag, sehe aber nicht wie mir das weiterhelfen sollte.

Gruß
Doskias

Nachtrag: Habe bei Frage 2 nochmal deutlich hervorgehoben, dass der Export via Powershell erfolgen soll.
Mitglied: 147323
147323 Feb 09, 2021 updated at 15:01:22 (UTC)
Goto Top
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!
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']]]"
Die Zeiten kannst du dir ja in Variablen zusammnenbauen und deren Stelle einsetzen.

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.
Sorry das war hier für den Export nicht ganz klar.
Member: Doskias
Doskias Feb 09, 2021 at 15:11:43 (UTC)
Goto Top
So.. ich schon wieder face-smile

Also ich habe jetzt folgenden eingegeben.
Get-winevent -Path $Protokoll_Ort  -FilterXPath "*[System[TimeCreated[(EventID=4648) and @SystemTime>='2021-02-08T23:00:00.000Z' and @SystemTime<'2021-02-10T00:00:00.000Z']]]"  

Wenn ich das richtig verstehe, bedeutet das:
Events aus dem Protokoll vom Ort, wo die ID 4648 und TimeCreated größer 23 Uhr vom 08.02.2021 ist und gleichzeitig kleiner als Mitternacht vom 10.02.2021. Sprich: Alle Events mit der ID mit 4648 aus dem Protokoll seit gestern Abend 23 Uhr. Das Skript sagt mir an der Stelle allerdings, dass kein Ergebnis gefunden wurde. Wenn ich das Protokoll aber händisch danach durchsuche, dann finde ich da Einträge. Also irgendwas stimmt da noch nicht, wobei ich sagen muss, dass ich den Aufbau von -filterxpath noch nicht so richtig versanden habe und auch aus der MS Beschreibung weiterhin nicht schlau werde. Hast du einen erklärenden Link für -filterxpath der über das hinaus geht was hier steht?

Sorry das war hier für den Export nicht ganz klar.
Stimmt, deswegen hab ich es (für den nächsten) in der Frage nochmal deutlich hervorgehoben.
Mitglied: 147323
Solution 147323 Feb 09, 2021 updated at 15:33:17 (UTC)
Goto Top
Hier mal ein funktionierendes Beispiel:
$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'))']]]"  
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
Member: Doskias
Doskias Feb 09, 2021 at 15:43:10 (UTC)
Goto Top
Ja das klappt schonmal besser und jetzt hab ich auch verstanden, dass ich mir den FilterXPath aus dem eingestellten Filter raussuchen kann, wenn ich oben auf XML umstelle.

ich werde morgen mal schauen ob ich mit der Erkenntnis auch Frage 2 lösen kann. Wobei die jetzige Lösung sich schon von 55 Minuten auf etwa 1:30 reduziert hat. Da ich die Abfrage insgesamt für verschiedene Kombinationen durchführe (mindestens 2 mal), hat sich das doch schonmal deutlich gelohnt. Danke dafür schonmal. Lösungsmarkierung folgt später. Frage 2 ist ja noch offen face-smile
Member: Doskias
Doskias Feb 10, 2021 at 07:21:54 (UTC)
Goto Top
Manchmal muss man ja auch einfach eine Nacht drüber schlafen.

Frage 2 wird jetzt so gelöst:
Da es für die weitere Verarbeitung keine Rolle spiel ob das Array aus einer CSV oder EVTX gebildet wurde, wird das Skript einfach dahingehend erweitert, dass das Array aus beiden gebildet werden kann, je nachdem was vorliegt. Manuell wird dann bei Bedarf die EVTX exportiert für einen Tag und automatisch (habe ich ja bereits oben geschrieben) eine CSV.