Bonjour

Je souhaite récupérer les groupes d'un utilisateur sur un Active Directory mais je rencontre une erreur systématique.

J'arrive à récupérer les infos standard (mail description etc...) mais pas les groupes.

Je me suis appuyé sur de nombreuses aides trouvées sur le net pour faire ma class, voici ce que ça donne:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
 
    /**
     * Créer une connexion sur le serveur LDAP
     */
    public void connectLDAP()
        {
        this.environnement = new Hashtable();
        this.environnement.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
        this.environnement.put(Context.PROVIDER_URL, "ldap://"+this.getControleur()+":389");
        this.environnement.put(Context.SECURITY_AUTHENTICATION, "simple");
        this.environnement.put(Context.SECURITY_PRINCIPAL, this.getLoginDC()+","+this.getDc());
        this.environnement.put(Context.SECURITY_CREDENTIALS, this.getPasswdDC());
        try
            {this.dirContext = new InitialDirContext(this.environnement);}
        catch (NamingException e) 
            {System.out.println("Erreur lors de l'acces au serveur LDAP" + e);}
        }
 
    /**
     * Fermer la connexion au serveur LDAP
     */
    public void deconnectLDAP()
        {
        try
            {this.dirContext.close();}
        catch(NamingException e)
            {System.out.println("Erreur lors de la déconnexion du serveur LDAP" + e);}
        }
 
    public void getInfoUser(String login)
        {
        String[] group;
        C_User user = new C_User();
        user.getUser().setLogin(login);
        try
            {
            this.connectLDAP();
            Attributes attrs = dirContext.getAttributes("cn="+login+",ou=people,"+this.getDc());
            try
                {
                user.getUser().setDescription(attrs.get("description").get().toString());
                System.out.println("Description : " + attrs.get("description").get());
 
                }
            catch(NullPointerException npe)
                {
                user.getUser().setDescription(null);
                System.out.println("L'utilisateur ne possède pas de description");
                }
            try
                {
                user.getUser().setMail(attrs.get("mail").get().toString());
                System.out.println("Mail : " + attrs.get("mail").get());
                }
            catch(NullPointerException npe)
                {
                user.getUser().setMail(null);
                System.out.println("L'utilisateur ne possède pas de mail");
                }            
            try
                {
 
                //user.getUser().setGroupe(attrs.get("mail").get().toString());
                //System.out.println("Mail : " + attrs.get("mail").get());
                }
            catch(NullPointerException npe)
                {
                user.getUser().setMail(null);
                System.out.println("L'utilisateur ne possède pas de mail");
                }                          
            this.deconnectLDAP();
            }
        catch(NamingException e)
            {System.out.println("Erreur lors de la récupération d'information sur le serveur LDAP " + e);}
        this.deconnectLDAP();
        }
 
    public void getUserGroup(String login)
        {
        try 
            {
            //Create the search controls 		
            SearchControls searchCtls = new SearchControls();
 
            //Specify the search scope
            searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
 
            //specify the LDAP search filter
            String searchFilter = "(&(objectClass=user)(cn=toto))";
 
            //Specify the Base for the search
            String searchBase = this.getDc();
 
            //initialize counter to total the group members
            int totalResults = 0;
 
            //Specify the attributes to return
            String returnedAtts[]={"memberOf"};
            searchCtls.setReturningAttributes(returnedAtts);
 
            //Search for objects using the filter
            NamingEnumeration answer = this.dirContext.search(searchBase, searchFilter, searchCtls);
 
            //Loop through the search results
            while (answer.hasMoreElements()) 
                {
                SearchResult sr = (SearchResult)answer.next();
 
                System.out.println(">>>" + sr.getName());
 
                //Print out the groups
 
                Attributes attrs = sr.getAttributes();
                if (attrs != null) 
                    {
				try 
                        {
                        for (NamingEnumeration ae = attrs.getAll();ae.hasMore();) 
                            {
                            Attribute attr = (Attribute)ae.next();
                            System.out.println("Attribute: " + attr.getID());
                            for (NamingEnumeration e = attr.getAll();e.hasMore();totalResults++) 
                                {System.out.println(" " +  totalResults + ". " +  e.next());}
                            }
                        }	 
                        catch (NamingException e)	
                            {System.err.println("Problem listing membership: " + e);}
                    }
                }
                System.out.println("Total groups: " + totalResults);
			this.dirContext.close();
            } 
        catch (NamingException e) 
            {System.err.println("Problem searching directory: " + e);}
        }
j'ai cette erreur:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
Exception in thread "main" java.lang.NullPointerException
	at CONTROLEUR.C_LDAP.getUserGroup(C_LDAP.java:160)
	at CONTROLEUR.C_Accepter_client.<init>(C_Accepter_client.java:57)
	at Serveur.start(Serveur.java:27)
	at Serveur.main(Serveur.java:40)
zsh: exit 1     java Serveur
Bien sur mon utilisateur existe bien, mon OU est la bonne, mon utilisateur pour accéder à l'AD à toute les autorisation nécessaires etc...

J'ai essayé de faire ça:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
 
