OVH Cloud OVH Cloud

ActiveDirectory

4 réponses
Avatar
EJL
Bonjour à toutes et à tous,

Je cherche à travers d'un serveur Web (sous Tomcat) à modifier le mot de
passe dans un ActiveDirectory.

Y-a-il une API spécifique et disponible pour manipuler les fonctions de
l'ActiveDirectory ?
L'ADSI dispose-il d'une interface Java ? Si oui, comment la récupérer et
l'utiliser ?

Malgré mes recherches sur le Web, je tourne en rond.
Les solutions trouvées fonctionnent plutôt sur des LDAP "standards".

Merci de votre aide, cela m'enlèverait une épine du pied ...

Elisabeth
Toulouse

4 réponses

Avatar
JScoobyCed
EJL wrote:
Bonjour à toutes et à tous,

Je cherche à travers d'un serveur Web (sous Tomcat) à modifier le mot de
passe dans un ActiveDirectory.

Y-a-il une API spécifique et disponible pour manipuler les fonctions de
l'ActiveDirectory ?
L'ADSI dispose-il d'une interface Java ? Si oui, comment la récupérer et
l'utiliser ?

Malgré mes recherches sur le Web, je tourne en rond.
Les solutions trouvées fonctionnent plutôt sur des LDAP "standards".

Merci de votre aide, cela m'enlèverait une épine du pied ...

Elisabeth
Toulouse



Bonjour,

J2SE contient tous ce qu'il faut pour lire/ecrire vers LDAP, y compris
AD. Il suffit que le servlet connecte a LDAP et envoie une query pour
mettre a jour le mot de passe.
Il y a un tutoriel sur java.sun.com sur LDAP:
http://java.sun.com/products/jndi/tutorial/ldap/

--
JSC

Avatar
EJL
Je viens de lire le tutorial indiqué.

J'avais déjà bien trouvé le moyen de modifier les attributs, mais comme
ActiveDirectory ne possède pas le champ "userPassword", ce qui aboutit à
une impasse.

La seconde piste trouvée est d'utiliser les "extended" operations, comme
indiqué dans l'article : "http://rfc3062.x42.com/".
Mais, dans l'ActiveDirectory, les "supportedextension" ne semblent pas
exister (er notamment l'opération : "1.3.6.1.4.1.4203.1.11.1" qui
pourrait m'aider) ...

Une idée ?

Merci,

EJL

JScoobyCed wrote:

EJL wrote:

Bonjour à toutes et à tous,

Je cherche à travers d'un serveur Web (sous Tomcat) à modifier le mot
de passe dans un ActiveDirectory.

Y-a-il une API spécifique et disponible pour manipuler les fonctions
de l'ActiveDirectory ?
L'ADSI dispose-il d'une interface Java ? Si oui, comment la récupérer
et l'utiliser ?

Malgré mes recherches sur le Web, je tourne en rond.
Les solutions trouvées fonctionnent plutôt sur des LDAP "standards".

Merci de votre aide, cela m'enlèverait une épine du pied ...

Elisabeth
Toulouse



Bonjour,

J2SE contient tous ce qu'il faut pour lire/ecrire vers LDAP, y
compris AD. Il suffit que le servlet connecte a LDAP et envoie une query
pour mettre a jour le mot de passe.
Il y a un tutoriel sur java.sun.com sur LDAP:
http://java.sun.com/products/jndi/tutorial/ldap/

--
JSC



Avatar
JScoobyCed
Je suis assez etonne de constater que le champ 'userPassword' n'apparait
pas par default. En forcant a retourner le champ userPassword (grace au
SearchControl), le champ est vide meme pour un compte qui a un mot de passe.

Je viens de chercher sur le web des infos. Je suis tombe sur un
interessant thread (http://forums.devshed.com/t74683/s.html). En
particulier en page 5 et 6). C'est du PHP, mais ca se traduit en Java
(voir plus bas)
L'idee:
- se connecter sur ldap//monserver:636 avec un connection SSL (le port
636 est cense etre le port SSL. Si votre server a un autre port SSL
changer le 636. Note2: se connecter avec ldaps://monserver ne marche pas
toujours tres bien)
- il faut forcer le mode LDAPv3 (dans le hashtable d'environement)
- il faut utiliser un set de remove + modify du champ 'unicodePwd'
- il faut coder en unicode par:
<sniplet>
String oldpass = "oldpass1233!";
oldpass = """ + oldpass + """; // entourer de guillemets
String unioldpass = "";
for(int i=0;i<oldpass.length();i++) {
unioldpass += (oldpass [i] + "00");
}
String newpass = "newpass12,"; // il faut respecter la policy AD du mot
de // passe (au - 8 caracteres, des chiffres et lettres, des elements
de // ponctuation)
newpass = """ + newpass + """; // entourer de guillemets
String uninewpass = "";
for(int i=0;i<newpass .length();i++) {
uninewpass += (newpass [i] + "00");
}
BasicAttribute oldAtt= new BasicAttribute("unicodePwd",unioldpass );
BasicAttribute newAtt= new BasicAttribute("unicodePwd",uninewpass );
ModificationItem[] modItems = new ModificationItem[2];
modItem[0] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, oldAtt);
modItem[1] = new ModificationItem(DirContext.MODIFY_ATTRIBUTE, newAtt);
myDirContext.modifyAttributes("cn=userx,ou=users,dc=domain", modItem);
</sniplet>

