Active directory 搜索筛选器中的LDAP语法是否错误

Active directory 搜索筛选器中的LDAP语法是否错误,active-directory,ldap,ldap-query,Active Directory,Ldap,Ldap Query,这是我第一次尝试在LDAP服务器上查询广告信息。当我尝试查询LDAP服务器时,这里是我尝试检索的内容: 我正在尝试检索countlimit为500条记录的所有活动员工,这些记录的displayname以“sav”开头,有一个电子邮件地址,userAccountControl属性为512。我遇到的问题是,我总共只找回了8张唱片。我应该能找回至少10张唱片 我对搜索中未检索到的两条记录进行了单独搜索,每条记录都有一个电子邮件地址和一个userAccountControl值512。所以我不知道为什么那

这是我第一次尝试在LDAP服务器上查询广告信息。当我尝试查询LDAP服务器时,这里是我尝试检索的内容:

我正在尝试检索countlimit为500条记录的所有活动员工,这些记录的displayname以“sav”开头,有一个电子邮件地址,userAccountControl属性为512。我遇到的问题是,我总共只找回了8张唱片。我应该能找回至少10张唱片

我对搜索中未检索到的两条记录进行了单独搜索,每条记录都有一个电子邮件地址和一个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;
}

您可能混淆了
displayname
属性和
cn
属性

在Windows server上,您有一个名为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中,您还可以测试过滤器

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))"
启动用户和计算机Active Directory:

应注册请求的权利:

选择personalize search,您将有一个用于常见属性的帮助器选项卡:

您可以为技术属性选择个性化选项卡

您可以测试并复制生成的LDAP筛选器(您不需要双精度(&一个就足够了):


您能为两个被排除的用户发布您的userAccountControl、displayName和mail值吗


FWIW如果你在displayName上添加元组索引,中间搜索会运行得更快。

我下载了一个免费的广告工具来查看我需要的所有广告,它告诉我数据不是问题,但我只是没有找到我需要的所有OU,因为我们所有的用户都存储在一个OU中

因此,在谷歌搜索了更多内容后,我在Oracle网站上找到了一个关于LDAP的页面,我将我的LDAPContext更改为DirContext,以便我的连接在目录中进行搜索,并使用此上下文的引用,并将值设置为“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;
}
public List getAutocompleteEmpRecordsList(字符串displayname,DirContext ctx){
List activeEmpAttributes=new ArrayList();
属性attrs=null;
整数计数=0;
int empEmailAddrLen=0;
试一试{
SearchControls约束=新的SearchControls();
限制。设置计数限制(500);
约束.setSearchScope(SearchControls.SUBTREE_范围);
字符串[]attrIDs={“displayname”、“mail”、“userAccountControl”};
约束。设置ReturningAttribute(属性ID);
String searchFilter=“(&(objectClass=user)(displayname=“+displayname.trim()+”*“+”)(mail=*)(userAccountControl=512))”;
NamingEnumeration answer=ctx.search(“DC=xxx,DC=org”,searchFilter,constraints);
如果(回答!=null){
while(answer.hasMore()){
attrs=((SearchResult)answer.next()).getAttributes();
if(attrs.get(“displayname”)!=null){
int-empNameLen=attrs.get(“displayname”).toString().length();
add(attrs.get(“displayname”).toString().substring(13,empNameLen));
}
计数++;
ctx.close();
}
}
否则{
抛出新异常(“无效用户”);
}
System.out.println(“activeEmpAttributes:+activeEmpAttributes”);
System.out.println(“count:+activeEmpAttributes.size());
}捕获(例外情况除外){
例如printStackTrace();
}
返回activeemp属性;
}

无论如何,谢谢。

语法看起来还可以,不过您应该研究search()重载,它使用不同的searchArg,因此您的筛选器可以是
(&(objectClass=user)(displayname={0}*)(mail=*)(userAccountControl=512))
其中{0}指的是第一个searchArg。感谢您花时间回复。但是我发现了我的问题,并在上面为可能遇到相同问题的其他人发布了它。感谢您花时间回复。但是我发现了我的问题,并在上面为可能遇到相同问题的其他人发布了它。