列出活动目录组中的所有用户。

5

我在列举Active Directory中的所有用户时遇到了一些困难。我找到了组,但不幸的是,我无法检索所有用户。我正在寻找用户的全名、用户名和部门。我的代码如下:

package client;

import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;
import javax.naming.ldap.*;   
import java.util.Enumeration;

import javax.naming.NamingEnumeration;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.directory.*; 

public class AD1 {
    public AD1() {
        super();
    }

    public static String usersContainer = "cn=XX,ou=XX,ou=Groups,dc=XX,dc=XX,dc=XXX";

    public static void main(String[] args) {

        try {
            LdapContext ctx = null;
            Hashtable env = new Hashtable();
            env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
            env.put(Context.SECURITY_AUTHENTICATION, "Simple");
            //it can be <domain\\userid> something that you use for windows login
            //it can also be
            env.put(Context.SECURITY_PRINCIPAL, "username");
            // env.put(Context.SECURITY_CREDENTIALS, "password");
            try {
                env.put(Context.SECURITY_CREDENTIALS, "password".getBytes("UTF8"));
            }
            catch (java.io.UnsupportedEncodingException e) { /* ignore */ }

            //in following property we specify ldap protocol and connection url.
            //generally the port is 389
            env.put(Context.PROVIDER_URL, "ldap://IP:PORT");

            ctx = new InitialLdapContext(env, null);

            System.out.println("Connection Successful.");

            DirContext ctx1 = new InitialDirContext(env);   
            SearchControls ctls = new SearchControls();        
            String[] attrIDs = { "distinguishedName","cn","name","uid",
                                 "sn",
                                 "givenname",
                                 "memberOf",
                                 "samaccountname",
                                 "userPrincipalName" };

            ctls.setReturningAttributes(attrIDs);       
            ctls.setSearchScope(SearchControls.SUBTREE_SCOPE); 
            //ctls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
            NamingEnumeration answer = ctx1.search( usersContainer, "(objectClass=user)", ctls );     

            System.out.print("Out while loop");
            while(answer.hasMore()) {
                System.out.print("while loop11");
                SearchResult rslt = (SearchResult)answer.next();          
                Attributes attrs = rslt.getAttributes();           
                System.out.println(attrs.get("uid"));         
                ctx1.close(); 
            }

        } catch(NamingException nex) {
            System.out.println("Active Directory Connection: FAILED");
            nex.printStackTrace();
        }
    }
}

Can anyone help.


你不应该在 answer.hasMore() 循环内关闭上下文。其余部分似乎只是格式问题。你只打印了 uid,所以你只能看到它。 - user207421
1个回答

2
由于这是关于Active Directory而不是真正的LDAP,您能否为我们提供有关LDAP/Active Directory配置的更多详细信息?根据您提供的信息,很难帮助您。请参考以下内容:

编辑1:
您的问题就在这里吗?

while(answer.hasMore()) {
     System.out.print("while loop11");
     SearchResult rslt = (SearchResult)answer.next();          
     Attributes attrs = rslt.getAttributes();           
     //System.out.println(attrs.get("uid"));
     System.out.println(attrs.get("cn"));
     ctx1.close(); 
     }

1
实际上,我没有收到错误。我得到的结果是:CN=KIM KIM,OU=XX,OU=Director,OU=XX,DC=XX,DC=XX,DC=XX,CN=Johny John,OU=XX,OU=Accounts,OU=XX,DC=XX,DC=XX,DC=XX。我想只检索每个人的CN和具有董事会的OU。目前它们在一行中。 - user1080320
我尝试运行您提供的代码,它显示了组名称。这个组中只有一个字段,即成员,它将给我上一行。 - user1080320
很奇怪,你应该在 while 循环中设置断点进行调试,并仔细观察 attrs 中得到的内容,因为当你查找 users 对象时,你需要访问更多的属性而不仅仅是 dn 或 cn。请查看所有属性,我无法提供更多帮助。抱歉。 - Kiwy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接