also die objektorientierte Programmierung ist Unordnung mich.
Sie versuchen also, zum Shell-Skript zurückzukehren und doppelt so viel Code zu schreiben, um halb so viel Arbeit zu erreichen.
Das wichtigste Bit Sie fehlt sind, ein Objekt als eine Sammlung von Dingen, sich vorzustellen - wie, stellen Sie arbeiten mit /etc/passwd
und jede Zeile hat eine Benutzer-ID und eine Gruppen-ID und ein Zuhause Verzeichnis und eine Login-Shell .. und Sie die gesamte Linie auf einmal übergeben, das ist Ihr analoges Objekt.
Ein Objekt hat viele Eigenschaften, genau so (aber insgesamt leistungsfähiger).
Wenn Sie Select user_sid
Sie wählen dieses Feld in der 'Zeile' bleiben, aber die Zeile ist immer noch so etwas wie :::user_sid::::
mit den anderen Feldern jetzt leer. (Ca). Aber sie sind immer noch da und auf dem Weg. Um direkt damit arbeiten zu können, musst du es komplett aus der "Linie" herausholen - wirf den Container weg und hab nur die user_sid außerhalb davon.
get-desktopvm | select user_sid
->
get-desktopvm | select -expandproperty user_sid
die "sid1", "sid2", "sid3"
, aber keine Container für jeden SID macht.
Diese
function getlist() {
$temp=Invoke-Command -ComputerName $vdiserver -ScriptBlock { add-pssnapin vmware.view.broker; get-desktopvm | select user_sid }
$list=$temp | Select-Object user_sid
}
im Wesentlichen sagt
function getlist() {
#do any amount of work here, and throw it all away.
}
Da die Funktion nichts zurückgibt, und es ändert keine Daten auf der Festplatte oder irgendetwas, so dass, wenn die Funktion beendet ist, Die Variablen werden aus dem Speicher gelöscht, und Sie können sie anschließend nicht mehr verwenden.
Dieses:
if ($test -eq "True"){
ist ein bisschen ein Unsinn. Es könnte funktionieren, aber es funktioniert nicht wie erwartet, weil es zufällig ist, dass "eine Zeichenfolge mit Inhalt" im Vergleich zu einem booleschen True True ist, unabhängig von der Zeichenfolge, die das englische Wort "True" enthält oder nicht.Aber es ist auch redundant - $test
ist selbst wahr oder falsch, Sie müssen nicht mit etwas zu vergleichen. if ($test)
. Oder sogar if (Test-Connection -ComputerName $vdi -Quiet)
Aber stillll, so viel Arbeit. Verbinden Sie sich einfach mit allen, und lassen Sie sie für diejenigen fehlschlagen, mit denen sie nicht in Kontakt kommen können. Fügen Sie vielleicht -ErrorAction SilentlyContinue
hinzu, wenn Sie den Fehler nicht sehen möchten.
$VMs = Invoke-Command -ComputerName Server1,Server2 -ScriptBlock {
Add-PsSnapin vmware.view.broker
Get-DesktopVm
}
Jetzt haben Sie alle VMs, die Benutzer/deaktivierten Zustand
foreach ($VM in $VMs) {
$Sid = $VM.user_sid
$AdEnabled = Invoke-Command -ComputerName domaincontroller -ScriptBlock {
(Get-AdUser -Identity $using:Sid).Enabled
}
$VM| Add-Member -NotePropertyName 'AdEnabled' -NotePropertyValue $AdEnabled
}
Jetzt sollten Sie idealerweise $ VM als ein Array von Objekten erhalten aktiviert, die jeweils alle VM Desktop-Eigenschaften - und auch der True/False-Status der AD Enabled-Eigenschaft für dieses Benutzerkonto.
$VM | Out-Gridview
oder
$VM | Export-Csv Report.csv
oder
$VM | Where-Object { -not $_.AdEnabled }
bearbeiten und schließen die Fehlermeldung? Es sieht nicht so aus, als sollte es in deinem Skript passieren. – TessellatingHeckler