Je parviens à me connecter et à me lier à LDAP et je peux interroger les utilisateurs d'un niveau de domaine, mais pas les utilisateurs du niveau suivant.PHP LDAP impossible de rechercher l'utilisateur
la base dn je peux interroger:
$ldap_base_dn = 'DC=a_level,DC=company,DC=org';
la base dn Je voudrais interroger:
$ldap_base_dn = 'DC=b_level,DC=a_level,DC=company,DC=org';
Je suis à LDAP obligatoire en utilisant un compte administrateur.
<?php
/**
* Get a list of users from Active Directory.
*/
$ldap_password = 'PASSWORD';
$ldap_username = 'ADMIN';
$ldap_connection = ldap_connect('ldap://ldap.company.org/');
if (false === $ldap_connection) {
// Uh-oh, something is wrong...
print "CONNECT ERROR<br />";
}
// We have to set this option for the version of Active Directory we are using.
ldap_set_option($ldap_connection, LDAP_OPT_PROTOCOL_VERSION, 3) or die('Unable to set LDAP protocol version');
ldap_set_option($ldap_connection, LDAP_OPT_REFERRALS, 0); // We need this for doing an LDAP search.
if (true === ldap_bind($ldap_connection, $ldap_username, $ldap_password)) {
print "ldap bind<br />";
$ldap_base_dn = 'DC=b_level,DC=a_level,DC=company,DC=org';
$search_filter = '(&(objectCategory=person)(samaccountname=*))';
$attributes = array();
$attributes[] = 'givenname';
$attributes[] = 'mail';
$attributes[] = 'samaccountname';
$attributes[] = 'sn';
$result = ldap_search($ldap_connection, $ldap_base_dn, $search_filter, $attributes);
if (false !== $result) {
print "ldap search<br />";
$entries = ldap_get_entries($ldap_connection, $result);
for ($x=0; $x<$entries['count']; $x++) {
if (!empty($entries[$x]['givenname'][0]) &&
!empty($entries[$x]['mail'][0]) &&
!empty($entries[$x]['samaccountname'][0]) &&
!empty($entries[$x]['sn'][0]) &&
'Shop' !== $entries[$x]['sn'][0] &&
'Account' !== $entries[$x]['sn'][0]) {
$ad_users[strtoupper(trim($entries[$x]['samaccountname'][0]))] = array('email' => strtolower(trim($entries[$x]['mail'][0])),'first_name' => trim($entries[$x]['givenname'][0]),'last_name' => trim($entries[$x]['sn'][0]));
}
}
}
ldap_unbind($ldap_connection); // Clean up after ourselves.
}
$message .= "Retrieved ". count($ad_users) ." Active Directory users\n";
print $message;
echo '<pre>';
print_r($entries);
echo '</pre>';
en utilisant le programme studio Apache Directory je suis en mesure d'exécuter une recherche d'un utilisateur dans b_level et la base de recherche dn donc je ne comprends pas pourquoi la version php ne fonctionne pas.
EDIT:
Les modifications apportées à afficher la sortie d'erreur.
<?php
/**
* Get a list of users from Active Directory.
*/
$ldap_password = 'PASSWORD';
$ldap_username = 'ADMIN';
$ldap_connection = ldap_connect('ldap://ldap.company.org/');
if (false === $ldap_connection) {
// Uh-oh, something is wrong...
print "CONNECT ERROR<br />";
}
print "Connect Success...<br />";
// We have to set this option for the version of Active Directory we are using.
ldap_set_option($ldap_connection, LDAP_OPT_PROTOCOL_VERSION, 3) or die('Unable to set LDAP protocol version');
ldap_set_option($ldap_connection, LDAP_OPT_REFERRALS, 0); // We need this for doing an LDAP search.
if (true === ldap_bind($ldap_connection, $ldap_username, $ldap_password)) {
print "Bind Success...<br />";
$ldap_base_dn = 'DC=b_level,DC=a_level,DC=company,DC=org';
$search_filter = '(&(objectCategory=person)(samaccountname=*))';
$attributes = array();
$attributes[] = 'givenname';
$attributes[] = 'mail';
$attributes[] = 'samaccountname';
$attributes[] = 'sn';
$result = ldap_search($ldap_connection, $ldap_base_dn, $search_filter, $attributes);
print "ldap_search error: ".ldap_error($ldap_connection) . '<br />';
if (false !== $result) {
print "LDAP Search...<br />";
$entries = ldap_get_entries($ldap_connection, $result);
for ($x=0; $x<$entries['count']; $x++) {
if (!empty($entries[$x]['givenname'][0]) &&
!empty($entries[$x]['mail'][0]) &&
!empty($entries[$x]['samaccountname'][0]) &&
!empty($entries[$x]['sn'][0]) &&
'Shop' !== $entries[$x]['sn'][0] &&
'Account' !== $entries[$x]['sn'][0]) {
$ad_users[strtoupper(trim($entries[$x]['samaccountname'][0]))] = array('email' => strtolower(trim($entries[$x]['mail'][0])),'first_name' => trim($entries[$x]['givenname'][0]),'last_name' => trim($entries[$x]['sn'][0]));
}
}
}
ldap_unbind($ldap_connection); // Clean up after ourselves.
}
$message .= "Retrieved ". count($ad_users) ." Active Directory users\n";
print $message;
echo '<pre>';
print_r($entries);
echo '</pre>';
sortie est:
Connect Success...
Bind Success...
ldap_search error: Referral
LDAP Search...
Retrieved 0 Active Directory users
Array
(
[count] => 0
)
Qu'est-ce ldap_error() sortie? (f.e.) Comme la recherche * fonctionne * pour un DN de base, les chances sont élevées, c'est un problème de configuration qui ne semble pas fonctionner avec un DN de base différent. Mais c'est très lié à votre configuration spécifique. Donc, sans savoir à ce sujet, il est difficile de dire pourquoi "ça ne marche pas" – heiglandreas
Une raison f.e. peut-être que vous interdisez les références suivantes, mais votre DN de base demandé pourrait être sur un ... – heiglandreas
J'ai ajouté ce qui suit sous ldap_search '$ result = ldap_search ($ ldap_connection, $ ldap_base_dn, $ search_filter, $ attributes); print ldap_error ($ ldap_connection). '
'; 'Il renvoie la référence. – blu