Bonjour a tous !

Je suis sur un projet Zend ou je dois récupérer la liste des utilisateurs d'un active directory (sur un windows server 2008). J'ai donc créé une classe qui permet aux utilisateurs de se connecter à mon application avec leurs identifiants sur l’active directory.

Mon problème est le suivant : dans 70 % des cas j'ai un message d'erreur 0x51 (Can't contact LDAP server) mais dans 30% des cas tout fonctionne parfaitement, je peux recupérer les utilisateurs qui peuvent se logguer. Bien entendu ce comportement intervient alors que je n'ai rien touché au code ni au serveur!!!

Voici la classe qui permet de se connecter

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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
 
<?php
class ActiveDirectory extends Zend_Controller_Plugin_Abstract	
{
 
 
 
	//L'active directory
	private $ad;
 
	//l'hote de l'active directory
	private $_host;
	//le port de l'active directory
	private $_port;
	//le nom du domaine
	private $_accountDomainName;
	//booleen  autorisation des mot de passe vide (true = autorisé)
	private $_allowEmptyPassword;
	//fichier des utilisateurs
	private $_baseDn;
	//login
	private $_username;
	//mot de passe
	private $_password;
	//le tableau des options de connexion
	private $_options;
 
	/**
	 * Le constructeur de la classe. Se connecte a l'active directory
	 * grace aux parametres spécifiés
	 * @param  $host le serveur hote de l'active directory
	 * @param  $port le port d'écoute de l'active directory
	 * @param  $username le nom d'utilisateur pour ce connecté a l'active diretory (administrateur)
	 * @param  $password le mot de passe
	 * @param  $allowEmptyPassword booleen permettant d'autoriser ou non les mot de passe vide (true = autoriser)
	 * @param  $accountDomainName le nom du domaine de l'active directory
	 * @param  $baseDn dn des utilisateurs de l'active directory
	 */
    public function __construct($host, $port="", $username, $password="", $allowEmptyPassword, $accountDomainName, $baseDn)
    {
 
    	$this->_host = $host;
    	$this->_port = $port;
    	$this->_username = $username;
    	$this->_password = $password;
    	$this->_allowEmptyPassword = $allowEmptyPassword;
    	$this->_accountDomainName = $accountDomainName;
    	$this->_baseDn = $baseDn;
 
    	//on définit les options pour se connecter a l'active directory
    	$this->_options = array(
		    'host'                   => $this->_host,
    		'port'                   => $this->_port,
		    'username'               => $this->_username,
		    'password'               => $this->_password,
    	    'allowEmptyPassword'     => $this->_allowEmptyPassword,
		    'accountDomainName'      => $this->_accountDomainName,
		    'baseDn'                 => $this->_baseDn,
		);
 
		//on créer la connexion
    	$this->ad = new Zend_Ldap($this->_options);
    	//on se logue sur l'active directory
    	$this->ad->bind($this->_username, $this->_password);
 
 
 
    }
 
    /**
     * méthode qui retourne tous les utilisateurs de l'active directory
     * @return le tableau de utilisateurs de l'active directory
     */
    public function fetchAllEntries()
    {
 
    	$collection = $this->ad->searchEntries('(objectclass=person)');
    	return $collection;
    }
 
    /**
     * test si un utilisateur est valide si oui return cet utilisateur
     * @param $dn
     */
    public function testEntry($name, $password)
    {
 
    	$auth = Zend_Auth::getInstance();
 
    	$serveur2 = array('serveur2' => $this->_options);
 
 
		$adapter = new Zend_Auth_Adapter_Ldap($serveur2, $name,
                                      $password);
 
		$result = $auth->authenticate($adapter);
 
 
		return $result->isValid();
    }
 
    /**
     * return le baseDn du serveur active directory
     */
    public function getBaseDn()
    {
    	return $this->_baseDn;
    }
 
    /**
     * retourne le champ userPrincipalName de l'utilisateur de l'active directory connecté
     * @param $acctname
     */
    public function getUserPrincipalName($acctname)
    {
    	return $acctname.'@'.$this->_accountDomainName;
    }
 
    /**
     * ferme la connexion avec le serveur active directory
     */
    public function disconnect()
    {
    	$this->ad->disconnect();
    }
}
 
?>
Est-ce que quelqu'un a une idée? Est-ce mon code? Ou le serveur ?

Merci d'avance