2015-12-16 79 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

相關問題