Java:LDAP搜索返回1行

Java:LDAP搜索返回1行,java,active-directory,ldap,Java,Active Directory,Ldap,我试图从我的active directory获取所有用户,但是我的代码只返回一行。我尝试了下面的方法,目前只输出一个用户 private void getUserBasicAttributes(String username, LdapContext ctx) { try { List<String> usersList = new ArrayList<String>(); SearchControls constraints =

我试图从我的active directory获取所有用户,但是我的代码只返回一行。我尝试了下面的方法,目前只输出一个用户

private void getUserBasicAttributes(String username, LdapContext ctx) {

    try {
        List<String> usersList = new ArrayList<String>();
        SearchControls constraints = new SearchControls();
        constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);


        //First input parameter is search bas, it can be "CN=Users,DC=YourDomain,DC=com"
        //Second Attribute can be uid=username
         NamingEnumeration<SearchResult>  answer = ctx.search("DC=domain,DC=com", "(&(objectCategory=user))"
             , constraints);
        if (answer.hasMoreElements()) {
        Person person = new Person();
           SearchResult  attrs = ((SearchResult) answer.next());
            String names[] = attrs.getName().split(",");
                 String name[] = names[0].split("=");

            usersList.add(name[1]);


        }else{
            throw new Exception("Invalid User");
        }

        System.out.println(usersList.size());

    } catch (Exception ex) {
        ex.printStackTrace();
    }


}
private void getUserBasicAttribute(字符串用户名,LdapContext ctx){
试一试{
List usersList=new ArrayList();
SearchControls约束=新的SearchControls();
约束.setSearchScope(SearchControls.SUBTREE_范围);
//第一个输入参数是search bas,它可以是“CN=Users,DC=YourDomain,DC=com”
//第二个属性可以是uid=username
namingumerationanswer=ctx.search(“DC=domain,DC=com”,(&(objectCategory=user))”
(限制);
if(answer.hasMoreElements()){
Person=新人();
SearchResult attrs=((SearchResult)answer.next());
字符串名称[]=attrs.getName().split(“,”);
字符串名称[]=名称[0]。拆分(“”);
usersList.add(名称[1]);
}否则{
抛出新异常(“无效用户”);
}
System.out.println(usersList.size());
}捕获(例外情况除外){
例如printStackTrace();
}
}

如果没有循环所有结果,请在if中添加while循环

if (answer.hasMoreElements()) {
    while(answer.hasMoreElements()) {
        Person person = new Person();
        SearchResult  attrs = ((SearchResult) answer.next());
        String names[] = attrs.getName().split(",");
        String name[] = names[0].split("=");

        usersList.add(name[1]);
    }
}else{
    throw new Exception("Invalid User");
}

你太难了。没有理由执行任何“拆分”pf值

// Specify the ids of the attributes to return
String[] attrIDs = { "uid" };

// Get ONLY the attributes desired
Attributes answer = ctx.getAttributes("CN=Users,DC=YourDomain,DC=com", attrIDs);
for (NamingEnumeration ae = answer.getAll(); ae.hasMore();) {
    Attribute attr = (Attribute)ae.next();
    System.out.println("attribute: " + attr.getID());
    /* Print each value */
    for (NamingEnumeration e = attr.getAll(); e.hasMore();
         System.out.println(e.next()))
        ;
}

让我知道我能提供什么帮助。

您需要
而不是
如果

while (answer.hasMoreElements()) {
    Person person = new Person();
    SearchResult  attrs = ((SearchResult) answer.next());
    String names[] = attrs.getName().split(",");
    String name[] = names[0].split("=");
    usersList.add(name[1]);
}
if (usersList.size() == 0) {
    throw new Exception("Invalid User");
}

您还可以简化名称元素的处理。不需要解析DN。只需预先指定要返回的属性,然后直接检索它们。

也不需要这样做。如果只检索一个属性,则可以直接获取它。无需迭代所有1个属性。没有回答被问到的实际问题。