2017-08-28 2 views
0

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 
) 
+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

+0

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

+0

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

Répondre

1

Il me semble que le base_dn (level_b) ne sont pas stockées dans le répertoire que vous demandez, mais sur un autre répertoire configuré en tant que référence.

Vous devez:

  • Modifier la ligne ldap_set_option($ldap_connection, LDAP_OPT_REFERRALS, 0);-ldap_set_option($ldap_connection, LDAP_OPT_REFERRALS, true);

  • Configurer une fonction de rappel de retirage pour chasser le renvoi: voir http://php.net/manual/en/function.ldap-set-rebind-proc.php pour plus d'informations