Powershell Inhalt von Variablen vergleichen und in eine CSV Speichern
Hallo zusammen,
ich bin recht neu in der Scripting-Welt mit Powershell und habe deswegen noch einige Probleme ein Powershellscript fertigzustellen.
Worum soll es in den Script gehen:
Dieses Script soll auslesen, weche Programme von einem bestimmten Programm geblockt geworden wären, wenn die entsprechende Policy "scharf"
geschaltet ist.
Mein Ansatz war folgender:
foreach($server in $import_file)
{
Write-Host "Frage Server $($server) nach Eventlog Status ab"
[array]$event_block = invoke-command -computername $server -ScriptBlock { (Get-AppLockerFileInformation -EventLog -EventType Audited -Statistics).FilePath }
[array]$Eventlogs_Sammler = Get-Content -Path $csv
foreach ($event in $event_block)
{
if (!($event.Path -notmatch $Eventlogs_Sammler))
{
Write-Host "Event $event.Path wird in die Liste eingetragen"
Add-Content -Path $csv -Value $event.Path -Force
}
else
{
Write-Host "Event $event existiert bereits und wird nicht in die Liste eingetragen"
}
}
}
Ich habe quasi eine Serverliste aus der ich die Server auslese, auf welchen die Eventlogs überprüft werden sollen. Dann gehe ich hin und schreibe die entsprechenden events der Server in eine Variable ($event_block). Um zu erfahren ob der Inhalt dieser Variable bereits in der entsprechenden csv Datei steht (darf nur 1x drin stehen) wird diese ebenfalls in eine Variable geschrieben. In der Foreach Schleife durchlaufe ich quasi jeden Event und gleiche diesen mit der csv Datei ab um zu überprüfen, ob der Name bereits drin steht.
Leider funktioniert das nicht so ganz wie ich mir das vorstelle. Habe ich irgendwo einen Denkfehler in dem Code? Sorry, bin wie gesagt er seit kurzem dabei
Viele Grüße
ich bin recht neu in der Scripting-Welt mit Powershell und habe deswegen noch einige Probleme ein Powershellscript fertigzustellen.
Worum soll es in den Script gehen:
Dieses Script soll auslesen, weche Programme von einem bestimmten Programm geblockt geworden wären, wenn die entsprechende Policy "scharf"
geschaltet ist.
Mein Ansatz war folgender:
foreach($server in $import_file)
{
Write-Host "Frage Server $($server) nach Eventlog Status ab"
[array]$event_block = invoke-command -computername $server -ScriptBlock { (Get-AppLockerFileInformation -EventLog -EventType Audited -Statistics).FilePath }
[array]$Eventlogs_Sammler = Get-Content -Path $csv
foreach ($event in $event_block)
{
if (!($event.Path -notmatch $Eventlogs_Sammler))
{
Write-Host "Event $event.Path wird in die Liste eingetragen"
Add-Content -Path $csv -Value $event.Path -Force
}
else
{
Write-Host "Event $event existiert bereits und wird nicht in die Liste eingetragen"
}
}
}
Ich habe quasi eine Serverliste aus der ich die Server auslese, auf welchen die Eventlogs überprüft werden sollen. Dann gehe ich hin und schreibe die entsprechenden events der Server in eine Variable ($event_block). Um zu erfahren ob der Inhalt dieser Variable bereits in der entsprechenden csv Datei steht (darf nur 1x drin stehen) wird diese ebenfalls in eine Variable geschrieben. In der Foreach Schleife durchlaufe ich quasi jeden Event und gleiche diesen mit der csv Datei ab um zu überprüfen, ob der Name bereits drin steht.
Leider funktioniert das nicht so ganz wie ich mir das vorstelle. Habe ich irgendwo einen Denkfehler in dem Code? Sorry, bin wie gesagt er seit kurzem dabei
Viele Grüße
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 249335
Url: https://administrator.de/forum/powershell-inhalt-von-variablen-vergleichen-und-in-eine-csv-speichern-249335.html
Ausgedruckt am: 21.04.2025 um 08:04 Uhr
5 Kommentare
Neuester Kommentar
Hallo Brewtaly, Willkommen auf Administrator.de!
Ohne jetzt den Inhalt deiner "CSV" zu kennen, sollte das mit deinem Code so aussehen wenn in der CSV in jeder Zeile nur der jeweilige Pfad steht.
Alternativ lässt sich das Vergleichen auch mit Compare-Object machen. Quasi Zeile 7 bis 19 ersetzen durch:
Grüße Uwe
p.s. Bitte nutze Code-Tags für deinen Quellcode:
Ohne jetzt den Inhalt deiner "CSV" zu kennen, sollte das mit deinem Code so aussehen wenn in der CSV in jeder Zeile nur der jeweilige Pfad steht.
foreach($server in $import_file)
{
Write-Host "Frage Server $($server) nach Eventlog Status ab"
$event_block = invoke-command -computername $server -ScriptBlock {return (Get-AppLockerFileInformation -EventLog -EventType Audited -Statistics).FilePath}
$Eventlogs_Sammler = Get-Content -Path $csv
foreach ($event in $event_block)
{
if ($Eventlogs_Sammler -notcontains $event.Path)
{
Write-Host "Event $event.Path wird in die Liste eingetragen"
Add-Content -Path $csv -Value $event.Path -Force
$Eventlogs_Sammler = Get-Content -Path $csv
}
else
{
Write-Host "Event $event existiert bereits und wird nicht in die Liste eingetragen"
}
}
}
compare $Eventlogs_Sammler ($eventblock | select -ExpandProperty Path) | ?{$_.Sideindicator -eq '=>'} | select -Expand InputObject | Add-Content -Path $csv -Force
p.s. Bitte nutze Code-Tags für deinen Quellcode:
<code> Quellcode </code>
. Merci.Zitat von @Brewtaly:
zu dem Compare-Object habe ich eine Frage. Ich kann den "Quelltext" nicht wirklich lesen. Für mich sind das
teilweise böhmische Dörfer, da ich noch nicht so lang dabei bin.
Also mal zerlegt:zu dem Compare-Object habe ich eine Frage. Ich kann den "Quelltext" nicht wirklich lesen. Für mich sind das
teilweise böhmische Dörfer, da ich noch nicht so lang dabei bin.
Hier werden an Compare-Object zwei Objekte übergeben die verglichen werden sollen, einmal das String-Array deiner CSV und dann dein $eventblock Array aus dem die Pfade ebenfalls mit select als String-Array extrahiert werden). Diese beiden Objekte sollten unbedingt vom selben Typ sein, deshalb die Expandierung der Path-Eigenschaft.
compare $Eventlogs_Sammler ($eventblock | select -ExpandProperty Path)
| ?{$_.Sideindicator -eq '=>'}
| select -Expand InputObject | Add-Content -Path $csv -Force
Die 2te Frage wäre, was war genau an meiner Version den Quelltextes falsch, sodass die Einbindung in die csv nicht sofort funktioniert hat.
Du hast in deiner Variante mit -notmatch verglichen. Hier erwartet die Powershell kein Array sondern eine Regular Expression Pattern, und außerdem hast du das ganze dann nochmal mit ! negiert.Grüße Uwe