【问题标题】:LDAP: How to get all Groups in Active Directory?LDAP:如何获取 Active Directory 中的所有组?
【发布时间】:2011-04-15 07:53:58
【问题描述】:

有没有办法使用 java 获取 Active Directory 中所有组的名称?

【问题讨论】:

    标签: java active-directory ldap


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。当我尝试使用它时,我收到以下错误:“javax.naming.NamingException:[LDAP:错误代码 1 - 00000000:LdapErr:DSID-0C090627,注释:为了执行此操作,必须在连接上完成成功绑定., data 0, vece" 有什么想法吗?
    • 看来您的身份验证不正确。您是否连接到正确的 ldap 服务器?您的用户 fdn 是否正确(如 cn=Administrator,cn=users,dc=example,dc=com)并且您的密码是否正确?
    • 是的,我的密码错了(愚蠢的我)。无论如何,现在我得到以下信息:“javax.naming.AuthenticationException:[LDAP:错误代码 49 - 80090308:LdapErr:DSID-0C090334,注释:AcceptSecurityContext 错误,数据 525,vece”
    • 我想我成功了一点,但这就是我现在得到的:“javax.naming.PartialResultException: [LDAP: error code 10 - 0000202B: RefErr: DSID-031006E0, data 0, 1 access点 ref 1: 'example.com' ]; 剩余名称 'cn=testuser,dc=example,dc=com'" testuser 是我使用的用户名。我的 userContainer 有问题吗?公共静态字符串 usersContainer = "cn=testuser,dc=example,dc=com"; ??? "
    • 将 userContainer 更改为“dc=example,dc=com”。我们使用 userContainer 作为搜索的基础。我只是使用了一个示例“cn=users,dc=example,dc=com”。根据您的目录结构更改它。
    【解决方案2】:

    你可以使用这个库。它易于使用且功能强大

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

    【讨论】:

    【解决方案3】:

    我使用 Kalyan 的示例查询用户组,但发现虽然查询有效,但并没有返回所有用户组。经过一番挖掘,我意识到了 AD 全局目录,并且基于 this example,我能够修改 Kalyan 的答案以从全局目录中返回所有用户组。

    所需的更改是:

    1. 向 ldapUri 添加全局端口 3268
    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();
          }
      
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多