Benutzer mit den meisten Antworten
System.Object Ausgabe bearbeiten

Frage
-
Hallo,
ich bin noch relativ neu in Powershell und daher noch unerfahren. Momentan versuche ich eine ein System.Object welches ich in meinem Script als Ausgabe bekomme so zu bearbeiten, damit ich es weiterverarbeiten kann.
Die Ausgabe sieht so aus:
InputObject ----------- @{Domain=********; Subnetz=Subnetz} @{Domain=********; Subnetz=Subnetz} @{Domain=********; Subnetz=Subnetz}
Anstelle der Sternchen steht dann der Domainname und anstelle des Wortes Subnetz steht dann noch die dazugehörige IP.
Der Code der das hervorruft sieht folgendermaßen aus:
$sites = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest().Sites $sitesubnets = @() foreach ($site in $sites) { foreach ($subnet in $site.subnets) { $temp = New-Object PSCustomObject -Property @{ 'Subnetz' = $subnet 'Domain' = $site.Name; } $sitesubnets += $temp } } $sitesubnets = $sitesubnets | where {$_.Domain -ne "********"} $sitesubnets = $sitesubnets | where {$_.Domain -ne "********"} ForEach($site in $sitesubnets) { $site.Domain = $site.Domain.Substring(0,6) + "S01" $site.Domain = $site.Domain.ToUpper() $sitesubnets = $sitesubnets + $site } $filename = Read-Host -Prompt "Dateiname!" $servercsv = Import-Csv "$filename.csv" #Server Liste importieren $array = @() #Leeres Array anlegen ForEach($s in $servercsv) { [String]$temp1 = Test-Connection $s.Name -Count 1 | Select-Object -Property Address [String]$temp2 = Test-Connection $s.Name -Count 1 | Select-Object -Property IPV4Address $temp1 = $temp1.TrimStart("@{Address=") $temp1 = $temp1.TrimEnd("}") $temp2 = $temp2.TrimStart("@{IPV4Address=") $temp2 = $temp2.TrimEnd("}") $temp = New-Object PSCustomObject -Property @{ 'Domain' = $temp1 'IPAdresse' = $temp2 ; } $array += $temp } #Array mit Domain und Adresse füllen $equal = Compare-Object -ReferenceObject $sitesubnets -DifferenceObject $array -Property Domain -IncludeEqual | where {$_.SideIndicator -ne "<="} | Select-Object -Property Domain Compare-Object -ReferenceObject $sitesubnets -DifferenceObject $equal -IncludeEqual | Where-Object {$_.SideIndicator -ne "<="} | Select-Object -Property InputObject
Ich freue mich auch über andere funktionierende Verbesserungen.
Ich habe einige Daten durch Sternchen ersetzt.
LG
cecinit_mortem
- Bearbeitet cecinit_mortem Freitag, 15. Juli 2016 09:10
Antworten
-
Der grobe Aufbau sollte passen, leider kann ich ohne den Inhalt der CSV nur raten, in welcher form die Daten vorliegen.
$sites = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest().Sites | Select-Object -First 1 | Where-Object {($_.Name -ne '********') -or ($_.Name -ne '********')} $sitesubnets = @() foreach ($site in $sites) { foreach ($subnet in $site.subnets) { $temp = New-Object PSCustomObject -Property @{ 'Subnetz' = $subnet 'Domain' = (($site.Name).Substring(0,6) + 'S01').ToUpper() } $sitesubnets += $temp } } $filename = Read-Host -Prompt 'Dateiname!' $servercsv = Import-Csv "$filename.csv" $array = @() ForEach($s in $servercsv) { $ipdata = Test-Connection $s.Name -Count 1 | Select-Object -Property Address,IPV4Address $eintrag = $sitesubnets | Where-Object {$_.Domain -eq $ipdata.Address} if ($eintrag){ $temp = New-Object PSCustomObject -Property @{ 'Subnetz-AD' = $eintrag.Subnetz 'Domain-AD' = $eintrag.Domain 'Domain-IP' = $ipdata.Address 'IPAdresse' = $ipdata.IPV4Address } $array += $temp } } $array
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Montag, 18. Juli 2016 11:28
- Als Antwort markiert cecinit_mortem Montag, 18. Juli 2016 13:35
Alle Antworten
-
Moin,
ja, da lässt sich einiges verbessern, aber mir ist nich nicht ganz klar, was du genau in den letzten beiden Zeilen vergleichen willst und was dein eigentliches Anleigen ist. Mir würde es sehr helfen, wenn du das nochmal formulierst, wie z.B. "..eine Liste mit allen Servern un den dazugehörigen Domains + Netzen"
-
Ok ich werde versuchen das Ganze noch etwas zu konkretisieren. Ich habe eine CSV Liste mit den Domain Namen einiger Server. Als erstes hole ich mir eine Liste aller Domaincontroller plus deren Subnetze aus dem AD. Dann packe ich die Liste in ein Array namens $sitesubnets. Da sortiere ich einige Einträge aus und hänge an den Namen noch S01 an. Dann lade ich mir die CSV in ein Array namens $array (Ich arbeite noch an den Namen). Die Namen aus der CSV pinge ich an und schneide noch ein paar Überbleibsel von der Ausgabe ab. Über ein customObject packe ich das dann in ein Array. Dann vergleiche ich die Liste aller DC´s mit der CSV und schreibe die Übereinstimmungen in $equal. Ich weiß, dass das letzte mit Compare-Object nur ein Workaround ist um die identischen Einträge zu bekommen. Ich habe versucht das ganze mit -ExcludeDifferent zu machen aber da bekomme ich trotz der Übereinstimmung kein Output. Mein Ziel ist es eine Liste mit den DC´s und deren Adresse, welche ich durch das anpingen checke in eine Liste zu packen. In diese Liste möchte ich noch gerne die Subnetze jedes DC´s laden. Am Ende möchte ich die IP´s vom Anpingen mit den Subnetzen vergleichen und schauen ob die korrekt sind. Das Problem ist das einige DC´s falsch konfiguriert sind und daher einige Clients z.B aus Polen sich bei den DC´s in den Niederlanden anmelden.
Danke für die Hilfe
cecinit_mortem
-
Der grobe Aufbau sollte passen, leider kann ich ohne den Inhalt der CSV nur raten, in welcher form die Daten vorliegen.
$sites = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest().Sites | Select-Object -First 1 | Where-Object {($_.Name -ne '********') -or ($_.Name -ne '********')} $sitesubnets = @() foreach ($site in $sites) { foreach ($subnet in $site.subnets) { $temp = New-Object PSCustomObject -Property @{ 'Subnetz' = $subnet 'Domain' = (($site.Name).Substring(0,6) + 'S01').ToUpper() } $sitesubnets += $temp } } $filename = Read-Host -Prompt 'Dateiname!' $servercsv = Import-Csv "$filename.csv" $array = @() ForEach($s in $servercsv) { $ipdata = Test-Connection $s.Name -Count 1 | Select-Object -Property Address,IPV4Address $eintrag = $sitesubnets | Where-Object {$_.Domain -eq $ipdata.Address} if ($eintrag){ $temp = New-Object PSCustomObject -Property @{ 'Subnetz-AD' = $eintrag.Subnetz 'Domain-AD' = $eintrag.Domain 'Domain-IP' = $ipdata.Address 'IPAdresse' = $ipdata.IPV4Address } $array += $temp } } $array
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Montag, 18. Juli 2016 11:28
- Als Antwort markiert cecinit_mortem Montag, 18. Juli 2016 13:35
-
Danke für die Antwort ich habe das am Freitag leider nicht mehr gesehen.
Das sieht schon mal deutlich besser aus als bei mir :D
Ich habe das ausprobiert und so ganz funktioniert das noch nicht.
Er gibt mir jetzt nur noch eine leere Liste aus. Ich habe zur Diagnose vor dem Einlesen der CSV noch $sitesubnets eingegeben und auch da ist die Liste schon viel zu kurz.
Ich habe das Select-Object -First 1 rausgenommen und es läuft.
Das selektieren über Where-Object läuft jetzt auch ich habe das -or durch ein -and ersetzt.
Ein Problem ist noch die zusammensetzung der Daten.
In der CSV stehen nur die Namen der DC´s.Ungefähr so:
Name DE1.. DE2..
Edit:
Die Ausgabe funktioniert jetzt nahezu perfekt. Das Problem waren anscheinend Dubletten.
LG
cecinit_mortem
- Bearbeitet cecinit_mortem Montag, 18. Juli 2016 09:02
-
Haben sie eine Idee wie ich den Vergleich der Subnetz Adresse und der IP umsetzen kann?
Das Problem ist ja das es nur um den Vergleich der ersten drei Adressblöcke geht.
Mein aktueller Code sieht so aus:
$sites = [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest().Sites | Where-Object {($_.Name -ne '*****') -and ($_.Name -ne '*****')} $sitesubnets = @() ForEach ($site in $sites) { ForEach ($subnet in $site.subnets) { $temp = New-Object PSCustomObject -Property @{ 'Subnetz' = $subnet 'Domain' = (($site.Name).Substring(0,6) + 'S01').ToUpper() } $sitesubnets += $temp } } $sitesubnets = $sitesubnets | Sort-Object -Property 'Domain' -Unique $filename = Read-Host -Prompt 'Dateiname!' $servercsv = Import-Csv "$filename.csv" $array = @() ForEach($s in $servercsv) { $ipdata = Test-Connection $s.Name -Count 1 | Select-Object -Property Address,IPV4Address $eintrag = $sitesubnets | Where-Object {$_.Domain -eq $ipdata.Address} If ($eintrag.Subnetz -contains "/24") { [Bool]$check = 0 } Else { [Bool]$check = 1 } If($check) { $status = $eintrag.Subnetz.Split(".") | -eq $ipdata.IPV4Adresse } $status If ($eintrag) { $temp = New-Object PSCustomObject -Property @{ 'SubnetzAD' = $eintrag.Subnetz 'DomainAD' = $eintrag.Domain 'DomainIP' = $ipdata.Address 'IPAdresse' = $ipdata.IPV4Address 'Check' = $check 'Status' = "" } $array += $temp } }
Das Problem ist jetzt, dass das .Split folgende Fehlermeldung provoziert:
Fehler beim Aufrufen der Methode, da [System.DirectoryServices.ActiveDirectory.ActiveDirectorySubnet] keine Methode mit dem Namen "Split" enthält. Bei E:\test\new 3.ps1:33 Zeichen:35 + $status = $eintrag.Subnetz.Split <<<< (".") | -eq $ipdata.IPV4Adresse + CategoryInfo : InvalidOperation: (Split:String) [], RuntimeException + FullyQualifiedErrorId : MethodNotFound
- Bearbeitet cecinit_mortem Montag, 18. Juli 2016 12:12