IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[Active Directory] méthode FindAll() trop limitée


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Par défaut [Active Directory] méthode FindAll() trop limitée
    Bonjour à tous,

    Je travaille à l'heure actuelle sur une base Active Directory contenant un peu plus de 30000 utilisateurs.
    Je dois arriver à parcourir tous ces utilisateurs afin de leur faire subir des modifications qui peuvent être différentes pour chacun d'entre eux suivant divers critères.

    Mon soucis, est que lorsque j'utilise la méthode FindAll() de mon objet DirectorySearcher, la collection se limite à 7000 objets et pas un de plus... J'ai essayé de regarder du coté des différents paramètres de l'objet pour mieux contrôler sa taille comme l'attribut ".SizeLimit", mais cela ne change rien...

    Voici un résumé de mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DirectorySearcher searcher = new DirectorySearcher(Ldap);
    Int32 total = 0;
    searcher.SizeLimit = 40000;
    SearchResultCollection collection = searcher.FindAll();
    total = collection.Count;
    "total" est toujours égal à 7000.

    Pour information si je fais un filtre de ce genre et que j'additionne les résultats :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     List<String> MaListe = new List<String>();
                MaListe.Add("A");
                ... //MaListe contient toutes les lettres de l'alphabet
                MaListe.Add("Z");
               
                foreach(String lettre in MaListe)
                {
                    searcher.Filter = "(&(objectCategory=user)(SAMAccountName=" + lettre + "*))";
                    SearchResultCollection collection = searcher.FindAll();
    
                    total += collection.Count;
                }
    Dans ce cas, "total" contient bien les 30000 utilisateurs. (le problème de cette solution est que je passe outre tous les login spécifiques qui commencent par des #, !, ...)

    Quelqu'un aurait-il une solution?

    Merci d'avance,

    Rastamath69

  2. #2
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Salut.

    Je ne te propose pas une solution mais plutôt un test : as-tu testé ta requête dans un browser LDAP / AD pour voir ce qu'elle te renvoyait ?

    Dans certains cas, des limites administratives sont placées au niveau des résultats de recherche pour ne pas surcharger les annuaires (en LDAP "pur" en tout cas)...

    Bon courage

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Par défaut
    Salut!

    Non je n'ai pas réalisé ces tests. Je veux bien , mais qu'entends-tu par "browser LDAP / AD"??

    La seule interface que je connaisse pour me balader dans active directory est l'outil d'administration Windows. Mais je ne crois pas qu'il propose de fonctionnalité (en tout cas je n'ai pas trouvé) qui permettent de compter tous les utilisateurs d'un domaine...

    En avais-tu un autre en tête?

    Merci de ta réactivité!

    Rastamath69

  4. #4
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Re.

    J'avoue que je ne connais pas trop le browser AD fourni avec Windows (ou plutôt je ne suis pas habilité à l'utiliser dans mon entreprise ). J'imagine donc que les outils que je te propose font la même chose, mais au cas où ce ne serait pas le cas, tu peux essayer :

    Je te laisse tester

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    327
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 327
    Par défaut
    Bonjour,
    Le problème c'est que c'est un paramètre du serveur active directory qui définie le nombre maximal de résultat à retourné.
    Tu as de la chance que ce soit 7000 par default il est egale a 1000.
    Soit tu changes la valeur de ce parametre. (Voir les administrateur de domaine).
    Sinon tu peux essayer de le faire en plusieurs requête.
    A bientôt

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Par défaut
    Il semble que vous ayez raison tous les deux!

    Je n'ai pas pu le constater avec Softerra LDAP browser, car je ne suis pas arrivé à me connecter sur le domaine sur lequel je voulais aller (malgré les moultes tentatives de configuration que j'ai pu faire)!

    Il faudra que je vois l'administrateur du domaine, mais je doute qu'on puisse augmenter ce fameux paramètre de 7000 à 30000... D'après ce que j'ai compris cela permet au serveur de répondre plus vite lorsqu'il fait l'équivalent d'un Full Scan.

    La solution de réaliser cela en plusieurs requêtes m'intéresse donc, mais comment faire??

    Comme je l'ai cité dans mon premier message, mettre des filtres complémentaires fonctionne, mais comment m'assurer que je couvre tous les caractères possibles?
    Je ne vais pas parcourir une table de caractère construite à partir des codes ascii et faire ensuite des filtres avec chacun des caractères possibles, ça serait quand même moche au niveau programmation...

    Existe-t-il un moyen de demander au serveur qu'il me renvoie toutes les réponses mais sous forme d'ensembles de 7000 objets, pour mon cas?

    Merci!

    Rastamath69

  7. #7
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Citation Envoyé par rastamath69 Voir le message
    Existe-t-il un moyen de demander au serveur qu'il me renvoie toutes les réponses mais sous forme d'ensembles de 7000 objets, pour mon cas?
    Je ne pense pas...

    Tu n'as plus que deux solutions :
    • assure toi auprès de ton administrateur que vous n'ayez pas des AD spécifiques à ce genre de traitement (typiquement un AD pour les batchs qui a des limites administratives énormes)
    • demander à ton admin de modifier le paramétrage de cet annuaire, mais si tu es le seul à le demander, il risque d'être plutôt frileux (enfin après ça dépend du contexte de ta boîte / ton client)

    PS : cependant affiner ta requête avec quelques filtres genre des objectClass comme person ne fera pas de mal à ta requête

    Bonne continuation

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Par défaut
    Salut,

    Pour les filtres effectivement, j'y avais déjà pensé mais cela ne change pas grand chose, car j'ai bien 30000 "users" dans cette base!

    Je passe le sujet en résolu, car on dirait qu'on en a fait le tour.
    En résumé, il va
    soit falloir que j'arrive à convaincre l'admin d'augmenter la limite du nombre de réponses (mais ce sera faisable suivant les impacts que cela peut avoir)
    soit que je fasse ce que je ne voulais pas faire, trouver des filtres qui soient complémentaires entre eux et qui puissent me remonter toutes ma population sans en oublier (à part la chose barbare de parcourir une table de caractère et de faire un filtre pour chaque, je ne voit vraiment pas d'autres solutions...).

    Merci à tous les deux. J'aurais en tout cas appris quelque chose dans le paramétrage d'un serveur Active Directory!

    @++

    Rastamath69

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Par défaut
    I'm back!

    Simple remarque à ajouter à cette discussion, à savoir que j'ai trouvé ma solution il y a quelques jours, sans pour autant faire une quelconque demande à l'administrateur Active Directory.

    J'étais sur la bonne piste 5 mois auparavant, mais passer le paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    searcher.SizeLimit = 40000;
    ne suffit pas, il fallait également indiquer le paramètre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    searcher.PageSize = 40000;
    On pourra trouver plus de détails ici:
    http://msdn.microsoft.com/fr-fr/libr...sizelimit.aspx

    Voila, avec ça plus de souci! Je peux enfin faire des requêtes LDAP simple sans avoir besoin de filtre!

    J'espère que cela pourra servir à d'autres personnes!

    Rastamath69

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Par défaut
    Le retour!

    Etant devenu à présent un des administrateurs de la base Active Directory là où je travaille, je n'ai cessé de faire des découvertes!!

    Ce post commence à dater, mais je tenais quand même à apporter cette précision:

    Le paramètre PageSize que j'indiquais permet effectivement de gonfler le nombre de résultat qu'on peut obtenir mais SEULEMENT pour la session en cours (celle ouverte sur l'AD via le code!).

    Pour que cette modification soit prise en compte par tous les clients (quel qu'il soit) il faut aller modifier un paramètre qui se trouve ici (j'indique le distinguishedName) :

    "CN=Default Query Policy,CN=Query-Policies,CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,DC=monDomaine,DC=fr"
    et qui s'appelle MaxPageSize dont la valeur par défaut est effectivement : 1000. (pour ma part elle se trouvait à 7000)

    On trouvera plus d'information ici:
    http://support.microsoft.com/kb/315071

    En espérant que ce surplus d'informations puisse aider, un jour, quelqu'un!

    Rastamath69

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. méthode ADsGetObject (active directory)
    Par czezko dans le forum Delphi
    Réponses: 6
    Dernier message: 05/04/2007, 14h07
  2. [C#] Active directory LDAP
    Par Gauden dans le forum Windows Forms
    Réponses: 9
    Dernier message: 02/05/2005, 13h57
  3. [AD]Mise en place de Active Directory
    Par guiguisi dans le forum Windows Serveur
    Réponses: 9
    Dernier message: 29/07/2004, 08h50
  4. Réponses: 4
    Dernier message: 17/05/2004, 09h57
  5. Active directory
    Par m.schar dans le forum Développement
    Réponses: 5
    Dernier message: 22/03/2004, 10h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo