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

Bibliothèques et frameworks PHP Discussion :

[LDAP] ldap_search et Sizelimit


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    Par défaut [LDAP] ldap_search et Sizelimit
    Bonjour.

    J'ai un problème pour utiliser ldap_search : j'ai une OU avec beaucoup de comptes (plus de 1000) et ma Sizelimit est bloqué à 1000...
    Ce qui fait que je ne récupère que les 1000 premier comptes.

    J'ai tenté de passer la taille à plus de 1000 ou en illimité mais je ne peut pas (je suis limité à la sizeLimit du serveur et il n'ai même pas envisageable de changer ce paramètre).

    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
    /*------------------------------------------------------------------------
     * Entree(s) :
     *    - $link_identifier (connection AD)
     *    - $domaine 
     *    - $base_dn
     * Sortie(s) :
     *    - 
     * variable(s) globale(s) : 
     *    - 
     *------------------------------------------------------------------------
     * 
     * Lit les infos dans la base AD
     * 
     */ 
    function lireBase ($link_identifier, $domaine, $base_dn)
    {
     
        echo "domaine = $domaine<br />\n" ;
     
        $filter="objectCategory=user";
        ldap_set_option($link_identifier, LDAP_OPT_SIZELIMIT, 0);
        $result_identifier=ldap_search($link_identifier, $base_dn, $filter);
        return $result_identifier ;
    }

    Warning: ldap_search() [function.ldap-search]: Partial search results returned: Sizelimit exceeded in
    Il me faudrait donc faire une sorte de boucle pour lire les données 1000 par 1000, mais je ne trouve rien de ressemblant sur internet.

    Si quelqu'un sait faire ça m'aiderait beaucoup.

    ++Florent.

  2. #2
    Membre régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    Par défaut
    Helllllp

    Je ne trouve rien sur le net
    Je me demande si c'est possible...

    A plus, Florent.

  3. #3
    Membre régulier Avatar de floanne
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Points : 78
    Points
    78
    Par défaut
    Bon, je me répond à moi même lol

    Pour contourné le problème j'ai fait une fonction récursive...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function initVar ()
    {
        global $max_LDAP_OPT_SIZELIMIT ;
        $max_LDAP_OPT_SIZELIMIT = 1000 ;
     
        global $tab_car ;
        $tab_car = array_merge (range(0, 10), range('A', 'Z')) ;
        $tab_car[] = '_' ;
    }
    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
    /*------------------------------------------------------------------------
     * Entree(s) :
     *    - $link_identifier (connection AD)
     *    - $domaine 
     *    - $base_dn
     * Sortie(s) :
     *    - tableau de tous les users 
     * variable(s) globale(s) : 
     *    - $max_LDAP_OPT_SIZELIMIT
     *------------------------------------------------------------------------
     * 
     * Lit les infos dans la base AD
     * 
     */ 
    function lireBaseAmmorce ($link_identifier, $domaine, $base_dn)
    {
        $tab_tmp = array () ;
        $debut = "" ;
        return lireBaseRec ($link_identifier, $domaine, $base_dn,
                            $tab_tmp, $debut) ;
    }
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    /*------------------------------------------------------------------------
     * Entree(s) :
     *    - $link_identifier (connection AD)
     *    - $domaine 
     *    - $base_dn
     *    - $tab_tmp (attention passage par référence)
     *    - $debut
     * Sortie(s) :
     *    - tableau de tous les users commancant par $debut
     * variable(s) globale(s) : 
     *    - $max_LDAP_OPT_SIZELIMIT
     *    - $tab_car
     *------------------------------------------------------------------------
     * 
     * Lit les infos dans la base AD.
     * Si il y a plus de users que $max_LDAP_OPT_SIZELIMIT
     * alors on fait n appels récurcifs avec un $debut
     * plus restraint pour avoir moins de résultats par reqête.   
     * 
     */ 
    function lireBaseRec ($link_identifier, $domaine, $base_dn,
                         &$tab_tmp, $debut = "")
    {
     
        global $max_LDAP_OPT_SIZELIMIT ;
        global $tab_car ;
     
        ldap_set_option($link_identifier, LDAP_OPT_SIZELIMIT, 
                        $max_LDAP_OPT_SIZELIMIT);
     
        /*
         * On cré un filtre de recherche sur tous les 
         * usrers qui commence par la chaine $debut
         */      
        $filter="(&(objectCategory=user)(sAMAccountName=$debut*))";
     
        ob_start() ;
        $result_identifier=ldap_search($link_identifier, $base_dn, $filter) ;
        $warnig = ob_get_length();
        ob_end_clean();
     
        /*
         * Si il y a un warning 276 c'est que l'on a pas pu remonter tous les
         * users car il y en a plus que $max_LDAP_OPT_SIZELIMIT
         * On fait un appel récurcif en restraigant la recherche, 
         * puis on assemble les résultats.             
         */     
        if($warnig == 276)
        {
            /*
             * On fait un appel récurcif sur tous les caractères de $tab_car
             */         
        	foreach ($tab_car as $car)
            {
                // on concataine $debut avec $car
                $debut_tmp = $debut.$car ;
                $tab_tmp = 
                    // on ajoute le nouveau résultat aux autres
                    array_merge 
                    (
                        $tab_tmp,
                        // appel récurcif
                        lireBaseRec ($link_identifier, $domaine, $base_dn,
                                     $tab_tmp, $debut_tmp)
                    ) ;        
            }
        }
        else
        {
            $tab_tmp = 
                // on ajoute le nouveau résultat aux autres
                array_merge (
                                $tab_tmp, 
                                lireRes ($result_identifier, $link_identifier)
                            ) ;
        }
     
        return $tab_tmp ;
    }
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    /*------------------------------------------------------------------------
     * Entree(s) :
     *    - $result_identifier : resultat d'un ldap_search
     *    - $link_identifier 
     * Sortie(s) :
     *    - $tab_res
     * variable(s) globale(s) : 
     *    - 
     *------------------------------------------------------------------------
     * 
     * lit les donnée issue d'une recherche 
     * 
     */ 
    function lireRes ($result_identifier, $link_identifier)
    {
        $tab_res = array() ;
        /*
         * si il y a au moins un résultat
         */
        if (0 < ldap_count_entries($link_identifier, $result_identifier))
        {
            $entry = ldap_first_entry($link_identifier, $result_identifier);
            ajouterDansTableau ($link_identifier, $entry, $tab_res) ;
     
            while ($next_entry = ldap_next_entry($link_identifier, $entry))
            {
                ajouterDansTableau ($link_identifier, $next_entry, $tab_res) ;
                $entry = $next_entry ;
            }
        }
     
        return $tab_res ;
    }
    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
    25
    26
    /*------------------------------------------------------------------------
     * Entree(s) :
     *    - $entry : un compte AD
     *    - $tab : le tableau comptenant tous les résultat (passé par référence) 
     * Sortie(s) :
     *    - 
     * variable(s) globale(s) : 
     *    - 
     *------------------------------------------------------------------------
     * 
     * Ajoute les element dans un tableau.
     * 
     */ 
    function ajouterDansTableau ($link_identifier, $entry, &$tab)
    {
        $attr = ldap_get_values($link_identifier, $entry, "samaccountname");
        $name = $attr[0] ;
        //echo "name"." : ".$name."<br />\n";
     
        $attr = ldap_get_values($link_identifier, $entry, "accountExpires");
        $date_brute = $attr[0] ;
        //$date = convert_time_ldap2ddmmyyyy ($date_brute) ;
        //echo "accountExpires"." : ".$date." (".$date_brute.")<br />\n";
     
        $tab[$name] = $date_brute ;
    }
    Voila...

    Si quelqu'un à une solution plus élégante je suis preneur.

    ++Florent.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 27
    Points : 108
    Points
    108
    Par défaut
    Citation Envoyé par floanne Voir le message
    Bon, je me répond à moi même lol
    Tu parles tout seul, floanne ...

    Pour contourner le problème j'ai fait une fonction récursive...
    [...bunch of code...]
    Voila...
    Si quelqu'un à une solution plus élégante je suis preneur.

    ++Florent.
    J'avoue que j'avais envie de le faire, mais par paresse j'ai cherché sur le net... et j'ai trouvé ta contribution.

    Super contribution.

    J'aime bien ton style, propre, et documenté.
    La récurrence s'adapte à la taille de l'échantillon, et en 7 années, personne n'a trouvé plus élégant.
    Ca existe peut-être ?
    Attendons encore 7 années...

    Kirtap

Discussions similaires

  1. Recherche dans LDAP: ldap_search()
    Par SirTurbo dans le forum Langage
    Réponses: 0
    Dernier message: 25/09/2013, 21h51
  2. [LDAP] ldap_search et les OU
    Par titou12 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 15/09/2011, 16h13
  3. [LDAP] ldap_search et ldap_add
    Par Hurric@n dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 04/03/2008, 10h09
  4. [LDAP] ldap_search, uidNumber en php
    Par sedannais dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 10/07/2007, 17h14
  5. [LDAP] Erreur sizeLimit exceeded
    Par xG-Hannibal dans le forum Langage
    Réponses: 3
    Dernier message: 13/06/2006, 09h08

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