2012-06-21 2 views
1

Я получаю пользователь деталь из активного каталога, используя следующий кодКак получить более 20000 записей из Active Directory

DirectoryEntry Entry = new DirectoryEntry("LDAP://dc=" + Domainname + ",dc=directoryname,dc=com", username, password, AuthenticationTypes.Secure); 

DirectorySearcher DS = new DirectorySearcher(Entry); 
List<string> lstPath = new List<string>(); 
DS.Filter = "(sAMAccountName=*)"; 
//DS.Filter = "(sAMAccountName=umbarglp)"; 
//DS.Filter = "(sAMAccountName=Adminumbarglp)"; 

SearchResultCollection ResultsCollection = DS.FindAll(); 

В этом коде я получаю обратно только 20000 записей не больше, чем это. Что мне нужно, чтобы получить все записи AD.

Заранее спасибо. Eshwer

+0

Зачем вам требуется более 20 тыс. записей из AD? ... Я поражен тем, что AD хранит много записей и что нет эффективных инструментов для работы с ним, поэтому я предполагаю, что вы пишете такой замечательный инструмент. – jcolebrand

+1

Попробуйте установить параметр PageSize в экземпляре DirectorySearcher. – Martin

+1

@marc_s Мне нужно получить все записи человека, который является требованием клиента, а это не моя личная проблема. – Eshwer

ответ

1

Проблема заключается в том, что максимальные возвращенные записи никогда не превышают максимально настроенные на сервере (см. Документацию SizeLimit). Если это возможно, чтобы еще больше увеличить эту сумму, которая будет самым быстрым решением, (хотя, возможно, нецелесообразной в случае других программ также быть в состоянии получить больше записей и вызывая перегрузок)

редактировать Из любопытства я хотел чтобы проверить, как это можно сделать, читая куски, это работает:

 DS.SizeLimit = 10; //set small for testing, change before production ;)    
     DS.Filter = "(sAMAccountName=*)";    
     var list = new List<SearchResult>(); 

     SearchResultCollection res; 
     while ((res = DS.FindAll()).Count > 0) 
     { 
      list.AddRange(res.Cast<SearchResult>());  
      var last = list[list.Count - 1].GetDirectoryEntry().InvokeGet("sAMAccountName").ToString() 
       + "0"; // <- small cheat to prevent doubles because the search does not support > , but does support >= 
      DS.Filter = "(sAMAccountName>=" + last + ")"; 
     } 
+1

Из любопытства я хотел проверить, как это можно сделать, читая куски, добавив фрагмент кода для этого курса. –

Смежные вопросы