Comprendre la System.DirectoryServices.ResultPropertyCollection
dans PowerShell
Lorsque vous travaillez avec PowerShell et que vous interrogez Active Directory, vous pouvez rencontrer un comportement déroutant lorsque vous essayez d’accéder aux propriétés de la System.DirectoryServices.ResultPropertyCollection
. Dans cet article, nous allons déchiffrer un problème courant rencontré lors de la récupération d’informations via un DirectorySearcher
—plus précisément, pourquoi deux sorties différentes produisent des résultats inattendus. Explorons le problème, sa racine et comment vous pouvez le résoudre efficacement.
Le Problème
Vous avez configuré un script PowerShell qui utilise la classe DirectorySearcher
pour trouver des objets ordinateur dans Active Directory, mais vous rencontrez des divergences dans votre sortie. Voici une réplique simplifiée de votre code :
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = New-Object System.DirectoryServices.DirectoryEntry
$objSearcher.Filter = ("(objectclass=computer)")
$computers = $objSearcher.findall()
Lorsque vous essayez d’imprimer les noms des ordinateurs, vous observez les deux sorties suivantes :
$computers | %{
"Nom du serveur entre guillemets $_.properties.name"
"Nom du serveur sans guillemets " + $_.properties.name
}
Et ensuite :
$computers[0] | %{"$_.properties.name"; $_.properties.name}
Le résultat montre un nom de type pour la propriété lorsqu’il est inclus entre guillemets (System.DirectoryServices.SearchResult.properties.name
) mais une valeur lorsqu’il ne l’est pas. Comprendre cette nuance est essentiel pour maîtriser la récupération des propriétés dans PowerShell.
Pourquoi les Sorties Diffèrent-elles?
La divergence provient de la manière dont PowerShell évalue les variables et les propriétés dans les chaînes. Lorsque vous incluez $_
dans une chaîne, PowerShell le considère comme un objet entier :
-
Contexte entre Guillemets : Lorsque vous utilisez
";"
dans la chaîne, comme dans"Nom du serveur entre guillemets $_.properties.name"
, PowerShell n’évalue pas la propriété, mais fait référence à la méthodeToString
de l’objet, qui, dans ce cas, par défaut, renvoie le nom de type de la propriété. -
Contexte sans Guillemets : À l’inverse, lorsque vous l’utilisez sans guillemets, comme dans
"Nom du serveur sans guillemets " + $_.properties.name
, PowerShell évalue d’abord la propriété puis la concatène à la chaîne. Ainsi, elle récupère la valeur réelle stockée dans la propriété plutôt que le nom de type.
Correction de la Sortie
Pour récupérer la valeur de propriété voulue tout en étant à l’intérieur d’une chaîne citée, vous pouvez explicitement invoquer l’évaluation en utilisant la syntaxe de sous-expression :
"Nom du serveur entre guillemets $($_.properties.name)"
Cette utilisation de $()
indique à PowerShell d’évaluer ce qui est à l’intérieur avant de procéder avec le reste de la chaîne, produisant ainsi la sortie correcte que vous attendiez.
Explorer la Collection de Propriétés de Résultat
Rappelez-vous, lorsque vous travaillez avec ResultPropertyCollection
, vous traitez une collection de propriétés. Vous pouvez toujours explorer le modèle d’objet directement depuis la ligne de commande PowerShell. Par exemple, en piping $computers[0].properties
vers Get-Member
révèle des informations sur les membres et propriétés disponibles :
$computers[0].properties | Get-Member
Vous pouvez voir la propriété Values
, qui récupère un ICollection
des valeurs de la propriété. Cette exploration améliore votre compréhension et vous permet de naviguer plus efficacement à travers les propriétés.
Conclusion
Lorsque vous travaillez avec PowerShell et System.DirectoryServices
d’Active Directory, il est crucial de saisir comment l’évaluation des chaînes agit sur les objets et leurs propriétés. En reconnaissant les différents contextes dans lesquels ces propriétés sont accessibles, vous pouvez éviter la confusion et récupérer les informations dont vous avez besoin dans le format attendu.
Naviguer dans des constructions PowerShell complexes comme ResultPropertyCollection
peut sembler décourageant au départ, mais avec de la pratique et une compréhension plus approfondie, vous constaterez que cela devient une seconde nature dans votre parcours de scripting.