public void getUserGroup(String user)
        {
        //Create the search controls   
        SearchControls userSearchCtls = new SearchControls();
 
        //Specify the search scope
        userSearchCtls.setSearchScope(SearchControls.OBJECT_SCOPE);
 
        //specify the LDAP search filter to find the user in question
        String userSearchFilter = "(objectClass=user)";
 
         //paceholder for an LDAP filter that will store SIDs of the groups the user belongs to
        StringBuffer groupsSearchFilter = new StringBuffer();
        groupsSearchFilter.append("(|");
 
        //Specify the Base for the search
        String userSearchBase = "CN=toto,OU=People,DC=ugr3,DC=lan";
 
        //Specify the attributes to return
        String userReturnedAtts[]={"tokenGroups"};
        userSearchCtls.setReturningAttributes(userReturnedAtts);
 
        //Search for objects using the filter
        NamingEnumeration userAnswer = null;
        try{userAnswer = this.context.search(userSearchBase, userSearchFilter, userSearchCtls);} 
        catch (NamingException ex) {Logger.getLogger(C_LDAP.class.getName()).log(Level.SEVERE, null, ex);}
 
        //Loop through the search results
        while (userAnswer.hasMoreElements()) 
            {
            SearchResult sr = null;
            try {sr = (SearchResult)userAnswer.next();} 
            catch (NamingException ex) {Logger.getLogger(C_LDAP.class.getName()).log(Level.SEVERE, null, ex);}
 
            Attributes attrs = (Attributes) sr.getAttributes();
 
            if (attrs != null) 
                {
                try 
                    {
                    for (NamingEnumeration ae = attrs.getAll();ae.hasMore();) 
                        {
                        Attribute attr = (Attribute)ae.next();
                        for (NamingEnumeration e = attr.getAll();e.hasMore();) 
                            {
                            byte[] sid = (byte[])e.next();
                            groupsSearchFilter.append("(objectSid=" + binarySidToStringSid(sid) + ")");
                            }
                        groupsSearchFilter.append(")");
                        }
 
                    } 
                catch (NamingException e) {System.err.println("Problem listing membership: " + e);}
                }
            }
        // Search for groups the user belongs to in order to get their names 
        //Create the search controls   
        SearchControls groupsSearchCtls = new SearchControls();
 
        //Specify the search scope
        groupsSearchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
 
        //Specify the Base for the search
        String groupsSearchBase = "DC=ugr3,DC=lan";
 
        //Specify the attributes to return
        String groupsReturnedAtts[]={"sAMAccountName"};
        groupsSearchCtls.setReturningAttributes(groupsReturnedAtts);
 
        //Search for objects using the filter
        NamingEnumeration groupsAnswer = null;
        try {groupsAnswer = this.context.search(groupsSearchBase, groupsSearchFilter.toString(), groupsSearchCtls);} 
        catch (NamingException ex) {Logger.getLogger(C_LDAP.class.getName()).log(Level.SEVERE, null, ex);}
 
        //Loop through the search results
        while (groupsAnswer.hasMoreElements()) 
            {
            SearchResult sr = null;
            try {sr = (SearchResult)groupsAnswer.next();} 
            catch (NamingException ex) {Logger.getLogger(C_LDAP.class.getName()).log(Level.SEVERE, null, ex);}
            Attributes attrs = sr.getAttributes();
 
            if (attrs != null) 
                {try{System.out.println(attrs.get("sAMAccountName").get()); } 
                catch (NamingException ex) { Logger.getLogger(C_LDAP.class.getName()).log(Level.SEVERE, null, ex);}
                }
            }
        try {this.context.close();} 
        catch (NamingException ex) {Logger.getLogger(C_LDAP.class.getName()).log(Level.SEVERE, null, ex);}
        }
 
 
    public static final String binarySidToStringSid( byte[] SID ) 
        {
        String strSID = "";
 
        //convert the SID into string format
 
        long version;
        long authority;
        long count;
        long rid;
 
        strSID = "S";
        version = SID[0];
        strSID = strSID + "-" + Long.toString(version);
        authority = SID[4];
 
        for (int i = 0;i<4;i++) 
            {
            authority <<= 8;
            authority += SID[4+i] & 0xFF;
            }
 
        strSID = strSID + "-" + Long.toString(authority);
        count = SID[2];
        count <<= 8;
        count += SID[1] & 0xFF;
 
        for (int j=0;j<count;j++) 
            {
            rid = SID[11 + (j*4)] & 0xFF;
            for (int k=1;k<4;k++) 
                {
                rid <<= 8;
                rid += SID[11-k + (j*4)] & 0xFF;
                }
            strSID = strSID + "-" + Long.toString(rid);
            }
        return strSID;
        }
et pareil j'obtiens:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
Exception in thread "main" java.lang.NullPointerException
	at CONTROLEUR.C_LDAP.getUserGroup(C_LDAP.java:160)
	at CONTROLEUR.C_Accepter_client.<init>(C_Accepter_client.java:57)
	at Serveur.start(Serveur.java:27)
	at Serveur.main(Serveur.java:40)
zsh: exit 1     java Serveur
en faite ça coince au moment de la requête

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
NamingEnumeration answer = this.dirContext.search(searchBase, searchFilter, searchCtls);
comme si il ne trouvait pas l'user ...

d'avance merci pour toute aide