#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», прокомментировав, что проблема устранена, и теперь я получаю список адресов электронной почты, передав имя группы, большое вам спасибо, мистер Халк, это была большая помощь 🙂