我的LDAP语法在搜索过滤器中是否有误

时间:2011-10-19 23:32:29

标签: active-directory ldap ldap-query

这是我第一次尝试查询LDAP服务器的AD信息。当我尝试查询LDAP服务器时,我正在尝试检索:

我正在尝试检索所有活动员工的计数限制为500条记录,其显示名称以“sav”开头,具有电子邮件地址且userAccountControl属性为512.我遇到的问题是我只是得到了共有8条记录。我应该至少回到10条记录。

我对我在搜索中未检索到的2条记录进行了单独搜索,每条记录都有一个电子邮件地址和userAccountControl值为512.所以我不确定为什么这两条记录丢失了。

我确信我的语法错误,但我找不到它是什么。任何帮助/方向将不胜感激。谢谢。

谷歌搜索后我将搜索过滤器定义为:

String searchFilter = "(&(objectClass=user)(displayname="+displayname+"*"+")(mail=*)(userAccountControl=512))";

请参阅下面的完整方法:

public List<String> getAutocompleteEmpRecordsList(String displayname, LdapContext ctx) {
    List<String> activeEmpAttributes = new ArrayList<String>();
    Attributes attrs = null;
    int count = 0;
    int empEmailAddrLen = 0;
    try {
        SearchControls constraints = new SearchControls();
        constraints.setCountLimit(500);          
        constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
        String[] attrIDs = {"displayname", "mail", "userAccountControl"};
        constraints.setReturningAttributes(attrIDs);
        String searchFilter = "(&(objectClass=user)(displayname="+displayname+"*"+")(mail=*)(userAccountControl=512))";
        NamingEnumeration answer = ctx.search("OU=Standard,OU=Users,DC=xxx,DC=org", searchFilter, constraints);
        if (answer != null) {
            while (answer.hasMore()) {
                attrs = ((SearchResult) answer.next()).getAttributes();
                if (attrs.get("displayname") != null) {
                    int empNameLen = attrs.get("displayname").toString().length();
                    activeEmpAttributes.add(attrs.get("displayname").toString().substring(13, empNameLen));
                }
                count++;
                ctx.close();
            }
        }
        else {
            throw new Exception("Invalid User");
        }
        System.out.println("activeEmpAttributes: " + activeEmpAttributes);
        System.out.println("count: " + activeEmpAttributes.size());
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return activeEmpAttributes;
}

3 个答案:

答案 0 :(得分:0)

您可能会混淆displayname属性和cn属性。

在Windows服务器上,您有一个名为LDIDIFDE.EXE的命令行工具,可以让您测试过滤器。

ldifde -f datas.ldf -d "OU=Standard,OU=THR Users,DC=txhealth,DC=org" -r "(&(objectClass=user)(displayname=sav*)(mail=*)(userAccountControl=512))"
ldifde -f datas.ldf -d "OU=Standard,OU=THR Users,DC=txhealth,DC=org" -r "(&(objectClass=user)(cn=sav*)(mail=*)(userAccountControl=512))"

在用户和计算机MMC中,您还可以测试过滤器。

启动用户和计算机Active-Directory:

User and computer Active-Directory

正确的登记要求:

New request

选择个性化搜索,您有一个常用属性的帮助选项卡:

helper tab for common attributes

您可以选择技术属性的个性化标签

personalized tab for technical attributes

您可以测试复制生成的LDAP过滤器(您不需要双(& 一个就足够了):

Resulting LDAP filter

答案 1 :(得分:0)

您可以为两个被排除的用户发布userAccountControl,displayName和mail值吗?

FWIW如果向其添加元组索引,displayName上的内侧搜索会运行得更快。

答案 2 :(得分:0)

我下载了一个免费的AD工具来查看我需要的AD中的所有内容,它向我显示数据不是问题,但我只是没有点击我需要的所有OU,因为我们不仅仅有1个OU用户存储。

因此,在谷歌上搜索了一些后,我在Oracle网站上发现了一个关于LDAP的页面,我将我的LDAPContext更改为DirContext,以便在目录中进行搜索以及使用此上下文的REFERRAL并将值设置为“follow”避免PartialSearchException。

我以为我会发布我的发现,以防其他一些新手遇到同样的问题。

如果您发现我所做的更改存在缺点,请告诉我们。问候。

这是我更正后的代码:

public List<String> getAutocompleteEmpRecordsList(String displayname, DirContext ctx) {
    List<String> activeEmpAttributes = new ArrayList<String>();
    Attributes attrs = null;
    int count = 0;
    int empEmailAddrLen = 0;
    try {
        SearchControls constraints = new SearchControls();
        constraints.setCountLimit(500); 
        constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
        String[] attrIDs = {"displayname", "mail", "userAccountControl"};
        constraints.setReturningAttributes(attrIDs);
        String searchFilter = "(&(objectClass=user)(displayname="+displayname.trim()+"*"+")(mail=*)(userAccountControl=512))";
        NamingEnumeration answer = ctx.search("DC=xxx,DC=org", searchFilter, constraints);
        if (answer != null) {
            while (answer.hasMore()) {
                attrs = ((SearchResult) answer.next()).getAttributes();
                if (attrs.get("displayname") != null) {
                    int empNameLen = attrs.get("displayname").toString().length();
                    activeEmpAttributes.add(attrs.get("displayname").toString().substring(13, empNameLen));
                }
                count++;
                ctx.close();
            }
        }
        else {
            throw new Exception("Invalid User");
        }
        System.out.println("activeEmpAttributes: " + activeEmpAttributes);
        System.out.println("count: " + activeEmpAttributes.size());
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return activeEmpAttributes;
}

非常感谢。