ldap_get_entries возвращает массив с количеством элементов = ноль - PullRequest
1 голос
/ 12 апреля 2011

В некоторых ситуациях ldap_get_entries возвращает массив с количеством элементов = ноль, поэтому у меня есть массив, подобный массиву ('count' => 0) без каких-либо дополнительных записей.

Каковы условия для этого?

PS:

  • Если OU, в котором я ищу, пусто, я получаю другую ошибку (Неверное базовое DN)
  • если у пользователя нет прав доступа к OU, я получаю ту же ошибку, что и выше

EDIT:

  • код PHP не имеет значения, поскольку я могу выполнять все виды поиска с ним, и вышеупомянутая проблема возникает только в некоторых странных конфигурациях Active Directory
  • если вы все еще настаиваете ... $entries = ldap_get_entries($this->ldap_connection, $search_result);
  • ldap_get_entries возвращает в большинстве случаев то, что я ожидаю, что он вернется с правильными ошибками

Итак, чтобы повторить мой вопрос, при каких условиях ldap_get_entries возвращает массив с count = 0 без каких-либо ошибок. Под условием я подразумеваю:

  • Права и разрешения Active Directory
  • разрешения пользователя
  • Разрешения OU (он же вкладка Безопасность)
  • любая связанная с PHP информация о том, когда это может произойти

Спасибо

EDIT2 - по запросу, вот остаток кода:

public function connect() {

    // connect to the server
    $this->ldap_connection = ldap_connect($this->ldap_server);
    if (!$this->ldap_connection){
        $error_message= "LDAP-Connect-Error: " . ldap_error($this->ldap_connection) . ".";
        throw new RuntimeErrorException($error_message);
    }

    // set protocol version
    if (!ldap_set_option($this->ldap_connection, LDAP_OPT_PROTOCOL_VERSION, $this->ldap_protocol_version)){
        $error_message= "LDAP-SetProtocolVersion-Error: " . ldap_error($this->ldap_connection) . ".";
        throw new RuntimeErrorException($error_message);
    }

    // set with/without referrals (limit/do not limit search on current server)
    if (!ldap_set_option($this->ldap_connection, LDAP_OPT_REFERRALS, $this->ldap_protocol_referrals)){
        $error_message= "LDAP-SetReferrals-Error: " . ldap_error($this->ldap_connection) . ".";
        throw new RuntimeErrorException($error_message);
    }

    // binding to ldap server
    if (!@ldap_bind($this->ldap_connection, $this->ldap_auth_rdn, $this->ldap_auth_pass)){
        $error_message= "LDAP-Bind-Error: " . ldap_error($this->ldap_connection) . ".";
        throw new RuntimeErrorException($error_message);
    }
}

public function search($filter,$fields){
    if (!$this->ldap_connection) {
        $this->connect();
    }

    // search the ldap
    $search_result = @ldap_search($this->ldap_connection, $this->ldap_base_distinguished_name, $filter,$fields);
    if ($search_result===false){
        $error_message= "LDAP-Error: " . ldap_error($this->ldap_connection) . ".";
        throw new RuntimeErrorException($error_message);
    }

    //Create result set
    $entries = ldap_get_entries($this->ldap_connection, $search_result);
    if ($entries === false ){
        $error_message= "LDAP-Error: " . ldap_error($this->ldap_connection) . ".";
        throw new RuntimeErrorException($error_message);
    }

    return (is_null($entries) ? array() : $entries); // http://bugs.php.net/48469
}

Ответы [ 3 ]

1 голос
/ 13 апреля 2011

Похоже, ldap_connect успешно подключается к вашему серверу.

Я думаю, что проблема в параметре ldap_base_distinguished_name из ldap_search, убедитесь, что он правильный, и у вас есть это базовое отличительное имяв тебе дерево АД.

1 голос
/ 12 апреля 2011

Это означает, что то, что вы ищете, не вернуло результаты либо потому, что его там нет, либо вы неправильно его ищете.

0 голосов
/ 24 июля 2015
$ldap = new stdclass;
$ldap->host = 'YOUR_HOST';
$ldap->port = 'PORT'; 
$ldap->user = 'YOUR_USER';
$ldap->pass = 'YOUR_PASS';
$ldap->dn  = "CN=Users,DC=DOMAIN,DC=COM,DC=br";
$ldap->filter = '(sAMAccountName=YOUR_USER_NAME)';

try {
    $ldap->conn = ldap_connect($ldap->host,$ldap->port);
    $ldap->bind = ldap_bind($ldap->conn, $ldap->user, $ldap->pass);
    $ldap->option[] = ldap_set_option($ldap->conn, LDAP_OPT_PROTOCOL_VERSION,3);
    $ldap->option[] = ldap_set_option($ldap->conn, LDAP_OPT_REFERRALS,0);
    $ldap->seach=ldap_search($ldap->conn,  $ldap->dn, $ldap->filter);
    $ldap->info = ldap_get_entries($ldap->conn, $ldap->seach); 
    var_dump($ldap);
} catch (Exception $error_message) {
    throw new RuntimeErrorException($error_message);
}
...