Question
[Résolu] LDAP DN et caractères de substitution
- Madrolle
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 47
- Remerciements reçus 0
il y a 16 ans 2 semaines #6313
par Madrolle
ShellDealer sur Twitter
[Résolu] LDAP DN et caractères de substitution a été créé 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
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.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 16 ans 1 semaine #6337
par Arnaud Petitjean
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 ?
Réponse de Arnaud Petitjean sur le sujet Re:distinguishedname et caractaires de substitution
Salut !
Si je comprends bien, la question est : \"Comment connaître le DN d'un objet sans avoir à effectuer une requête LDAP dans Active Directory ?\"
L'objectif étant de gagner de précieuses secondes dans l'exécution du script.
Est-ce bien cela ta question ?
Arnaud
Si je comprends bien, la question est : \"Comment connaître le DN d'un objet sans avoir à effectuer une requête LDAP dans Active Directory ?\"
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.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 16 ans 1 semaine #6338
par Arnaud Petitjean
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 ?
Réponse de Arnaud Petitjean sur le sujet Re:distinguishedname et caractaires de substitution
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(\"username\",\"GetProperty\",$null,$obj,$null)
[/code:1]
Ce qui donne pour moi, par exemple :
[code:1]
PS > $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]\"LDAP://$userDN\"[/code:1]
Arnaud
Essaye ceci :
[code:1]
$obj = New-Object -comObject ADSystemInfo
$type = $obj.gettype()
$userDN = $type.InvokeMember(\"username\",\"GetProperty\",$null,$obj,$null)
[/code:1]
Ce qui donne pour moi, par exemple :
[code:1]
PS > $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]\"LDAP://$userDN\"[/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.
- Madrolle
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 47
- Remerciements reçus 0
il y a 16 ans 6 jours #6376
par Madrolle
ShellDealer sur Twitter
Réponse de Madrolle sur le sujet Re:distinguishedname et caractaires de substitution
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 = (\"(objectCategory=group)\"«»)
[/code:1]
La seconde sur les objets ADSI récupérés en filtrant sur les \"managers\".
[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 \"antiSlashesNUMEROS\".
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
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 = (\"(objectCategory=group)\"«»)
[/code:1]
La seconde sur les objets ADSI récupérés en filtrant sur les \"managers\".
[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 \"antiSlashesNUMEROS\".
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 16 ans 6 jours #6377
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:distinguishedname et caractaires de substitution
Salut,Perso écrit:
Ensuite un portage de cet exemple en C#, ou d'un autre, devrait t'aider.
Il suffit de connaître la liste .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.
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.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 16 ans 5 jours #6380
par Arnaud Petitjean
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 ?
Réponse de Arnaud Petitjean sur le sujet Re:distinguishedname et caractaires de substitution
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) <- CN volontairement tordu
$CN = \"CN=Jim\,Mori son(JIM)\"
$objSearcher.Filter = \"(&(objectCategory=group)(objectClass=group)(managedBy=$CN,OU=Utilisateurs,DC=powershell-scripting,DC=com))\"
$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 = \"cn=jim, morisson\"
$IADsPathName = New-Object -ComObject Pathname
$type = $IADsPathName.GetType()
$type.InvokeMember(\"GetEscapedElement\",\"InvokeMethod\",$null,$IADsPathName,(0, $CN))
cn=jim\, morisson
[/code:1]
Pour que ça fonctionne, il faut absolument que ta chaine à \"convertir\" commence par \"cn=\". 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
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) <- CN volontairement tordu
$CN = \"CN=Jim\,Mori son(JIM)\"
$objSearcher.Filter = \"(&(objectCategory=group)(objectClass=group)(managedBy=$CN,OU=Utilisateurs,DC=powershell-scripting,DC=com))\"
$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 = \"cn=jim, morisson\"
$IADsPathName = New-Object -ComObject Pathname
$type = $IADsPathName.GetType()
$type.InvokeMember(\"GetEscapedElement\",\"InvokeMethod\",$null,$IADsPathName,(0, $CN))
cn=jim\, morisson
[/code:1]
Pour que ça fonctionne, il faut absolument que ta chaine à \"convertir\" commence par \"cn=\". 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.054 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Résolu] LDAP DN et caractères de substitution