#php #ldap #ldap-query
#php #ldap #ldap-запрос
Вопрос:
В некоторых ситуациях ldap_get_entries возвращает массив с количеством элементов = нулю, поэтому у меня есть массив типа array (‘count’ => 0) без каких-либо дополнительных записей.
Каковы условия для того, чтобы это произошло?
PS:
- если подразделение, в котором я ищу, пустое, я получаю другую ошибку (недопустимый базовый DN)
- если у пользователя нет прав доступа к подразделению, я получаю ту же ошибку, что и выше
Редактировать:
- PHP-код не имеет значения, поскольку я могу выполнять с ним все виды поиска, и вышеупомянутая проблема возникает только в некоторых странных конфигурациях Active Directory
- если вы все еще настаиваете…
$entries = ldap_get_entries($this->ldap_connection, $search_result);
- ldap_get_entries возвращает в большинстве случаев то, что я ожидаю, с соответствующими ошибками
Итак, переформулируя мой вопрос, каковы условия для того, чтобы ldap_get_entries возвращал массив с количеством элементов = 0 без каких-либо ошибок. Под условием я подразумеваю:
- Права и разрешения Active Directory
- права пользователя
- Разрешения подразделения (также известная вкладка безопасности)
- любая информация, связанная с 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
}
Комментарии:
1. Ваш PHP-код имеет отношение к делу. Мы не знаем, как вы настраиваете соединение. Существуют определенные параметры для AD, которые вам нужно установить, например, в вашем PHP-коде.
Ответ №1:
Похоже, что ldap_connect
успешно подключается к вашему серверу.
Я думаю, проблема в ldap_base_distinguished_name
параметре из ldap_search
, убедитесь, что он правильный и у вас есть это базовое различимое имя в вашем дереве объявлений.
Ответ №2:
Это означает, что то, что вы ищете, не вернуло результатов либо потому, что его там нет, либо вы неправильно его искали.
Комментарии:
1. Используйте визуальный браузер LDAP, чтобы убедиться, что данные есть, прежде чем сводить себя с ума!
2. Итак, вот пример с пользователем, если я выполняю поиск по базовому dn сервера, я получаю count = 0 и абсолютно никаких ошибок. Я хочу понять, каково условие для того, чтобы это произошло.
3. @Emyr: это изолированная сеть на другом конце света, к сожалению, у меня нет доступа ни к чему большему, чем сетевое устройство на базе Linux с поддержкой PHP.
4. @Patkos, отредактируй свой вопрос и добавь код, который ты используешь. Таким образом, мы не слепы.
Ответ №3:
$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);
}
Комментарии:
1. Пожалуйста, объясните свой ответ в вашем сообщении вместе с опубликованным кодом, чтобы сделать его более понятным для посетителей этого вопроса.