Ldap在分发列表中获取用户

时间:2014-07-14 23:20:06

标签: java ldap

我正在尝试使用以下代码获取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;
}

2 个答案:

答案 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+"*)))"之类的简单字符串构造搜索会产生问题,因为返回字符串的元素在将其放入搜索之前需要进行转义(例如\)。