2011-04-15 5 views
9

जावा का उपयोग कर सक्रिय निर्देशिका में सभी समूहों के नाम प्राप्त करने का कोई तरीका है?एलडीएपी: सक्रिय निर्देशिका में सभी समूह कैसे प्राप्त करें?

+1

आप स्प्रिंग LDAP का उपयोग कर रहे हैं? – lobster1234

उत्तर

10

जावा जेएनडीआई का प्रयोग करें, और (ऑब्जेक्ट क्लास = समूह) के लिए एक खोज करें और सीएन विशेषता का अनुरोध करें। यह सभी समूह का नाम प्राप्त करेगा।

कोड उदाहरण:

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(); 
     } 

    } 
} 
+0

उत्तर के लिए धन्यवाद। जब मैं इसका उपयोग करने का प्रयास करता हूं, तो मुझे निम्न त्रुटि मिलती है: "javax.naming.NamingException: [LDAP: त्रुटि कोड 1 - 00000000: LdapErr: DSID-0C090627, टिप्पणी: इस ऑपरेशन को करने के लिए कनेक्शन पर एक सफल बाध्य पूरा होना चाहिए ।, डेटा 0, vece "कोई विचार? – user709389

+0

ऐसा लगता है कि आपने सही तरीके से प्रमाणीकृत नहीं किया है। क्या आप सही एलडीएपी सर्वर से कनेक्ट कर रहे हैं? क्या आपका उपयोगकर्ता एफडीएन सही है (जैसे सीएन = प्रशासक, सीएन = उपयोगकर्ता, डीसी = उदाहरण, डीसी = कॉम) और क्या आपका पासवर्ड सही है? – kalyan

+0

हां, मेरा पीडब्ल्यू गलत था (बेवकूफ मुझे)। वैसे भी, अब मुझे निम्न मिलता है: "javax.naming.AuthenticationException: [LDAP: त्रुटि कोड 49 - 80090308: LdapErr: DSID-0C090334, टिप्पणी: AcceptSecurityContext त्रुटि, डेटा 525, vece" – user709389

2

आप इस लाइब्रेरी का उपयोग कर सकते हैं। यह इस्तेमाल करने में आसान और शक्तिशाली

http://code.google.com/p/jedi-obi/

+1

क्या यह अंग्रेजी में उपलब्ध है? – ceving

+1

@ceving इस लिंक को देखें http://code.google.com/p/jedi-obi/ विकी/होमयूकेवर्सन लेकिन बस यह, मुझे लगता है कि सभी जावा डीओसी अंग्रेजी में है – Jacobi

0

मैं दलों के लिए क्वेरी करने के लिए कल्याण के उदाहरण का इस्तेमाल किया है, लेकिन पाया गया कि यद्यपि क्वेरी काम किया, यह सब उपयोगकर्ता समूह दिए नहीं किया है। कुछ खुदाई के बाद, मैं एडी ग्लोबल कैटलॉग और this example पर आधारित हो गया, मैं वैश्विक सूची से सभी उपयोगकर्ता समूहों को वापस करने के लिए कल्याण के उत्तर को संशोधित करने में सक्षम था।

आवश्यक परिवर्तन किए गए:

  1. जोड़ा वैश्विक बंदरगाह 3268 ldapUri
  2. पहले पैरामीटर सेट करने के लिए Context.search को "" करने के लिए।

    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(); 
        } 
    
    }