Question [Résolu] LDAP DN et caractères de substitution

Plus d'informations
il y a 16 ans 2 semaines #6313 par Madrolle
Bonjour,

J'ai fait un petit script destiné aux responsables de service pour qu'ils puissent connaitre les groupes dont ils sont gestionnaires. C'est une maquette pour un outil plus évolué.

a fin de gagner en vitesse j'aimerais utiliser le dn directement dans le filtre ldap mais le problème est que ce là nécessite des caractères de substitution (slash20, slash28, etc., qu'on ne voit pas bien).

Voici le filtre ldap généré par la mmc windows (merci à votre bouquin !) pour

[code:1]CN=Big BOSS (ap001no),OU=Normaux,OU=users,OU=asso,DC=vir1,DC=loc[/code:1]

[code:1](&(objectCategory=group)(objectClass=group)(managedBy=CN=Big\20BOSS\20\28ap001no\29,OU=Normaux,OU=users,OU=asso,DC=vir1,DC=loc))[/code:1]

Si windows l'a fait tout seul, il y a surement une méthode pour le faire. La connaissez-vous ?

[code:1]
param($sAMAccountName=\"$env:username\")

\"Liste des groupes de $sAMAccountName\"

$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain
$objSearcher.Filter = (\"(sAMAccountName=$sAMAccountName)\"«»)
$colResults = $objSearcher.Findone()

$dn=$colResults.Properties.distinguishedname

$objSearcher.Filter = (\"(objectCategory=group)\"«»)
$colResults = $objSearcher.FindAll()

$colResults | ?{$_.Properties.managedby -eq $dn} | %{
\"{0,-40} {1,0}\" -f \"$($_.Properties.samaccountname)\",\"$($_.Properties.description)\"
}
[/code:1]

Merci

Message édité par: Arnaud, à: 17/03/10 15:35<br><br>Message édité par: Arnaud, à: 22/03/10 17:57

ShellDealer sur Twitter

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 1 semaine #6337 par Arnaud Petitjean
Salut !

Si je comprends bien, la question est : \&quot;Comment connaître le DN d'un objet sans avoir à effectuer une requête LDAP dans Active Directory ?\&quot;

L'objectif étant de gagner de précieuses secondes dans l'exécution du script.

Est-ce bien cela ta question ?

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 1 semaine #6338 par Arnaud Petitjean
Si la question est bien celle que je crois alors je pense avoir trouvé la réponse...

Essaye ceci :
[code:1]
$obj = New-Object -comObject ADSystemInfo
$type = $obj.gettype()
$userDN = $type.InvokeMember(\&quot;username\&quot;,\&quot;GetProperty\&quot;,$null,$obj,$null)
[/code:1]

Ce qui donne pour moi, par exemple :
[code:1]
PS &gt; $userDN
CN=Administrator,CN=Users,DC=powershell-scripting,DC=com
[/code:1]

Ensuite tu n'as plus qu'à te connecter à ton objet de la façon habituelle :
[code:1]
[ADSI]\&quot;LDAP://$userDN\&quot;[/code:1]

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 5 jours #6376 par Madrolle
Je ne connaissait pas cette façon de récupérer le DN de l'utilisateur courant. Si c'est plus rapide, je prend !

Ma question était autre. Comme tu le note, je filtre le résultat de la recherche en deux étapes.
La première, lors de la requettes LDAP en ne prenant que les groupes.
[code:1]
$objSearcher.Filter = (\&quot;(objectCategory=group)\&quot;«»)
[/code:1]

La seconde sur les objets ADSI récupérés en filtrant sur les \&quot;managers\&quot;.
[code:1]
$colResults | ?{$_.Properties.managedby -eq $dn}
[/code:1]

J'aimerais que le second filtrage se fasse directement dans la requette LDAP, démarche que je pense être sensiblement plus rapide pour les gros annuaires. Problème, ça ne marche pas.

En utilisant l'outil de génération de requettes LDAP de la MMC, je me rend compte que des caractères spéciaux du DN ( ' ',')' par exemple ) doivent être remplacé par des \&quot;antiSlashesNUMEROS\&quot;.

img716.imageshack.us/img716/8660/ldapdn.png

Je voudrais trouver la méthode .net qui produit cette substitution plutôt qu'utiliser -replace qui est une démarche a priori impliquant de connaitre déjà les caractères à problèmes.

Voilà j'espère m'être mieux expliqué cette fois.

Merci dans tous les cas.<br><br>Message édité par: Perso, à: 16/03/10 08:23

ShellDealer sur Twitter

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 5 jours #6377 par Laurent Dardenne
Salut,Perso écrit:

Je voudrais trouver la méthode .net qui produit cette substitution plutôt qu'utiliser -replace qui est une démarche a priori impliquant de connaitre déjà les caractères à problèmes.

Il suffit de connaître la liste .
Ensuite un portage de cet exemple en C#, ou d'un autre, devrait t'aider.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 5 jours #6380 par Arnaud Petitjean
Alors après investigations et d'après mes tests, il n'est pas nécessaire d'échapper tous les caractères de ton filtre pour que la requête fonctionne.

Exemple :
[code:1]
# Recherche les groupes gérés par un utilisateur dont le nom
# (le Common Name, CN) est indiqué dans la variable $CN

$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain

# Jim,Mori son(JIM) &lt;- CN volontairement tordu
$CN = \&quot;CN=Jim\,Mori son(JIM)\&quot;
$objSearcher.Filter = \&quot;(&amp;(objectCategory=group)(objectClass=group)(managedBy=$CN,OU=Utilisateurs,DC=powershell-scripting,DC=com))\&quot;

$colResults = $objSearcher.FindAll()
$colResults
[/code:1]

Pour que ça fonctionne, il a juste fallu échapper la virgule, car une virgule n'est pas un caractère valide dans un CN puisqu'elle sert à séparer les champs dans un DN.

Sinon, pour ce qui est de générer automatiquement les bons caractères d'échappement, j'ai réussi à trouver une solution après plusieurs heures de recherche et tests :

[code:1]
$CN = \&quot;cn=jim, morisson\&quot;

$IADsPathName = New-Object -ComObject Pathname
$type = $IADsPathName.GetType()
$type.InvokeMember(\&quot;GetEscapedElement\&quot;,\&quot;InvokeMethod\&quot;,$null,$IADsPathName,(0, $CN))

cn=jim\, morisson
[/code:1]

Pour que ça fonctionne, il faut absolument que ta chaine à \&quot;convertir\&quot; commence par \&quot;cn=\&quot;. En effet, l'objet attendu est un CN, donc la chaine doit commencer ainsi.

Cette solution s'appuie sur un objet COM nommé PathName et fait appel à une méthode nommée GetEscapedElement. Voir IADsPathname::GetEscapedElement Method pour en savoir plus sur le sujet et là aussi IADsPathname interface .

L'utilisation de cet objet COM est un peu particulière, je vais faire de ce pas un petit tuto pour expliquer tout ça...

Arnaud<br><br>Message édité par: Arnaud, à: 16/03/10 15:16

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.052 secondes
Propulsé par Kunena