如何使用Java获取LDAP动态组的成员

如何使用Java获取LDAP动态组的成员,java,active-directory,ldap,Java,Active Directory,Ldap,在基于Java的应用程序中,我们需要从LDAP服务器获取动态组的所有用户。 下面是我的动态组url: ldap:///ou=testou,o=test.com??sub?(&(|(atype=*Abc Company*)(atype=*def Company*)(ctype=test))(enabled=1)(!(sgroup=*testgrp*))(!(|(op=ABC)(bdesc=*abcdef*)))) 当我在JXplore中从上面的url提供过滤器时,我能够获得这个动态组中可

在基于Java的应用程序中,我们需要从LDAP服务器获取动态组的所有用户。 下面是我的动态组url:

ldap:///ou=testou,o=test.com??sub?(&(|(atype=*Abc Company*)(atype=*def Company*)(ctype=test))(enabled=1)(!(sgroup=*testgrp*))(!(|(op=ABC)(bdesc=*abcdef*))))
当我在JXplore中从上面的url提供过滤器时,我能够获得这个动态组中可用的用户组,但当我在下面的java代码中提供相同的过滤器时,LDAP不会返回任何结果。如果我提供了像cn=a*这样的简单过滤器,那么它就工作了,LDAP正在返回结果

public static void main(String[] args) throws NamingException, IOException {
     Properties env = new Properties();
     env.put("java.naming.factory.initial",
           "com.sun.jndi.ldap.LdapCtxFactory");
     // LDAP url
     env.put("java.naming.provider.url", "url");
     env.put("com.sun.jndi.ldap.read.timeout", "1000");
     // ldap login
     env.put("java.naming.security.principal", "username");
     env.put("java.naming.security.credentials", "password");
     InitialLdapContext ctx = new InitialLdapContext(env, null);
     String contextName = "ou=testou,o=test.com";
     // Filter expression
     String filterExpr = "(&(|(atype=*Abc Company*)(atype=*def Company*)(ctype=test))(enabled=1)(!(sgroup=*testgrp*))(!(|(op=ABC)(bdesc=*abcdef*))))"; // selects the groups a user belongs to.


     SearchControls constraints = new javax.naming.directory.SearchControls();
     constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); // SUBTREE_SCOPE means recursive search
     ctx.setRequestControls(new Control[]{new PagedResultsControl(1000,true)});
     byte[] cookie = null;
     int totalResults = 0;


     NamingEnumeration<SearchResult> search = ctx.search(contextName,
           filterExpr,constraints);
     int count=0;
     while (search.hasMoreElements()) {
      count++;
        System.out.println(search.next().getName());    
    }
     System.out.println("Total user"+count);
}

假设您谈论的是JNDI,很遗憾的是,它说:

注意:Sun的LDAP提供程序的1.2版没有正确处理查询组件

而且在Java8之前的任何版本中似乎都没有任何变化


动态组功能依赖于此。

请详细说明您的答案或添加参考链接。谢谢我已经告诉过你它不起作用了。你还想让我说些什么?我不是在URL中传递过滤器,也不是在搜索方法中传递过滤器作为过滤器,你可以看到,在我的代码中,我有go Think文档,它指定如果我们作为URL传递,那么它就不受支持。谢谢你不看我的代码就否决了我的问题@EJPI读取您的代码;我了解动态组功能的工作原理;我知道它依赖于条目中URL中的查询组件;我知道Java不支持这一点;我是这么说的;我提供了一份引文。我还是不知道你还能要求什么。注意:你没有关于谁否决了你的问题的信息。这是一个无记名投票。我可以使用筛选器URL获取动态用户,但LDAP只返回随机数目的用户,并抛出以下错误:[LDAP:错误代码11-LDAP错误11:[LDAP:错误代码11-此搜索操作已检查了最多5000个匹配项];我在上下文中设置了以下内容:namingumerationanswer=ctx.searchldap:///ou=testou,o=test.com??sub?&| atype=*Abc公司*atype=*def公司*ctype=testenabled=1!sgroup=*testgrp*|op=ABCbdesc=*abcdef*,searchCtls@请说得更具体些。你试过什么,为什么不起作用?我添加了我尝试过的代码。@jwillekey您的查询毫无意义。您的意思是说您真的定义了名为aType、cType、bdesc、sgroup和op的属性吗?是的,在LDAP中,我们可以配置自定义属性或将所有属性都视为搁浅属性,我在发布问题时更改了名称。@jwilleke