Sie müssen DirectorySearcher.PageSize auf einen Wert ungleich Null setzen, um alle Ergebnisse zu erhalten.
Übrigens sollten Sie DirectorySearcher auch entsorgen, wenn Sie damit fertig sind
using(var srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps))
{
srch.PageSize = 1000;
var results = srch.FindAll();
}
Die API-Dokumentation ist nicht sehr klar, aber im Wesentlichen:
Wenn Sie eine ausgelagerte Suche durchführen, wird das SizeLimit ignoriert und alle übereinstimmenden Ergebnisse werden zurückgegeben, während Sie die von FindAll zurückgegebenen Ergebnisse durchlaufen. Die Ergebnisse werden seitenweise vom Server abgerufen. Ich habe oben den Wert 1000 gewählt, aber Sie können einen kleineren Wert verwenden, wenn Sie dies bevorzugen. Der Nachteil ist: Die Verwendung einer kleinen PageSize gibt jede Ergebnisseite schneller zurück, erfordert jedoch häufigere Aufrufe des Servers, wenn über eine große Anzahl von Ergebnissen iteriert wird.
Standardmäßig wird die Suche nicht ausgelagert (PageSize = 0). In diesem Fall werden bis zu SizeLimit-Ergebnisse zurückgegeben.
Wie Biri betonte, ist es wichtig, die von FindAll zurückgegebene SearchResultCollection zu entsorgen, da sonst möglicherweise ein Speicherverlust auftritt, wie im Abschnitt "Anmerkungen" der MSDN-Dokumentation für DirectorySearcher.FindAll beschrieben .
Eine Möglichkeit, dies in .NET 2.0 oder höher zu vermeiden, besteht darin, eine Wrapper-Methode zu schreiben, die die SearchResultCollection automatisch verfügbar macht. Dies könnte ungefähr so aussehen (oder eine Erweiterungsmethode in .NET 3.5 sein):
public IEnumerable<SearchResult> SafeFindAll(DirectorySearcher searcher)
{
using(SearchResultCollection results = searcher.FindAll())
{
foreach (SearchResult result in results)
{
yield return result;
}
}
}
Sie können dies dann wie folgt verwenden:
using(var srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps))
{
srch.PageSize = 1000;
var results = SafeFindAll(srch);
}
using
UrsachenDispose()
, die aufgerufen werden müssen, selbst wenn es eine Ausnahme gab (verwendet einenfinally
Block [ docs.microsoft.com/en-us/dotnet/csharp/language-reference/… tun Sie dies))PrincipalSearcher
zugrunde liegender Wert verwendet wirdDirectorySearcher
. Es zählt einfach weiter die Ergebnisse auf. Vielleicht die Serverseite oderPrincipalSearcher
überschreibt dies irgendwie ...PrincipalSearcher
das Standardverhalten überschrieben wird, insbesondere da die EigenschaftenPageSize
und nicht verfügbar gemachtSizeLimit
werden. Sie könnten dies wahrscheinlich bestätigen, indem Sie dieDirectorySearcher
zurückgegebene by-PrincipalSearcher.GetUnderlyingSearcher
Methode untersuchen, um festzustellen, wie sie konfiguriert wurde.