Получить адреса электронной почты из Active Directory, передав имя группы в JAVA

#java

#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 = "(amp;(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 = "(amp;(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);
  

Комментарии:

1. Может кто-нибудь объяснить, почему я получил «-1»??

2. Я проголосовал против, потому что вы не объяснили, что вы пробовали до сих пор. Вы пробовали раскомментировать все эти println файлы и проанализировали результат? Вы запускали его в отладчике, чтобы посмотреть, что он делает? Какой аспект приведенного выше кода вам неясен?

3. Спасибо Hulk за ваше руководство, я получаю сообщение об ошибке, когда он получает второй результат отладки адреса электронной почты в EDIT

4. Я также проверил с разными группами, что он всегда выдает ошибку для второго участника, для первого участника я получаю адрес электронной почты

5. Строка 388 — это NamingEnumeration myInum = ctx.search(база поиска, фильтр, ctls); также обновлено в вопросе редактировать

Ответ №1:

Я не пытался запустить ваш код, но если я правильно посчитал ваши фигурные скобки, вы закрываете свой DirContext с помощью цикла:

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

Это также соответствует опубликованным вами выводам:

Всего участников: 1
mak@xxx.coom
исключение :: java.lang.Исключение NullPointerException

Первая операция ctx после ее закрытия запускает NullPointerException . Вы также закрываете (то же самое?) ctx в конце вашего doFilterSearch .

Комментарии:

1. Спасибо, я получил ctx.close (); в конце процедуры «doFilterSearch», прокомментировав, что проблема устранена, и теперь я получаю список адресов электронной почты, передав имя группы, большое вам спасибо, мистер Халк, это была большая помощь 🙂