derhoeppi
Goto Top

PowerShell EventLog informationen filtern

Hallo,

mit Hilfe von Get-EventLog hole ich mir bestimmte Einträge in ein Array. Das Array verfügt über drei für mich wichtige Spalten (Timewritten, EntryType und Message). Die Werte der Spalten lege ich nach einem Regex mit der Spalte Message (übrig bleibt nur eine IP-Adresse) in einer DataTable ab und möchte mit dieser Weiterarbeiten.

Ziel meines Skriptes ist es den aktuellsten Eintrag zu einer bestimmten Message zu erhalten. Daraufhin möchte ich den EntryType prüfen und nur Warnings und Errors in ein neues Array schreiben. Vielleicht ist die DataTable nicht das richtige Werkzeug, aber das Array in dem ich die Events mit Get-EventLog sammle wird beim modifizieren als ReadOnly gekennzeichnet.

Hier mein bisheriges:
$IP =@()
$regex = [regex] "\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"  
$events=get-eventlog myOwn -After (get-date).AddDays(-1)

#Anlegen einer DataTable um die Events einzutragen
$dt = New-Object System.Data.DataTable
$dt.Columns.Add('Timewritten') | Out-Null  
$dt.Columns.Add('EntryType') | Out-Null  
$dt.Columns.Add('Message') | Out-Null  

foreach ($event in $events){
	$regex.Matches($event.Message) | %{$dt.Rows.Add($event.Timewritten, $event.EntryType, $_.value)}
	}
#$dt
$IPs = $dt.Message | Select -Unique
$AllMessages2oneIP = @()
foreach ($Adress in $IPs){
	AllMessages2oneIP = $dt | ?{$_.Message -eq $Adress}
	}

So mein Problem ist nun das ich zwar alle Meldungen zu einer Message habe, aber ich kann im Array AllMessages2oneIP keine Spalten mehr ansprechen. Ich möchte dort aber gerne das Datum vergleichen und dann beim aktuellsten Eintrag auf den EntryType schauen. Hat jemand von euch eine Idee?

Content-Key: 309291

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

Printed on: April 20, 2024 at 04:04 o'clock

Mitglied: 129813
Solution 129813 Jul 08, 2016 updated at 07:12:28 (UTC)
Goto Top
Hi.
This is your failure:
$IPs = $dt.Message | Select -Unique 
So what you are doing here is: Select "only" the message field for uniques. So your resulting variable $IPs holds only the message property!!

I would do this kind of stuff with group-object to group the rows of the data table and sort the corresponding entries for the IP.

$IPs = $dt.Rows | group Message
$IPs | %{$_.Group = $_.Group | sort TimeWritten -Desc}
Now you have an Array with all unique IP addresses and all their corresponding Events sorted from latest to oldest.

If you now want to get the latest entry for an IP
$IPs | ?{$_.message -eq "192.168.1.20"} | %{$_.Group.Entrytype}  
Select the first entry in the group column.

Regards