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 :

Traitement LDAP trop long!


Sujet :

C#

  1. #1
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Billets dans le blog
    5
    Par défaut Traitement LDAP trop long!
    Bonjour,

    Je souhaite récupérer à l'aide d'un web service le nom et prénom de tous les utilisateurs de mon AD qui correspondent à une OU spécifique et qui on un email et un employeeID.

    Voici le code que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    [WebMethod]
            public ADUser[] GetUser()
            {
                List<ADUser> adUserList = new List<ADUser>();
                try
                {
                    DirectoryEntry ldap = new DirectoryEntry(ConfigurationSettings.AppSettings["LdapUrl"], ConfigurationSettings.AppSettings["LdapLogin"], ConfigurationSettings.AppSettings["LdapPwd"]);
                    DirectorySearcher searcher = new DirectorySearcher(ldap);
                    searcher.Filter = "(&(objectClass=user)(mail=*)(employeeID=*))";
                    SearchResultCollection AdUsers = searcher.FindAll();
                    foreach (SearchResult result in AdUsers)
                    {
                        DirectoryEntry DirEntry = result.GetDirectoryEntry();
                        ADUser user = new ADUser(DirEntry.Properties["cn"].Value.ToString());
                        adUserList.Add(user);
                    }
                    adUserList.Sort();
                }
                catch (Exception ex)
                {
                    adUserList.Add(new ADUser(ex.Message));
                }
                return adUserList.ToArray();
            }
    Voici mon LDAP URL dans le web.config :
    <add key="LdapUrl" value="LDAP://OU=SousOu,OU=ouPrincipal,DC=dc1,DC=dc2,DC=dc3"/>
    Ce code fonctionne parfaitement, pas le moindre problème , en revanche, il met environ 15 secondes avant de me donner un résultat.
    Je souhaites donc savoir s'il est possible d'améliorer mon traitement pour que celui-ci soit plus rapide.

    Je suis preneur de toute optimisation.
    Merci par avance.
    Aide les autres...
    Et les autres t'aideront....
    Mon site DVP
    N'oubliez pas de consulter les FAQ SharePoint et les cours et tutoriels SharePoint

    N'oubliez pas de voter pour les messages dont la réponse est pertinente

  2. #2
    Membre Expert Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Par défaut
    Si le temps de 15s est consommé à 99% au niveau de
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    SearchResultCollection AdUsers = searcher.FindAll()
    je ne vois pas trop ce qui peut-être fait, excepté optimisé la requête... mais en LDAP ce n'est pas vraiment facile à faire à ma connaissance !

  3. #3
    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.

    Peux-tu effectuer le test suivant : dans un browser LDAP (Softerra, Apache Directory Studio, etc.), positionne toi sur ton OU et fait une recherche avec le même filtre. Obtiens-tu une différence de performance ?

    Parce que là, comme Er3van, ton code il me semble correct. Après peut-être voir du côté du paramétrage de ton AD.

  4. #4
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Billets dans le blog
    5
    Par défaut
    J'en suis arrivé à la même conclusion...
    Mais est ce que si je passe par une autre méthode de tri que celle par défault, n'est il pas possible de gagner du temps?
    Aide les autres...
    Et les autres t'aideront....
    Mon site DVP
    N'oubliez pas de consulter les FAQ SharePoint et les cours et tutoriels SharePoint

    N'oubliez pas de voter pour les messages dont la réponse est pertinente

  5. #5
    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
    Et en terme de volumétrie, ta requête est censée te renvoyer combien de users ?

  6. #6
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Par défaut
    Les perf sont généralement liées à beaucoup de paramètres :

    1. La ram de ton poste client
    2. La fréquence de processeur du client
    3. L'espace disque système
    4. La vitesse de ta carte réseau
    5. La vitesse de ton réseau
    6. La capacité du disque du serveur LDAP
    7. La capacité de la ram sur le serveur LDAP

    Il faut commencer par trouver le goulot d'étranglement.

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  7. #7
    Membre Expert Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Par défaut
    Une simple remarque :

    (&(objectClass=user)(mail=*)(employeeID=*))

    On est d'accord que tu veux tous les users ayant un employeeID et une adresse mail (sous entendu non nuls).

    Est-ce que tu ne pourrais pas affiner ta recherche en partant d'une racine spécifique ? J'imagine qu'une des branches doit contenir des comptes/groupes et donc pas d'user.

    Pas sûr qu'il y ait un gain si tu dois chercher dans "toutes les branches sauf une" ceci dit...

  8. #8
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par _Max_ Voir le message
    Salut.

    Peux-tu effectuer le test suivant : dans un browser LDAP (Softerra, Apache Directory Studio, etc.), positionne toi sur ton OU et fait une recherche avec le même filtre. Obtiens-tu une différence de performance ?
    Non malheureusement pas d'amélioration de ce coté là...

    Citation Envoyé par _Max_ Voir le message
    Et en terme de volumétrie, ta requête est censée te renvoyer combien de users ?
    Entre 600 et 800 users, pour le moment.

    Citation Envoyé par WOLO Laurent Voir le message
    Les perf sont généralement liées à beaucoup de paramètres :

    1. La ram de ton poste client
    2. La fréquence de processeur du client
    3. ...

    Il faut commencer par trouver le goulot d'étranglement.
    Malheureusement, je n'ai pas de moyen de maitriser cela. Le webService doit pouvoir être appelé depuis n'importe quel pc du réseau, avec des configurations assez différentes et pas des machines de guerre. Il me semblais que le webservice s'exécutait uniquement sur le serveur et que le client ne faisait que le consommer... non?
    Citation Envoyé par Er3van Voir le message
    Une simple remarque :

    (&(objectClass=user)(mail=*)(employeeID=*))

    On est d'accord que tu veux tous les users ayant un employeeID et une adresse mail (sous entendu non nuls).
    Tout à fait !
    Citation Envoyé par Er3van Voir le message
    Est-ce que tu ne pourrais pas affiner ta recherche en partant d'une racine spécifique ? J'imagine qu'une des branches doit contenir des comptes/groupes et donc pas d'user.
    Bien vu, je vais essayer de réduire encore au maximum le champs de recherche, je vous dirait ce qu'il en ressort.
    Aide les autres...
    Et les autres t'aideront....
    Mon site DVP
    N'oubliez pas de consulter les FAQ SharePoint et les cours et tutoriels SharePoint

    N'oubliez pas de voter pour les messages dont la réponse est pertinente

  9. #9
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Er3van Voir le message
    Est-ce que tu ne pourrais pas affiner ta recherche en partant d'une racine spécifique ? J'imagine qu'une des branches doit contenir des comptes/groupes et donc pas d'user.
    Dans cette direction, est ce que dans mon filter je ne pourais pas spécifier directement les groupe que je souhaite ne pas interroger? J'entends par là des sous groupes du groupe racine de ma recherche.

    Pas sur d'être bien clair, alors voici un exemple :
    • 1
    • 2(Racine de ma recherche)
      • 1(celui que je ne veux pas interroger...)
      • 2(un de ceux que je veux interroger...)
      • 3(un de ceux que je veux interroger...)


      Si cela n'alourdit pas le traitement bien sur...
    Aide les autres...
    Et les autres t'aideront....
    Mon site DVP
    N'oubliez pas de consulter les FAQ SharePoint et les cours et tutoriels SharePoint

    N'oubliez pas de voter pour les messages dont la réponse est pertinente

  10. #10
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Billets dans le blog
    5
    Par défaut
    Re-bonjour !

    Je reviens ajouter une information car cela pour servir à quelqu'un...
    En fait pour améliorer la rapidité d'exécution de la requête, il faut non pas réduire le champs de recherche, mais réduire la quantité d'informations à récupérer. Pour cela il suffit de rajouter une ligne...

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    search.PropertiesToLoad.Add("cn");
    Temps d'exécution divisé par 4 au moins!
    Voilà, en espérant que cela serve à quelqu'un.

    Merci pour votre aide.
    Aide les autres...
    Et les autres t'aideront....
    Mon site DVP
    N'oubliez pas de consulter les FAQ SharePoint et les cours et tutoriels SharePoint

    N'oubliez pas de voter pour les messages dont la réponse est pertinente

  11. #11
    Membre Expert Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Par défaut
    En effet, mais à condition de n'avoir besoin que du CN de l'user en question.

    Ceci, c'est plus rapide de récupérer tous les CN et de récupérer les autres informations à la demande...

  12. #12
    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
    Après réflexion, il me semble qu'il y a bien une erreur dans ton code. Car la ligne que tu as ajoutée doit modifier les performances, mais il y a encore moyen de l'améliorer. Parce que ton appel vers GetDirectoryEntry recharge toute l'entrée AD. Je m'explique :

    • search.PropertiesToLoad.Add("cn"); effectivement sur ton FindAll, seul cet attribut va être chargé (plus l'adspath) ;
    • mais après quand tu fais GetDirectoryEntry ça refait un appel AD et charge tous les attributs de l'entrée (peu importe ce que tu as filtré avant).


    Pourrais-tu donc faire le test suivant stp et nous donner les résultats de ce que tu peux voir au débuggeur (notamment sur ton DirectoryEntry pour vérifier que tu as bien tout chargé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    foreach (SearchResult result in AdUsers) {
        // Ici ton result ne contient effectivement que les attributs que tu as demandé, tu peux d'ailleurs le tester :
        Console.WriteLine("Properties loaded in the SearchResult: {0}", result.Properties.Count);
        foreach (string currentName in result.Properties.PropertyNames) {
            Console.WriteLine("Property name = {0}", currentName);
            Console.WriteLine("Property values:");
            foreach (string currentValue in result.Properties[currentName]) {
                Console.WriteLine("Value = {0}", currentValue);
            }
        }
        // Avec GetDirectoryEntry, tu refais un appel vers l'AD et tu charges tous les attributs de l'entrée en question
        DirectoryEntry DirEntry = result.GetDirectoryEntry();
        Console.WriteLine("Properties loaded with GetDirectoryEntry: {0}", DirEntry.Properties.Count);
        ADUser user = new ADUser(DirEntry.Properties["cn"].Value.ToString());
        adUserList.Add(user);
    }

  13. #13
    Expert confirmé
    Avatar de ludojojo
    Homme Profil pro
    Développeur SharePoint
    Inscrit en
    Avril 2008
    Messages
    2 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur SharePoint
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 967
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par _Max_ Voir le message
    Après réflexion, il me semble qu'il y a bien une erreur dans ton code. Car la ligne que tu as ajoutée doit modifier les performances, mais il y a encore moyen de l'améliorer. Parce que ton appel vers GetDirectoryEntry recharge toute l'entrée AD. Je m'explique :

    • search.PropertiesToLoad.Add("cn"); effectivement sur ton FindAll, seul cet attribut va être chargé (plus l'adspath) ;
    • mais après quand tu fais GetDirectoryEntry ça refait un appel AD et charge tous les attributs de l'entrée (peu importe ce que tu as filtré avant).
    Alors là, Bravo !
    C'est casiment instantané ! En effet, sans l'utilisation de DirectoryEntry dans la boucle (ce qui explique cette longeur dans l'exécution) le script est extrêment rapide.
    Merci beaucoup pour cette aide !
    Aide les autres...
    Et les autres t'aideront....
    Mon site DVP
    N'oubliez pas de consulter les FAQ SharePoint et les cours et tutoriels SharePoint

    N'oubliez pas de voter pour les messages dont la réponse est pertinente

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

Discussions similaires

  1. Temps de traitement select trop long
    Par David79 dans le forum Requêtes
    Réponses: 1
    Dernier message: 19/05/2013, 11h37
  2. Traitement XML trop long et plante
    Par corgato dans le forum Qt
    Réponses: 8
    Dernier message: 05/06/2010, 14h59
  3. Traitement de message trop long C++/WINAPI
    Par sex4fun dans le forum C++
    Réponses: 4
    Dernier message: 12/02/2008, 10h15
  4. Temps de Traitement trop long
    Par RGShoop dans le forum VBA Access
    Réponses: 2
    Dernier message: 21/06/2007, 15h41
  5. [Système] Traitement trop long, géré le timeout
    Par Oberown dans le forum Langage
    Réponses: 2
    Dernier message: 01/08/2006, 08h44

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