我正在尝试使用以下代码获取DL的所有用户。代码按预期工作。但是,我无法为某些用户获取AD用户名。防爆。 o / p的第一行有用户名rkama但不是第二行。这是LDAP数据问题还是以不同的方式获取DL中的用户名/电子邮件地址。
O / P 输入为:CN = Ay \,Ram(rkama),OU = Site-SJN,OU = Accounts_User,DC = corp,DC = XXX,DC = com 输入为:CN = Wang \,Peter(),OU = Site-SJN,OU = Accounts_User,DC = corp,DC = XXX,DC = com
public ArrayList<String> getAllDLs(String dlname) throws NamingException {
ArrayList<String> dls = new ArrayList<String>();
String attributes[] = { "member", "displayName" };
createDLContext();
SearchControls ctrl = new SearchControls();
ctrl.setSearchScope(SearchControls.SUBTREE_SCOPE);
ctrl.setReturningAttributes(attributes);
String search = "(&(objectClass=group)((sAMAccountName="+dlname+"*)))";
NamingEnumeration enumeration = dlContext.search("", search, ctrl);
while (enumeration.hasMoreElements()) {
SearchResult result = (SearchResult) enumeration.next();
System.out.println("Found match & result is : " + result);
NamingEnumeration<?> n2 = result.getAttributes().get("member").getAll();
while (n2 != null && n2.hasMore()) {
String dlList = (String) n2.next();
System.out.println("Entry is : " + dlList);
}
}
dlContext.close();
return dls;
}
答案 0 :(得分:0)
我认为你需要逃避\
角色。看看http://www.rlmueller.net/CharactersEscaped.htm
答案 1 :(得分:0)
member
元素仅包含用户的DN
,此不是帐户的用户名或密码,而是可以放回到帐户的用户名或密码搜索以获取用户信息(包括cn
- 用户名,以及sAMAccountName
- 用户的用户ID。
因此,您需要将dlList
值提供给第二次搜索(干净利落),例如
NamingEnumeration searchResult = dlContext.search("", "(dn={1})", new Object[]{ dlList }, ctrl);
尝试使用像"(&(objectClass=group)((sAMAccountName="+dlname+"*)))"
之类的简单字符串构造搜索会产生问题,因为返回字符串的元素在将其放入搜索之前需要进行转义(例如\
)。