derwowusste
Goto Top

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
 and EventData[Data[@Name="ObjectName"]>="D:\test"]]'  

Wie muss es richtig lauten?

Content-Key: 275978

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

Printed on: April 18, 2024 at 06:04 o'clock

Mitglied: 114757
114757 Jun 29, 2015 updated at 12:20:17 (UTC)
Goto Top
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.

get-winevent ...... | ?{$_.Message -match 'Objektname:\s*D:\\Test'}  
Gruß jodel32
Member: DerWoWusste
DerWoWusste Jun 29, 2015 at 12:21:26 (UTC)
Goto Top
Hi Jodel.

Echt? https://msdn.microsoft.com/en-us/library/dd996910%28VS.85%29.aspx?f=255& ... schreibt ja
Standard operators OR, AND, =, !=, <=, <, >=, >, and parentheses are supported.
Deswegen wäre ich davon ausgegangen, dass dies geht. Woher hast Du Deine Informationen?
Mitglied: 114757
Solution 114757 Jun 29, 2015 updated at 15:09:35 (UTC)
Goto Top
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.
Woher hast Du Deine Informationen?
XPath Standard.

Mögliche Variante:
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}}  
In diesem Fall sind die Eigenschaftennamen in der Powershell in Deutsch, wenn das bei dir nicht so ist musst du sie anpassen.
Member: DerWoWusste
DerWoWusste Jun 29, 2015 at 12:42:24 (UTC)
Goto Top
Ah, nicht für Strings... das erklärt's.
Wüsstest Du Dir/mir auch noch zu helfen, wenn es darum geht, einen Eventfilter dafür zu schreiben? Einen, den man nutzen kann, um Tasktrigger daran zu heften, also wenn Nutzer Mustermann in Ordner d:\test oder dessen Unterordner schreibt, dann starte Skript x?

Ich schätze, das wird nicht gehen, da dort die gleichen Grenzen gelten und man dort jedoch nicht auf match zurückgreifen kann, oder?
Mitglied: 114757
114757 Jun 29, 2015 updated at 15:09:57 (UTC)
Goto Top
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.
Member: DerWoWusste
DerWoWusste Jun 29, 2015 at 15:09:49 (UTC)
Goto Top
Ich danke Dir.
Member: colinardo
colinardo Jun 29, 2015 updated at 19:10:58 (UTC)
Goto Top
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)
# -------------------------
$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)
}
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
Member: colinardo
colinardo Jun 29, 2015 at 19:16:56 (UTC)
Goto Top
Nachtrag: Hier noch die Info wie man einen Task so anpassen kann das man Infos aus dem Event an ein Skript übergeben kann:
Member: DerWoWusste
DerWoWusste Jun 29, 2015 updated at 22:41:45 (UTC)
Goto Top
Hi Uwe,

Puh, ich kann das zwar anwenden (funktioniert), aber bin einfach in Powershell keine Leuchte.
Ich beschreib mal genauer, was ich erreichen will und dann sieht man, dass dieser Watcher zu Problemen führt, die ein normaler Task automatisch abfedert.

Wir wollten unsern Nutzern OCR-Erkennung bieten. Dazu haben wir eine Verzeichnisstruktur angelegt, die jedem Nutzer x je ein persönliches Verzeichnis OCR_in und OCR_out bietet. Wenn der Nutzer Dateien in OCR_in schiebt, soll ein Skript starten, die Dateien verarbeiten und in OCR_out schreiben. Somit soll schreiben nach d:\scanshare\x\OCR_in ein personalisiertes Skript auslösen.
Macht man das über Deinen Watcher, kommen dank Windows' übereifrigem Auditing für jeden Schreibzugriff mehrere Einträge ins Log und die Aktion startet mehrfach, während sie bei einem Task nur zu einer erneuten Ausführung führen würde, die aber versagt wird, da der Task bereits läuft.

Ich denke, dies wirst Du auch abfedern können, aber ich versuche mich erst mal so wenig wie möglich von dem mir vertrauten Eventtriggering zu entfernen.
Member: colinardo
colinardo Jun 29, 2015 updated at 22:24:58 (UTC)
Goto Top
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 face-smile
Vielleicht ist da ja was für euch dabei. Anpassen lässt sich ja alles.

Grüße Uwe