java - 通过在 JAVA 中传递组名从 Active Directory 获取电子邮件地址

标签 java

我正在尝试创建一个函数,通过将组名称作为输入参数,从 Active Directory 返回所有组成员的电子邮件地址,结果将是“;”单独的字符串。

我找到了以下代码,但仅返回第一个成员的电子邮件地址,并非所有成员都可以请您指导我下面的代码有什么问题,或者Java中是否有其他方法可以完成它: 谢谢

public String fetchGroupMembers(String strGroupName)
    {
        Vector memberEmails = new Vector();
        String strEmails = "";    
        try
        { 
            //Create the initial directory context
            //DirContext ctx = new InitialDirContext(ctx);
            //Create the search controls        
            SearchControls searchCtls = new SearchControls();
            //Specify the search scope
            searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
            //specify the LDAP search filter
            String searchFilter = "(&(objectClass=group)(CN="+strGroupName+"))";
            //Specify the Base for the search
            //String searchBase =searchBase;
            //initialize counter to total the group members
            int totalResults = 0;

            //Specify the attributes to return
            String returnedAtts[]={"member", "mail"};
            searchCtls.setReturningAttributes(returnedAtts);

            //Search for objects using the filter
            NamingEnumeration answer = ctx.search(searchBase, searchFilter, searchCtls);
            //Loop through the search results
            while (answer.hasMoreElements())
            {
                SearchResult sr = (SearchResult)answer.next();
                //System.out.println(">>>" + sr.getName());
                Attributes attrs = sr.getAttributes();
                if (attrs != null)
                {
                    try
                    {
                        for (NamingEnumeration ae = attrs.getAll();ae.hasMore();)
                        {
                            Attribute attr = (Attribute)ae.next();
                            //System.out.println("Attribute: " + attr.getID());
                            for (NamingEnumeration e = attr.getAll();e.hasMore();totalResults++)
                            {
                                String str = e.next().toString();
                                //System.out.println(" " +  totalResults + ". " + str );
                                int end = str.indexOf(",");
                                //System.out.println("end " + end);
                                if(end != -1)
                                {
                                    String str1 = str.substring(3, end);
                                    //System.out.println("Name-->>" + str1 + "<<");
                                    doFilterSearch(str1.trim(), memberEmails);
                                }
                            }
                        }
                    }    
                    catch (NamingException e)
                    {
                         e.printStackTrace();
                        System.err.println("Problem listing members: " + e);
                    } 
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            }
            System.out.println("Total members: " + totalResults);
            ctx.close();
        } 

和过滤器代码:

public void doFilterSearch(String employeeID,Vector memberEmails) throws Exception{

    SearchControls ctls = new SearchControls();
    ctls. setReturningObjFlag (true);
    ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
    String[] attrIDs = {"sn","mail"};
    ctls.setReturningAttributes(attrIDs);
    //System.out.println("Searching For :: " + employeeID);
    String filter = "(&(objectclass=*)(cn="+employeeID+"))"; //  ( mail=*)  // , "mail","manager"

    NamingEnumeration myInum = ctx.search(searchBase, filter, ctls);
    //formatResults(answer , grievanceBean);
    int count = 0;
    try
    {
        while (myInum.hasMoreElements())
        {
            SearchResult sr = (SearchResult)myInum.next();
            //grievanceBean = formatAttributes(sr.getAttributes() , grievanceBean);
            for (NamingEnumeration enuNaming = sr.getAttributes().getAll(); enuNaming.hasMore();) 
            {
                 Attribute attrib = (Attribute)enuNaming.nextElement();
                 String attrName = attrib.getID();
                // System.out.println("ATTRIBUTE Name : " + attrib.getID());
                // System.out.println("ATTRIBUTE Value: " + attrib.toString());

                 if (attrName.equalsIgnoreCase("mail"))
                 {  
                        String attrValue = attrib.toString();
                        int length = attrValue.length();
                        String mail = attrValue.substring(attrValue.indexOf(":")+2,length);

                        //System.out.println("Mail :: -->" + mail + "<--");
                        //System.out.println("E-mail :: -->>" + (mail.substring(mail.indexOf(":") + 1, mail.length())).trim() + "<<--");
                        memberEmails.add((mail.substring(mail.indexOf(":") + 1, mail.length())).trim());
                   }
            }
            count++;
        }
       //System.out.println("Search returned " + count + " results");
    }
    catch (NamingException e)
    {
        e.printStackTrace();
    }
    ctx.close();
}

编辑: 感谢您的指导,我在获取第二个电子邮件地址时遇到错误

================= Debug Result ===========================
>>>CN=GRP_WF_XXXXNF,OU=DMS
Attribute: member
 0. CN=MAk,OU=HR,DC=xxx,DC=com
Name-->>MAk<<
Searching For :: MAk
ATTRIBUTE Name : mail
ATTRIBUTE Value: mail: mak@xxx.coom
Mail :: -->mak@xxx.coom<--
E-mail :: -->>mak@xxx.coom<<--
ATTRIBUTE Name : sn
ATTRIBUTE Value: sn: SAk
Search returned 1 results
 1. CN=Msi,OU=HR,,DC=xxx,DC=com
end 33
Name-->>Msi<<
Searching For :: Msi
Total members: 1
mak@xxx.coom
exception :: java.lang.NullPointerException
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:307)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:344)
    at javax.naming.directory.InitialDirContext.getURLOrDefaultInitDirCtx(InitialDirContext.java:106)
    at javax.naming.directory.InitialDirContext.search(InitialDirContext.java:267)
    at com.mzec.model.ADModel.doFilterSearch(ADModel.java:388)
    at com.mzec.model.ADModel.fetchGroupMembers(ADModel.java:270)
    at com.mzec.model.ADModel.main(ADModel.java:439)
Problem listing members: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial

388行

NamingEnumeration myInum = ctx.search(searchBase, filter, ctls);

最佳答案

我没有尝试运行你的代码,但如果我正确地计算了你的大括号,那么你将用循环关闭你的 DirContext :

System.out.println("Total members: " + totalResults);
ctx.close();

这也与您发布的输出相对应:

Total members: 1
mak@xxx.coom
exception :: java.lang.NullPointerException

关闭 ctx 后对 ctx 的第一个操作会触发 NullPointerException。您还可以在 doFilterSearch 末尾关闭(相同?)ctx

关于java - 通过在 JAVA 中传递组名从 Active Directory 获取电子邮件地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40100349/

相关文章:

java - 使用 Java 和 Apache POI API 在 word 文档上创建项目符号列表

java - Spring 安全 : how to intercept PageNotFound

java - 在 JavaFX 中实现 Ace 代码编辑器

java - Spring boot application.yml 中的 Spring Kafka SSL 设置

java - 如何在表格中将 URL 显示为可点击的 URL 并允许它们在默认浏览器中打开?

java - 哪些 JVM 不支持直接 java.nio.ByteBuffer?

java - 如何重构此代码并获取数组中所有学生总分的平均值

Java - 可执行 JAR?容易反编译?

java - 更改 for 循环内全局变量的值

java - 操作 ArrayList Java 中的值