2015-12-16 50 views
1

我试图从Active Directory中每用户拉。我目前正在使用这种方法:LDAP搜索返回的对象数量比预期的少

 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() 
       }); 
      } 
     } 

这只是给我约3/4的名字我期待的givnig。这是一个让我出来....所以我就好奇,并增加了一个新的过滤器,看看我是否可以通过改变滤波器这个把自己拉:

search.Filter = "(&(objectClass=user)(sn=za*))"; 

这的确在拉我的正确,我基本上强迫它通过设置筛选器来搜索每个以za开头的姓氏。但为什么我使用的第一个搜索过滤器并没有吸引所有的用户呢?

+0

它返回了多少用户?你说3/4,但它是否返回一个确切的数字,如100,500,1000等?对于返回的结果可能存在服务器端限制。此外,由于您只查找具有'mail'和'displayName'的用户,为什么不将它们添加到ldap筛选器中呢?效率更高。 –

+0

它正在返回644,从我已经读取的服务器端限制是1000 – Code

回答

1

为什么我使用的第一个搜索筛选器没有吸引所有用户?

很有可能是因为SizeLimit以1000条记录开始。设置PageSize以启用结果分页。

.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() 
     }); 
    } 
} 
  1. 小页面尺寸=更快的结果,但更多的服务器往返,较大的页大小=慢的结果,但往返更少的服务器。选择一个适合你的价值。
  2. 您必须手动处理SearchResultCollection,请参阅the MSDN documentation of DirectorySearcher.FindAll()中的“备注”。一个using块将正确处理该对象。
+0

谢谢。这是完全合理的,很好的解释。 – Code

相关问题