C# LDAP搜索返回的对象少于预期

C# LDAP搜索返回的对象少于预期,c#,active-directory,ldap,ldap-query,C#,Active Directory,Ldap,Ldap Query,我正在尝试从Active Directory中提取每个用户。我目前正在使用此方法: DirectorySearcher search = new DirectorySearcher(); search.Filter = "(objectClass=user)"; foreach (SearchResult result in search.FindAll()) { if(result.

我正在尝试从Active Directory中提取每个用户。我目前正在使用此方法:

        DirectorySearcher search = new DirectorySearcher();            
        search.Filter = "(objectClass=user)";
        foreach (SearchResult result in search.FindAll())
        {
            if(result.Properties["mail"].Count > 0 && result.Properties["displayName"].Count > 0)
            {
                emailAddresses.Add(new EmailDetails
                {
                    EmailAddress = result.Properties["mail"][0].ToString(),
                    EmailDisplayName = result.Properties["displayName"][0].ToString()
                });
            }
         }
这仅仅是我期望的名字的三分之四。这是为了一个不把我放在外面的人。。。。因此,我很好奇,添加了一个新的过滤器,看看是否可以通过将过滤器更改为以下方式来拉动自己:

search.Filter = "(&(objectClass=user)(sn=za*))";
事实上,这确实正确地将我拉了进来,我基本上是通过设置过滤器来搜索以
za
开头的每个姓氏来迫使它拉我进来。但是为什么我使用的第一个搜索过滤器并没有吸引所有的用户呢

为什么我使用的第一个搜索过滤器没有把所有用户都拉进来

最有可能是因为有1000条记录。设置以启用结果分页

在没有过滤器的情况下执行
.FindAll()
,然后在客户端上过滤结果是愚蠢的。写一个合适的过滤器

var search = new DirectorySearcher();            
search.Filter = "(&(objectClass=user)(mail=*)(displayName=*))";
search.PageSize = 1000;  // see 1.

using (var results = searcher.FindAll()) {  // see 2.
    foreach (var result in results)
    {
        emailAddresses.Add(new EmailDetails
        {
            EmailAddress = result.Properties["mail"][0].ToString(),
            EmailDisplayName = result.Properties["displayName"][0].ToString()
        });
    }
}
  • 页面大小越小=结果越快,但服务器往返次数越多;页面大小越大=结果越慢,但服务器往返次数越少。选择一个适合您的值
  • 您必须手动处理
    SearchResultCollection
    ,请参阅中的“备注”。使用
    块的
    将正确处理对象

  • 它返回了多少用户?你说的是3/4,但它是否返回一个精确的数字,比如100、500、1000等等。?返回的结果可能有服务器端限制。另外,由于您只查找具有
    mail
    displayName
    的用户,为什么不首先将这些用户添加到ldap筛选器中?效率更高。它返回644,据我所知,服务器端限制为1000。谢谢。这完全有道理,解释得很好。