Verstehen der System.DirectoryServices.ResultPropertyCollection
in PowerShell
Wenn Sie mit PowerShell arbeiten und Active Directory abfragen, können Sie auf einige verwirrende Verhaltensweisen stoßen, wenn Sie versuchen, Eigenschaften aus der System.DirectoryServices.ResultPropertyCollection
abzurufen. In diesem Beitrag werden wir ein häufiges Problem aufschlüsseln, das beim Abrufen von Informationen über einen DirectorySearcher
auftritt – spezifisch, warum zwei unterschiedliche Ausgaben unerwartete Ergebnisse liefern. Lassen Sie uns das Problem, seine Ursachen und mögliche Lösungen untersuchen.
Das Problem
Sie haben ein PowerShell-Skript eingerichtet, das die Klasse DirectorySearcher
verwendet, um Computerobjekte in Active Directory zu finden, aber Sie stoßen auf Diskrepanzen in Ihrer Ausgabe. Hier ist eine vereinfachte Nachbildung Ihres Codes:
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry
$objSearcher.Filter = ("(objectclass=computer)")
$computers = $objSearcher.findall()
Wenn Sie versuchen, die Namen der Computer auszugeben, beobachten Sie die folgenden zwei Ausgaben:
$computers | %{
"Servername in Anführungszeichen $_.properties.name"
"Servername nicht in Anführungszeichen " + $_.properties.name
}
Und dann:
$computers[0] | %{"$_.properties.name"; $_.properties.name}
Das Ergebnis zeigt einen Typnamen für die Eigenschaft, wenn sie in Anführungszeichen eingeschlossen ist (System.DirectoryServices.SearchResult.properties.name
), aber einen Wert, wenn dies nicht der Fall ist. Dieses Detail zu verstehen, ist der Schlüssel zum Meister der Eigenschaftenabfrage in PowerShell.
Warum unterscheiden sich die Ausgaben?
Die Diskrepanz ergibt sich aus der Art und Weise, wie PowerShell Variablen und Eigenschaften in Zeichenfolgen bewertet. Wenn Sie $_
in einer Zeichenfolge einschließen, betrachtet PowerShell es als ganzes Objekt:
-
Anführungszeichen-Kontext: Wenn Sie
";"
in der Zeichenfolge verwenden, wie in"Servername in Anführungszeichen $_.properties.name"
, bewertet PowerShell nicht die Eigenschaft, sondern verweist auf dieToString
-Methode des Objekts, die in diesem Fall standardmäßig den Typnamen der Eigenschaft zurückgibt. -
Kein Anführungszeichen-Kontext: Im Gegensatz dazu bewertet PowerShell beim Fehlen von Anführungszeichen, wie in
"Servername nicht in Anführungszeichen " + $_.properties.name
, zuerst die Eigenschaft und fügt sie dann an die Zeichenfolge an. Somit wird der tatsächliche Wert abgerufen, der in der Eigenschaft gespeichert ist, und nicht der Typname.
Korrektur der Ausgabe
Um den beabsichtigten Eigenschaftswert innerhalb einer Anführungszeichen-Zeichenfolge abzurufen, können Sie die Auswertung explizit mit der Subausdruck-Syntax aufrufen:
"Servername in Anführungszeichen $($_.properties.name)"
Durch die Verwendung von $()
wird PowerShell angewiesen, das, was sich darin befindet, vor dem Fortfahren mit dem Rest der Zeichenfolge zu bewerten, was die richtige Ausgabe ergibt, die Sie erwartet haben.
Erkundung der Result Property Collection
Denken Sie daran, dass Sie beim Arbeiten mit der ResultPropertyCollection
mit einer Sammlung von Eigenschaften umgehen. Sie können das Objektmodell jederzeit direkt von der PowerShell-Befehlszeile erkunden. Zum Beispiel zeigt das Pipen von $computers[0].properties
zu Get-Member
Informationen über verfügbare Mitglieder und Eigenschaften:
$computers[0].properties | Get-Member
Sie können die Values
-Eigenschaft sehen, die eine ICollection
der Werte der Eigenschaft abruft. Diese Erkundung verbessert Ihr Verständnis und ermöglicht es Ihnen, effektiver durch Eigenschaften zu navigieren.
Fazit
Wenn Sie mit PowerShell und Active Directory’s System.DirectoryServices
arbeiten, ist es entscheidend zu verstehen, wie die Auswertung von Zeichenfolgen auf Objekte und deren Eigenschaften einwirkt. Indem Sie die unterschiedlichen Kontexte erkennen, in denen diese Eigenschaften abgerufen werden, können Sie Verwirrung vermeiden und die benötigten Informationen in dem Format abrufen, das Sie erwarten.
Die Navigation durch komplexe PowerShell-Konstrukte wie ResultPropertyCollection
mag anfangs entmutigend erscheinen, aber mit Übung und tieferem Verständnis werden Sie feststellen, dass es zu einer zweiten Natur in Ihrer Skript-Reise wird.