2015-04-21 1 views
0

La requête ADSI fonctionne correctement, elle renvoie plusieurs utilisateurs.Sélection de certaines propriétés à partir d'un objet dans PowerShell

Je veux sélectionner le 'nom' et 'email' de chaque objet qui est retourné.

$objSearcher = [adsisearcher] "()" 
$objSearcher.searchRoot = [adsi]"LDAP://dc=admin,dc=domain,dc=co,dc=uk" 
$objSearcher.Filter = "(sn=Smith)" 
$ADSearchResults = $objSearcher.FindAll() 

$SelectedValues = $ADSearchResults | ForEach-Object { $_.properties | Select -property mail, name } 

$ ADSearchResults.properties.mail me donne l'adresse e-mail

Quand j'omettez le « select -properties » il retournera toutes les propriétés, mais en essayant de sélectionner certaines propriétés revient avec rien mais les valeurs vides.

+1

Si vous n'êtes pas coincé sous Windows XP, je vous encourage à utiliser 'Get-ADUser' du module' ActiveDirectory' PowerShell qui est une partie de [RSAT] (http://blogs.msdn.com /b/rkramesh/archive/2012/01/17/how-to-add-active-directory-module-in-powershell-in-windows-7.aspx). –

Répondre

1

Chaque fois que je travaille avec ADSI trouvent plus facile d'étendre les objets renvoyé en utilisant l'.GetDirectoryEntry()

$ADSearchResults.GetDirectoryEntry() | ForEach-Object{ 
    $_.Name 
    $_.Mail 
} 

Note: que faire de cette façon vous donne accès à l'objet réel. Il est donc possible de changer ces valeurs et de compléter les changements avec quelque chose comme $_.SetInfo(). Cela devait être un avertissement mais ne causerait pas de problèmes en lisant simplement des valeurs.

Respectez le commentaire de Bacon Bits ainsi que sa réponse supprimée. Vous devez utiliser Get-Aduser s'il est disponible et si vous utilisez Active Directory.

mise à jour des commentaires

Une partie de la question est que toutes ces propriétés ne sont pas la chaîne mais System.DirectoryServices.PropertyValueCollection s. Nous devons sortir ces données dans un objet personnalisé peut-être? Essayons avec ceci.

$SelectedValues = $ADSearchResults.GetDirectoryEntry() | ForEach-Object{ 
    New-Object -TypeName PSCustomObject -Property @{ 
     Name = $_.Name.ToString() 
     Mail = $_.Mail.ToString() 
    } 
} 

Cette approche simple utilise chaque objet toString() méthode pour briser les données de l'objet. Notez que, bien que cela fonctionne pour ces propriétés, faites attention en utilisant if pour other et il risque de ne pas afficher les résultats corrects. Expérience et débogage!

+0

Merci Matt, la méthode DirectoryEntry() fonctionne, elle renvoie toutes les valeurs à l'écran, la difficulté que j'ai est que je voulais $ SelectedValues ​​être un objet contenant toutes les valeurs 'mail' et 'name' pour tous les 'Smiths 'il a trouvé dans le répertoire – beehaus

+0

@MarkBee Jetez un oeil à ma mise à jour. – Matt

+0

Merci encore @Matt, ça marche bien :) juste ce que je cherchais. Pensez que je comprends la réponse ... se maquiller .NET objets et méthodes est tout à fait un challange – beehaus

0

Avez-vous essayé d'ajouter les propriétés?

$objSearcher.PropertiesToLoad.Add("mail") 
$objSearcher.PropertiesToLoad.Add("name")