Déverouiller un utilisateur AD
Bonjour mes chers confrères.
Première fois que je poste sur le forum Java, petite larme venant du monde .Net.
Je suis actuellement en train de reprogrammer un logiciel en JAVA et je bloque sur une fonction de déverrouillage d'utilisateur ActiveDirectory.
Ma fonction de connexion marche parfaitement :
Ci dessous mon constructeur de classe et ma fonction de test de connexion
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
public ActiveDirectory(String domaineSaisi, String domaineCourt, String serveurDC,String user,String passwd)
{
this.domaine = domaineSaisi;
this.user = user;
this.ldapURI = "ldap://" + serveurDC + ":389";
environnement = new Hashtable();
environnement.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
environnement.put(Context.SECURITY_AUTHENTICATION,"Simple");
environnement.put(Context.SECURITY_PRINCIPAL, domaineCourt + "\\" + user);
environnement.put(Context.SECURITY_CREDENTIALS, passwd);
environnement.put(Context.PROVIDER_URL,this.ldapURI);
}
/**
* Fonction de test de connexion au LDAP Active Directory
* @return bool retourne vrai si la connexion s'effectue
*/
public boolean testConnexion()
{
try
{
this.ldapcontext = new InitialLdapContext(environnement, null);
System.out.println("Connexion sur AD ok : " + user + " sur " + domaine);
return true;
}
catch (NamingException nex)
{
System.out.println("Connexion ldap échouée");
System.out.append(nex.getExplanation());
return false;
}
} |
Ma fonction de listage des utilisateurs verrouillé marche également à merveille :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
public List<String> listeUtilisateursVerouilles()
{
List<String> utilisateursVerrouilles = new java.util.ArrayList<>();
try
{
String requete = "(&(objectclass=user)(objectcategory=person)(lockoutTime>=1))";
String[] domaineCasse = domaine.split("\\.");
SearchControls monControleRecherche = new SearchControls();
monControleRecherche.setSearchScope(SearchControls.SUBTREE_SCOPE);
monControleRecherche.setTimeLimit(10000);
String[] proprietesACharger = {"cn"};
monControleRecherche.setReturningAttributes(proprietesACharger);
NamingEnumeration resultat = ldapcontext.search("dc=" + domaineCasse[0] + ",dc=" + domaineCasse[1], requete,monControleRecherche);
while (resultat.hasMore())
{
SearchResult resultatEntry = (SearchResult) resultat.next();
Attributes attributsReponse = resultatEntry.getAttributes();
utilisateursVerrouilles.add(attributsReponse.get("cn").toString().substring(3));
}
this.ldapcontext.close();
}
catch (NamingException nex)
{
System.out.println(nex.getExplanation());
}
return utilisateursVerrouilles;
} |
Cependant je rencontre un problème avec ma fonction de déverrouillage de l'utilisateur. En effet je sélectionne dans une JList mon utilisateur à déverrouiller issu de ma fonction listeUtilisateursVerouilles() ci-dessus.
Lorsque j’exécute ma fonction de déverrouillage suivante : à aucun moment le catch n'est atteint, aucun message ne s'affiche dans ma console de débogage. Ma connexion au LDAP est bien faite avec un contexte d'administrateur du domaine et lors de l'execution de ma fonction, ma variable Entry renvoie bien dans le debugger mon bon utilisateur.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
public void deverouilleUtilisateur(String filtre, String cible)
{
try
{
cible = cible.trim();
String requete = "(&(objectclass=user)(objectcategory=person)(" + filtre + "=*" + cible + "*))";
String[] domaineCasse = domaine.split("\\.");
SearchControls monControleRecherche = new SearchControls();
monControleRecherche.setSearchScope(SearchControls.SUBTREE_SCOPE);
monControleRecherche.setTimeLimit(10000);
String[] proprietesACharger = {"lockoutTime","cn"};
monControleRecherche.setReturningAttributes(proprietesACharger);
NamingEnumeration resultat = ldapcontext.search("dc=" + domaineCasse[0] + ",dc=" + domaineCasse[1], requete,monControleRecherche);
System.out.println(resultat.getClass());
while (resultat.hasMore())
{
SearchResult entry = (SearchResult) resultat.next();
Attributes attributesCible = entry.getAttributes();
attributesCible.put("lockoutTime", "0");
System.out.println("utilisateur " + cible + " deverrouillé");
}
}
catch (NamingException nex)
{
System.out.println(nex.getExplanation());
}
} |
J'ai recherché sur Internet mais entre ceux qui disent d'utiliser un protocole SSL (sans succès) , essayé avec la valeur "0" ou 0, et autres chamanerie vaudou, je vous avoue qu'aucune solution n'a marché pour le moment et je me tourne vers vous.
C'est mon premier programme en JAVA peut-être est-ce juste une erreur enorme que je vois pas n'hésitez pas à m'engueuler très fort. :)
Merci de votre lecture et encore plus de votre réponse !
Aidez-moi ObiWan Kenoby, vous êtes mon seul espoir !