2017-05-02 35 views
0

Si je lance ce retourne correctement:simple rien retour requête LDAP avec sélection multiple CN

$DirSearcher = New-Object System.DirectoryServices.DirectorySearcher([adsi]'') 
$DirSearcher.Filter = '(&(objectClass=Computer) (cn=*dc*))' 
$DirSearcher.FindAll().GetEnumerator() | sort-object { $_.Properties.name } ` 
| ForEach-Object { $_.Properties.name } 

Si je lance avec deux sélections, il ne parvient:

$DirSearcher = New-Object System.DirectoryServices.DirectorySearcher([adsi]'') 
$DirSearcher.Filter = '(&(objectClass=Computer) (cn=*dc*) (cn=*adm*))' 
$DirSearcher.FindAll().GetEnumerator() | sort-object { $_.Properties.name } ` 
| ForEach-Object { $_.Properties.name } 

Si je le lance avec une OU à la place, il renvoie tous les ordinateurs:

$DirSearcher = New-Object System.DirectoryServices.DirectorySearcher([adsi]'') 
$DirSearcher.Filter = '(|(objectClass=Computer) (cn=*dc*) (cn=*adm*))' 
$DirSearcher.FindAll().GetEnumerator() | sort-object { $_.Properties.name } ` 
| ForEach-Object { $_.Properties.name } 

Qu'est-ce qui me manque dans la partie Filtre afin de rechercher sur seulement deux sauvages noms de cartes? BTW, il semble fonctionner très bien si je suis en train d'exclure les ordinateurs:

$DirSearcher = New-Object System.DirectoryServices.DirectorySearcher([adsi]'') 
$DirSearcher.Filter = '(&(objectClass=Computer)(!(cn=*esx*)) (!(cn=*slng*)) (!(cn=*dcen*)))' 
$DirSearcher.FindAll().GetEnumerator() | sort-object { $_.Properties.name } ` 
| ForEach-Object { $_.Properties.name } 

Répondre

2

J'ai trouvé une méthode plus propre pour ce faire:

Get-ADComputer -Filter { Name -like '*dc*' -or Name -like '*adm*'} | sort-object Name | select-object -ExpandProperty Name ` 
| Out-File -FilePath C:\Scripts\PI_Computers.txt 

Merci!

1

Juste pour le protocole:

Le bon LDAP filtre pour votre requête est

(&(objectClass=Computer)(|(cn=*dc*)(cn=*adm*))) 

Mais votre solution est le meilleur (Il est toujours préférable d'utiliser les cmdlets prédéfinies pour défaut-tâches)

Au revoir