c # Services Active Directory findAll () ne renvoie que 1 000 entrées

Dupliquer possible:
Puis-je obtenir plus de 1000 enregistrements d’un DirectorySearcher dans Asp.Net?

Je recherche des connexions existantes à l’aide de la méthode findAll () du chercheur d’annuaire ADS (comme dans le code suivant). Il semble que la méthode findall ne retourne que 1 000 entrées bien qu’il y ait plus d’entrées que cela. Comment trouver tout () de chaque connexion?

IList adslist = new List(); using (DirectoryEntry de = new DirectoryEntry("LDAP://armlink.com", null, null, AuthenticationTypes.Secure)) using (DirectorySearcher ds = new DirectorySearcher(de, "(objectclass=user)", new ssortingng[] { "samaccountname" })) foreach (SearchResult sr in ds.FindAll()) { ssortingng[] e = sr.Path.Split(new ssortingng[] { "LDAP://", "OU=", ",", "DC=", ".com", "/CN=" }, SsortingngSplitOptions.RemoveEmptyEnsortinges); ResultPropertyCollection pc = sr.Properties; adslist.Add(e[0] + "/" + pc["samaccountname"][0].ToSsortingng()); // Debug.WriteLine(adslist.Last()); } 

Cela est dû à une limite côté serveur. Dans la documentation DirectorySearcher.SizeLimit :

Nombre maximal d’objects renvoyés par le serveur lors d’une recherche. La valeur par défaut est zéro, ce qui signifie que vous utilisez la limite de taille par défaut définie par le serveur de 1000 entrées.

Et:

Si vous définissez SizeLimit sur une valeur supérieure à la valeur par défaut de 1 000 entrées définie par le serveur, la valeur par défaut définie par le serveur est utilisée.

En gros, à partir de là, il semble qu’à moins qu’il y ait un moyen de changer la valeur par défaut côté serveur, vous serez limité à 1 000 entrées. Il est possible que spécifier une PageSize vous permette d’ PageSize un certain nombre à la fois, avec un total supérieur à 1 000 … pas sûr.

À propos, il semble que vous devriez également avoir une directive using autour de SearchResultCollection :

 using (SearchResultCollection results = ds.FindAll()) { foreach (SearchResult sr in results) { ... } } 

Il existe deux manières de contourner cette limitation – consultez la documentation MSDN sur DirectorySearcher pour plus de détails:

  • définissez la propriété DirectorySearcher.SizeLimit sur la valeur dont vous avez besoin – le nombre d’entrées indiqué sera renvoyé dans une recherche unique; Toutefois, vous ne pouvez pas obtenir plus que la limite du serveur (valeur par défaut: 1 000 entrées) en une seule opération. Toutefois, cette limitation est une option configurable. Vous pouvez la définir plus élevée, puis la limite de taille de votre chercheur d’annuaire plus élevée. mais plus vous souhaitez renvoyer d’entrées simultanément, plus votre appel sera long!

  • définissez DirectorySearcher.PageSize sur une valeur, par exemple 250 ou plus, pour effectuer des “recherches paginées”, par exemple, vous récupérez 250 entrées en une seule opération, et si vous effectuez une itération sur la 251e entrée, le chercheur de répertoire revient (en une seconde) , troisième, quasortingème appel) pour obtenir 250 entrées supplémentaires. C’est généralement la meilleure option car vous récupérez rapidement ce nombre d’entrées, mais vous pouvez continuer à rechercher d’autres entrées si nécessaire.

Le moyen préféré pour gérer les situations dans lesquelles vous avez besoin de plus que ces 1 000 entrées est certainement les recherches paginées – voir la documentation MSDN:

Une fois que le serveur a trouvé le nombre d’objects spécifiés par la propriété PageSize, la recherche s’arrête et les résultats sont renvoyés au client. Lorsque le client demande plus de données, le serveur redémarre la recherche là où elle s’était arrêtée.