Question

Je viens de remarquer que la liste des résultats renvoyés est limitée à 1 000. J'ai plus de 1 000 groupes dans mon domaine (domaine ÉNORME). Comment puis-je obtenir plus de 1000 enregistrements? Puis-je commencer à un disque plus tard? Puis-je le découper en plusieurs recherches?

Voici ma requête:

DirectoryEntry dirEnt = new DirectoryEntry("LDAP://dhuba1kwtn004");
string[] loadProps = new string[] { "cn", "samaccountname", "name", "distinguishedname" };
DirectorySearcher srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps);
var results = srch.FindAll();

J'ai essayé de définir srch.SizeLimit = 2000; , mais cela ne semble pas fonctionner. Des idées?

Était-ce utile?

La solution

Vous devez définir DirectorySearcher.PageSize sur une valeur autre que zéro pour obtenir tous les résultats.

BTW, vous devez également disposer de DirectorySearcher lorsque vous en avez terminé avec ce dernier

using(var srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps))
{
    srch.PageSize = 1000;
    var results = srch.FindAll();
}

La documentation de l'API n'est pas très claire, mais essentiellement:

  • lorsque vous effectuez une recherche paginée, SizeLimit est ignoré et tous les résultats correspondants sont renvoyés lorsque vous parcourez les résultats renvoyés par FindAll. Les résultats seront extraits du serveur page par page. J'ai choisi la valeur de 1000 ci-dessus, mais vous pouvez utiliser une valeur plus petite si vous le souhaitez. Le compromis est le suivant: utiliser une petite taille page Page renverra chaque page de résultats plus rapidement, mais nécessitera des appels plus fréquents au serveur lors de l'itération d'un grand nombre de résultats.

  • par défaut, la recherche n'est pas paginée (PageSize = 0). Dans ce cas, les résultats sont renvoyés jusqu'à SizeLimit.

Comme l'a souligné Biri, il est important de disposer de la propriété SearchResultCollection renvoyée par FindAll, sinon vous risquez d'avoir une fuite de mémoire , comme indiqué dans la section Remarques de la documentation MSDN pour DirectorySearcher.FindAll .

Un moyen d'éviter ce problème dans .NET 2.0 ou version ultérieure consiste à écrire une méthode d'encapsulation qui supprime automatiquement SearchResultCollection. Cela pourrait ressembler au suivant (ou être une méthode d’extension dans .NET 3.5):

public IEnumerable<SearchResult> SafeFindAll(DirectorySearcher searcher)
{
    using(SearchResultCollection results = searcher.FindAll())
    {
        foreach (SearchResult result in results)
        {
            yield return result;        
        } 
    } // SearchResultCollection will be disposed here
}

Vous pouvez ensuite l'utiliser comme suit:

using(var srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps))
{
    srch.PageSize = 1000;
    var results = SafeFindAll(srch);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top