2016-04-06 7 views
1

Ich benötige Hilfe beim Abschließen eines PowerShell-Skripts, in dem ich bestimmte Sicherheitsereignisprotokolle abrufen und in eine CSV-Datei exportieren kann. Derzeit ich diese Linie haben,Spezifische Windows-Sicherheitsereignisprotokolle exportieren

Get-EventLog -LogName Security 4720,4722,4725 -After ((Get-Date).AddDays(-1)) | Export-CSV "C:\EventLogs.csv"

Dies macht die Sicherheitsereignisse bekommen, die ich erhalten möchten. Die darin enthaltenen Informationen sind jedoch unvollständig. Es ist nicht diese 2 in der Ausgabe enthalten,

  1. Kontoname - Konto, das die Änderung tat
  2. Zielkonto - Konto, das

Gibt es eine Möglichkeit schließen diese 2 oben geändert wurde?

Mir wurde gesagt, dass Get-WinEvent besser geeignet ist, dies zu tun, aber ich bin ziemlich neu in PowerShell-Skripts, so würde ich wirklich ein wenig Hilfe schätzen. Im Allgemeinen Danke

Antwort

1

, Export-Csv wird:

  • Blick auf die 1. Eingabeobjekt
  • seine Art zu untersuchen und die Spalten zu bestimmen, basierend auf allen Eigenschaften die Art zu exportieren hat.

In Ihrem Fall, es klingt aber wie die Informationen von Interesse innerhalb der Message Eigenschaft des Typs enthalten sein können.

Daher müssen Sie einen Zwischen Select-Object Anruf mit einem sorgfältig ausgearbeitet hashtable verwenden, um die Informationen von Interesse als separate Eigenschaften zu extrahieren, dass Export-Csv dann Export:

Hier ein Beispiel ist, dass die Kontonamen Auszüge aus den Message und Eigenschaft exportiert sie als separate Spalten:

Get-EventLog -LogName Security 4720,4722,4725 -After ((Get-Date).AddDays(-1)) | 
Select-Object EventId, Time, @{ 
    n='AccountName'; 
    e={ ($_.message -replace '\n', ' ') -replace '.*?account name:\t+([^\s]+).*', '$1' } 
}, @{ 
    n='TargetAccount'; 
    e={ ($_.message -replace '\n', ' ') -replace '.*account name:\t+([^\s]+).*', '$1' } 
} | Export-Csv 'C:\EventLogs.csv' 

Hinweis, wie der erste Regex -replace vergangen ist nicht gierige (.*?), was bedeutet, dass die erste Vorkommen wird angepasst, während die zweite ist gierig (nur .*), was bedeutet, dass die letzte Vorkommen wird übereinstimmen.

Der zusätzliche Schritt zum Ersetzen von Zeilenumbrüchen durch Leerzeichen ist erforderlich, da -replace scheinbar Zeile für Zeile übereinstimmt.

+0

Hallo. Ich habe dein Skript getestet und es hat funktioniert wie ein Zauber! Der einzige Eintrag, den ich bekomme, ist der Target AccoutName. Kannst du den Source/Subject AccountName und den Zeitpunkt des Ereignisses angeben? Ich schätze deine Hilfe sehr! – lapsantos

+0

@lapsantos: Bitte sehen Sie mein Update; Dies ist nicht die robusteste Methode, das Feld "Nachricht" zu analysieren, aber in Ihrem Fall ist dies möglicherweise der Fall. Beachten Sie, dass Sie bei Bedarf weitere Standardfelder hinzufügen können, z. B. "Quelle", indem Sie einfach zu der kommagetrennten Liste hinzufügen, die an "Select-Object" übergeben wird (d. H. Indem Sie dem Array von Eigenschaftsnamen hinzufügen). – mklement0