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 die ToString-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.