Y a-t-il un moyen d'obtenir les noms de tous les groupes dans Active Directory à l'aide de Java? P>
3 Réponses :
Utilisez Java JNDI et effectuez une recherche de (ObjectClass = Group) et demandez l'attribut CN. Cela obtiendra tout le nom des groupes.
Exemple de code: P>
import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; public class Test { public static String ldapUri = "ldap://localhost"; public static String usersContainer = "cn=users,dc=example,dc=com"; public static void main(String args[]) { if (args.length != 2) { System.out.println("Usage: test userName password"); return; } String username = args[0]; String password = args[1]; Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, ldapUri); env.put(Context.SECURITY_PRINCIPAL, username); env.put(Context.SECURITY_CREDENTIALS, password); try { DirContext ctx = new InitialDirContext(env); SearchControls ctls = new SearchControls(); String[] attrIDs = { "cn" }; ctls.setReturningAttributes(attrIDs); ctls.setSearchScope(SearchControls.ONELEVEL_SCOPE); NamingEnumeration answer = ctx.search(usersContainer, "(objectclass=group)", ctls); while (answer.hasMore()) { SearchResult rslt = (SearchResult) answer.next(); Attributes attrs = rslt.getAttributes(); System.out.println(attrs.get("cn")); } ctx.close(); } catch (NamingException e) { e.printStackTrace(); } } }
Merci pour la réponse. Lorsque j'essaie d'utiliser ceci, je reçois une erreur suivante: "Javax.name.namingException: [LDAP: Code d'erreur 1 - 00000000: LDAPERR: DSID-0C090627, Commentaire: Pour effectuer cette opération, une liaison réussie doit être complétée sur la connexion. ., Données 0, Vece "Toute idée?
On dirait que vous n'êtes pas authentifié correctement. Vous connectez-vous au serveur LDAP correct? Votre utilisateur FDN est-il correct (comme CN = Administrator, CN = Utilisateurs, DC = Exemple, DC = COM) et votre mot de passe est-il correct?
Oui, ma Pw a eu tort (stupide moi). Quoi qu'il en soit, je reçois maintenant: "Javax.naming.AuthenticationSception: [LDAP: Code d'erreur 49 - 80090308: LDAPERR: DSID-0C090334, Commentaire: AcceptecurityContext Erreur, Données 525, Vece"
Je pense que j'ai réussi un peu, mais c'est ce que je reçois maintenant: "Javax.naming.partialresultException: [LDAP: Code d'erreur 10 - 0000202b: référence: dsid-031006e0, données 0, 1 points d'accès ref 1: 'exemple.com '] Y a-t-il quelque chose qui ne va pas avec mon usercontainer? Utilisateurs de chaînes statiques publiquesContainer = "CN = Testuffer, DC = Exemple, DC = COM"; ??? "
Changez l'UserContainer en "DC = Exemple, DC = COM". Nous utilisons Usercontainer comme base de la recherche. Je viens d'utiliser un exemple "CN = utilisateurs, dc = exemple, dc = com". Changez-le en fonction de votre structure de répertoire.
@kalyan - Grand exemple! Merci!
Comment filtrer par l'utilisateur?
Le problème est que le nombre de demandes au serveur LDAP sera le nombre de groupes existant! Y a-t-il un moyen d'obtenir tous les groupes dans une demande?
Vous pouvez utiliser cette bibliothèque. Il est facile à utiliser et à puissant p>
@çuving Voir ce lien code.google.com/p/JEDI-OBI/WIKI / Homukversion Mais juste ceci, je vois que tout le Java Doc est en anglais
S'il vous plaît ne postez pas seulement un outil ou une bibliothèque comme réponse. Au moins démontrer Comment cela résout le problème dans la réponse elle-même.
J'ai utilisé l'exemple de Kalyan pour interroger les groupes d'utilisateurs, mais j'ai constaté que bien que la requête ait fonctionné, elle n'a pas renvoyé tous les groupes d'utilisateurs. Après quelques creux, j'ai pris conscience du catalogue Global AD et basé Cet exemple , J'ai pu modifier la réponse de Kalyan pour renvoyer tous les groupes d'utilisateurs du catalogue global.
Les modifications requises étaient les suivantes: P>
3268 Code> au LDAPURI LI>
-
Définissez le premier paramètre sur context.Search code> à "" code>. p>.
public static void main(String args[]) {
String ldapUri = "ldap://ad.domain.com";
if (args.length != 2) {
System.out.println("Usage: test userName password");
return;
}
String username = args[0];
String password = args[1];
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ldapUri + ":3268");
env.put(Context.SECURITY_PRINCIPAL, username);
env.put(Context.SECURITY_CREDENTIALS, password);
try {
DirContext context = new InitialDirContext(env);
SearchControls searchControls = new SearchControls();
String[] attrIDs = {"cn"};
searchControls.setReturningAttributes(attrIDs);
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration answer = context.search("", "(objectclass=group)", searchControls);
while (answer.hasMore()) {
SearchResult rslt = (SearchResult) answer.next();
Attributes attrs = rslt.getAttributes();
System.out.println(attrs.get("cn"));
}
context.close();
} catch (NamingException e) {
e.printStackTrace();
}
}