2011-04-15 57 views

回答

10

使用Java JNDI,並搜索(objectclass = group)並請求cn屬性。這將獲得所有組名稱。

代碼示例:

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:error code 1 - 00000000:LdapErr:DSID-0C090627,comment:爲了執行此操作,必須在連接上成功完成綁定。,數據0,vece「任何想法? – user709389 2011-04-20 10:46:59

+0

看起來像你沒有正確認證。您是否連接到正確的ldap服務器?您的用戶fdn是否正確(例如cn = Administrator,cn = users,dc = example,dc = com)並且密碼正確? – kalyan 2011-04-21 05:59:38

+0

是的,我的電話是錯的(愚蠢的我)。無論如何,現在我得到以下:「javax.naming.AuthenticationException:[LDAP:錯誤代碼49 - 80090308:LdapErr:DSID-0C090334,評論:AcceptSecurityContext錯誤,數據525,vece」 – user709389 2011-04-21 07:51:37

2

你可以使用這個庫。它易於使用,功能強大的

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

+1

是否有英文版本? – ceving 2012-04-19 12:15:59

+1

@ceving請參閱此鏈接http://code.google.com/p/jedi-obi/ wiki/HomeUkVersion 但是,我看到所有的Java DOC都是英文的 – Jacobi 2012-10-29 17:26:43

0

我用格利揚的例子來查詢的用戶羣體,但發現,雖然查詢工作,它沒有返回的所有用戶組。經過一番挖掘,我開始意識到AD全球目錄和基於this example,我能夠修改Kalyan的答案,以返回全局編錄中的所有用戶組。

所需要的變化是:

  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(); 
        } 
    
    } 
    
相關問題