Powershell get-winevent Syntaxfrage
Servus Skriptingprofis!
Ich möchte das Sicherheitseventlog filtern und nur folgendes anzeigen lassen:
EventID 4656
SubjectUserName mustermann
Objectname d:\test (also alle Objekte in oder unterhalb von d:\test)
und bei letzterem Objectname scheitere ich. Ich finde keine Beispiele hierzu und lediglich einen offenbar verkehrten Hinweis auf die Schreibweise
Wie muss es richtig lauten?
Ich möchte das Sicherheitseventlog filtern und nur folgendes anzeigen lassen:
EventID 4656
SubjectUserName mustermann
Objectname d:\test (also alle Objekte in oder unterhalb von d:\test)
und bei letzterem Objectname scheitere ich. Ich finde keine Beispiele hierzu und lediglich einen offenbar verkehrten Hinweis auf die Schreibweise
1
and EventData[Data[@Name="ObjectName"]>="D:\test"]]'
Wie muss es richtig lauten?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 275978
Url: https://administrator.de/forum/powershell-get-winevent-syntaxfrage-275978.html
Ausgedruckt am: 07.04.2025 um 08:04 Uhr
10 Kommentare
Neuester Kommentar

Moin,
Xpath 1.0 in diesem Kontext (MS unterstützt nur ein Subset an Funktionen) kennt keine like Funktionen, da musst du später die Eigenschaften des Objektes filtern.
Gruß jodel32
Xpath 1.0 in diesem Kontext (MS unterstützt nur ein Subset an Funktionen) kennt keine like Funktionen, da musst du später die Eigenschaften des Objektes filtern.
1
get-winevent ...... | ?{$_.Message -match 'Objektname:\s*D:\\Test'}

Zitat von @DerWoWusste:
> Standard operators OR, AND, =, !=, <=, <, >=, >, and parentheses are supported.
Deswegen wäre ich davon ausgegangen, dass dies geht.
Schon klar aber <> gilt nur für numerische Werte und nicht für Strings.> Standard operators OR, AND, =, !=, <=, <, >=, >, and parentheses are supported.
Deswegen wäre ich davon ausgegangen, dass dies geht.
Woher hast Du Deine Informationen?
XPath Standard.Mögliche Variante:
1
Get-WinEvent -FilterXPath "*[System[(EventID=4656)] and EventData[Data[@Name = 'SubjectUsername']='mustermann']]" | ?{$_.Message -match 'Objektname:\s*D:\\Test'} | select ID,@{n="Kontoname";e={[regex]::match($_.message,'Kontoname:\s*([^\r\n]*)').Groups[1].Value}},@{n="Objektname";e={[regex]::match($_.message,'Objektname:\s*([^\r\n]*)').Groups[1].Value}}

Ich schätze, das wird nicht gehen, da dort die gleichen Grenzen gelten und man dort jedoch nicht auf match zurückgreifen kann, oder?
Yep. Da müsstest du dann die Event-Daten im Script nochmal filtern, bzw. überprüfen.
Moin DWW,
du könntest das Monitoring auch ein Powershell-Skript erledigen lassen das einen Eventlogwatcher einsetzt um das Eventlog zu überwachen:
(gewünschte Aufgabe / Script in Zeile 17 einfügen)
Alternativ ließe sich auch eine Aufgabe mit einem Trigger erstellen welche einem Skript den ObjectName als Parameter übergibt, das ließe sich durch Anpassen der Aufgabe via Export in XML, Anpassung und Reimport der Aufgabe machen. Muss ich nochmal schauen, das habe ich hier schon mal gepostet.
Grüße Uwe
du könntest das Monitoring auch ein Powershell-Skript erledigen lassen das einen Eventlogwatcher einsetzt um das Eventlog zu überwachen:
(gewünschte Aufgabe / Script in Zeile 17 einfügen)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# -------------------------
$username = 'musterman'
$path = 'D:\test'
# -------------------------
if (Get-EventSubscriber -SourceIdentifier NewEventlogWatcher){Unregister-Event NewEventLogWatcher}
$logname = "Security"
$xPathFilter = "*[System[(EventID=4656)] and EventData[Data[@Name = 'SubjectUsername']='$username']]"
$action = {
[xml]$xml = $Event.SourceArgs.EventRecord.toXML()
$ns = new-Object System.Xml.XmlNamespaceManager $xml.NameTable
$ns.AddNamespace("ns",$xml.DocumentElement.NamespaceURI)
$objectname = $xml.SelectSingleNode("//ns:Data[@Name='ObjectName']",$ns).innerText
if ($objectname -like "$path\*"){
write-host "User '$username' hat auf '$objectname' zugegriffen."
# Hier ein das gewünschte Skript ausführen
}
}
$query = New-Object System.Diagnostics.Eventing.Reader.EventLogQuery($logname,[System.Diagnostics.Eventing.Reader.PathType]::LogName,$xPathFilter)
$watcher = New-Object System.Diagnostics.Eventing.Reader.EventLogWatcher($query, $null, $false)
Register-ObjectEvent -InputObject $watcher -SourceIdentifier "NewEventLogWatcher" -EventName 'EventRecordWritten' -Action $action
$watcher.Enabled = $true
while($true){
sleep(1)
}
Grüße Uwe
Nachtrag: Hier noch die Info wie man einen Task so anpassen kann das man Infos aus dem Event an ein Skript übergeben kann:
OK, also in dem Fall würde ich das eher mit einem FileSystemWatcher machen, fände ich persönlich zielführender als einen Umweg über das Eventlog zu gehen.
Habe dazu hier auch schon diverse Skripte und auch fertige Anwendungen zum Thema Ordnerüberwachung gepostet.
Ordner überwachen und Aktion ausführen mit VBS/Powershell
VB.Net Anwendung zum FileSystemWatcher mit Überwachung mehrerer Ordner auf neue Dateien:
Wie du siehst sind die Möglichkeiten in dieser Hinsicht vielfältig
Vielleicht ist da ja was für euch dabei. Anpassen lässt sich ja alles.
Grüße Uwe
Habe dazu hier auch schon diverse Skripte und auch fertige Anwendungen zum Thema Ordnerüberwachung gepostet.
Ordner überwachen und Aktion ausführen mit VBS/Powershell
VB.Net Anwendung zum FileSystemWatcher mit Überwachung mehrerer Ordner auf neue Dateien:
Wie du siehst sind die Möglichkeiten in dieser Hinsicht vielfältig
Vielleicht ist da ja was für euch dabei. Anpassen lässt sich ja alles.
Grüße Uwe