Hallo,
ich möchte mit get-Winevent diverse Event-Logs auf einem Computer auslesen. Die Logs sollen mit Start-Job "parallel" ausgelesen werden. Dafür wird in einem Foreach-Block für jedes Log mit Start-Job ein Task mit Get-WinEvent gestartet.
Zum Filtern der Events wird Get-WinEvent das Hash $Filter übergeben. In dieses Hash wird bei jeden Durchlauf der zu filternde LogName eingetragen. Dies funktioniert so weit - und wiederum auch nicht :-( Als Ergebnis bekomme ich 2 Tasks, die beide Events
des "letzten" Logs (Application) enthalten. Hier das Skript und der Output:
$ComputerName = "localhost"
$Jobs = @()
$Logs = 'system', 'application'
$Filter = @{StartTime = ((Get-Date).AddMinutes(-90))}
$Logs | ForEach-Object {
$Filter['LogName'] = $_
# Testausgabe LogName + Filter Anfang
'*' * 40
"LogName: $_"
"`nFilter:"
$Filter
'*' * 40
# Testausgabe LogName + Filter Ende
$Jobs +=Start-Job -ScriptBlock {Get-WinEvent -FilterHashtable $Args[0] -ComputerName $Args[1] -MaxEvents 1} -ArgumentList $Filter, $ComputerName
}
$Null = Wait-Job $Jobs
# Ausgabe EventLogs
Receive-Job $Jobs |FT -AutoSize LogName, Id
Remove-Job $Jobs
# Output:
****************************************
LogName: system
Filter:
Name Value
---- -----
LogName system
StartTime 06.07.2018 13:31:16
****************************************
****************************************
LogName: application
Filter:
LogName application
StartTime 06.07.2018 13:31:16
****************************************
LogName Id
------- --
Application 1Application 1
Im Output kann man sehen, wie in jedem Durchlauf der LogName im Hash $Filter aktualisiert wird und trotzdem bekomme ich als Ergebnis nur 2x die Events von Application.
Warum bekomme ich von Get-WinEvent nicht alle Logs ausgegeben, obwohl $Filter immer den aktuellen Lognamen enthält?
Kurios wird es für mich, wenn ich die Zeile
$Filter = @{StartTime = ((Get-Date).AddMinutes(-90))}
an den Beginn des Foreach-Block verschiebe. Denn dann funktioniert das Skript wie gewünscht.
Kann mir bitte jemand dieses Verhalten erklären?
Danke und ein schönes Wochenende
Christoph
Edit:
Hier noch ein paar Anmerkungen:
Der Parameter FilterHashTable von Get-WinEvent erwartet ein Hash mit bis zu 11 vorgegebenen Schlüssel und entsprechenden Werten. Mit diesen Keys/Values können dann Eventlogs nach bestimmten Eigenschaften durchsucht werden. Ich verwende hier die Schlüssel StartTime
und LogName im Hash $Filter. StartTime filtert die Log-Eigenschaft TimeCreated und LogName legt das zu durchsuchende Log fest.
Der Wert des Schlüssels LogName wird nun in jeden Foreach-Durchlauf auf einen neuen Wert aus dem Array $Logs gesetzt. Wie der Output zeigt, wird $Filter jedesmal entsprechend geändert. Was nicht zu funktionieren scheint, ist die Übergabe von $Filter durch Start-Job
an Get-Winevent. Get-WinEvent arbeitet immer mit dem letzten Element von $Logs, in diesem Fall Application.