2011-07-17 5 views
8

używam tego kodu:Jeśli jednostka organizacyjna zawiera 3000 użytkowników, jak korzystać z usługi DirectorySearcher, aby znaleźć wszystkie z nich?

DirectoryEntry objEntry; 
DirectorySearcher objSearchEntry; 
SearchResultCollection objSearchResult; 
string strFilter = "(&(objectCategory=User))"; 
objEntry = new DirectoryEntry(conOUPath, conUser, conPwd, AuthenticationTypes.Secure); 
objEntry.RefreshCache(); 
objSearchEntry = new DirectorySearcher(objEntry); 
objSearchEntry.Filter=strFilter; 
objSearchEntry.SearchScope=SearchScope.Subtree; 
objSearchEntry.CacheResults=false; 
objSearchResult=objSearchEntry.FindAll(); 

Za każdym razem, to tylko powrót 1000 użytkowników, ale istnieje 3000 użytkownicy w tej jednostce organizacyjnej.

Jak mogę je wszystkie znaleźć?

Odpowiedz

9

Jeśli jesteś na .NET 3.5 lub nowszy, należy sprawdź PrincipalSearcher i „query-przez-przykład” główny zrobić swoją wyboru:

// create your domain context 
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN", "OU=SomeOU,DC=YourCompany,DC=com"); 

// define a "query-by-example" principal - here, we search for a UserPrincipal 
// and with the first name (GivenName) of "Bruce" 
UserPrincipal qbeUser = new UserPrincipal(ctx); 
qbeUser.GivenName = "Bruce"; 

// create your principal searcher passing in the QBE principal  
PrincipalSearcher srch = new PrincipalSearcher(qbeUser); 

// set the PageSize on the underlying DirectorySearcher to get all 3000 entries 
((DirectorySearcher)srch.GetUnderlyingSearcher()).PageSize = 500; 

// find all matches 
foreach(var found in srch.FindAll()) 
{ 
    // do whatever here - "found" is of type "Principal" - it could be user, group, computer.....   
} 

Jeśli nie już - absolutnie przeczytać artykuł MSDN Managing Directory Security Principals in the .NET Framework 3.5 który pokazuje ładnie, jak zrobić najlepszą używania nowe funkcje w System.DirectoryServices.AccountManagement

Aktualizacja:

Oczywiście, w zależności od potrzeb, można określić inne właściwości tego użytkownika głównego „Zapytanie przez przykład” tworzyć:

  • Surname (lub ostatni nazwa)
  • DisplayName (typowo: imię + spacja + nazwisko)
  • SAM Account Name - imię i nazwisko Okna konto/AD
  • User Principal Name - Twój „[email protected]” nazwa stylu

Możesz określić którąkolwiek z właściwości na UserPrincipal i wykorzystywać je jako „zapytaniu przez przykład” dla PrincipalSearcher.

Aktualizacja # 2: Jeśli chcesz wyszukać tylko wewnątrz danej jednostki organizacyjnej, można określić, że OU w konstruktora PrincipalContext.

+0

ale chcę filtrować według OU i uzyskać wynik wszystkich typów jest użytkownikiem w tym OU, tutaj nie ma słowa kluczowego do wyszukiwania – cciikk

+0

To jest fajne, dziękuję! – cciikk

+0

@cciikk: zobacz moją aktualizację - możesz ograniczyć wyszukiwanie do określonego kontenera, definiując go w konstruktorze 'PrincipalContext' –

6

Musisz ustawić DirectorySearcher.PageSize property, aby móc zwrócić wszystkie wyniki. Na przykład:

objSearchEntry.PageSize = 500; 

W przeciwnym razie liczba zwróconych przedmiotów będzie ograniczona limitem po stronie serwera, który domyślnie wynosi 1000. Istnieje również coś o nazwie SizeLimit, którą możesz ustawić, jeśli chcesz jawnie ograniczyć liczbę zwracanych elementów. Jeśli zarówno SizeLimit, jak i PageSize są równe 0 (wartości domyślne), wówczas będą używać domyślnej wartości SizeLimit po stronie serwera. Nieco intuicyjne w mojej opinii.

Jeśli chcesz powrócić wszystkie wyniki, jedynym sposobem jest ustawienie pageSize z niezerową wartością i SizeLimit 0.

+0

zwraca wszystkich użytkowników w AD, czy może filtrować według objectGUID jednostki organizacyjnej? – cciikk

+0

Następnie należy powiązać DirectorySearcher z DirectoryEntry, który jest jednostką OU, którą chcesz. tzn. obiekt objEntry powinien być jednostką organizacyjną, do której użytkownik ma prowadzić wyszukiwanie. –