Ce code doit etre paufine, mais l'idee est d'enlever le mot de passe,
puis de mettre un nouveau.

Le champ unicodePwd est en ecriture seule, il est impossible de le lire.

Bon courage.

--
JSC


EJL wrote:
Je viens de lire le tutorial indiqué.

J'avais déjà bien trouvé le moyen de modifier les attributs, mais comme
ActiveDirectory ne possède pas le champ "userPassword", ce qui aboutit à
une impasse.

La seconde piste trouvée est d'utiliser les "extended" operations, comme
indiqué dans l'article : "http://rfc3062.x42.com/".
Mais, dans l'ActiveDirectory, les "supportedextension" ne semblent pas
exister (er notamment l'opération : "1.3.6.1.4.1.4203.1.11.1" qui
pourrait m'aider) ...

Une idée ?

Merci,

EJL


Avatar
EJL
Super ! Cela fonctionne parfaitement (changer MODIFY par REPLACE) !

Je vous remercie grandement.

Remarque 1 : Pour supprimer le mot de passe, il n'est pas nécessaire de
donner l'ancien, n'importe quel mot de passe suffit.

Remarque 2 : Pour mes tests, j'ai pu mettre des mots de passes trivaux
(toto, tata, ...) sans respecter la politique d'AD.

Encore merci,

EJL
Toulouse

JScoobyCed wrote:

Je suis assez etonne de constater que le champ 'userPassword' n'apparait
pas par default. En forcant a retourner le champ userPassword (grace au
SearchControl), le champ est vide meme pour un compte qui a un mot de
passe.

Je viens de chercher sur le web des infos. Je suis tombe sur un
interessant thread (http://forums.devshed.com/t74683/s.html). En
particulier en page 5 et 6). C'est du PHP, mais ca se traduit en Java
(voir plus bas)
L'idee:
- se connecter sur ldap//monserver:636 avec un connection SSL (le port
636 est cense etre le port SSL. Si votre server a un autre port SSL
changer le 636. Note2: se connecter avec ldaps://monserver ne marche pas
toujours tres bien)
- il faut forcer le mode LDAPv3 (dans le hashtable d'environement)
- il faut utiliser un set de remove + modify du champ 'unicodePwd'
- il faut coder en unicode par:
<sniplet>
String oldpass = "oldpass1233!";
oldpass = """ + oldpass + """; // entourer de guillemets
String unioldpass = "";
for(int i=0;i<oldpass.length();i++) {
unioldpass += (oldpass [i] + "00");
}
String newpass = "newpass12,"; // il faut respecter la policy AD du mot
de // passe (au - 8 caracteres, des chiffres et lettres, des elements
de // ponctuation)
newpass = """ + newpass + """; // entourer de guillemets
String uninewpass = "";
for(int i=0;i<newpass .length();i++) {
uninewpass += (newpass [i] + "00");
}
BasicAttribute oldAtt= new BasicAttribute("unicodePwd",unioldpass );
BasicAttribute newAtt= new BasicAttribute("unicodePwd",uninewpass );
ModificationItem[] modItems = new ModificationItem[2];
modItem[0] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, oldAtt);
modItem[1] = new ModificationItem(DirContext.MODIFY_ATTRIBUTE, newAtt);
myDirContext.modifyAttributes("cn=userx,ou=users,dc=domain", modItem);
</sniplet>

Ce code doit etre paufine, mais l'idee est d'enlever le mot de passe,
puis de mettre un nouveau.

Le champ unicodePwd est en ecriture seule, il est impossible de le lire.

Bon courage.

--
JSC


EJL wrote:

Je viens de lire le tutorial indiqué.

J'avais déjà bien trouvé le moyen de modifier les attributs, mais
comme ActiveDirectory ne possède pas le champ "userPassword", ce qui
aboutit à une impasse.

La seconde piste trouvée est d'utiliser les "extended" operations,
comme indiqué dans l'article : "http://rfc3062.x42.com/".
Mais, dans l'ActiveDirectory, les "supportedextension" ne semblent pas
exister (er notamment l'opération : "1.3.6.1.4.1.4203.1.11.1" qui
pourrait m'aider) ...

Une idée ?

Merci,

EJL