2010-07-13 16 views
5

Comme vous pouvez le voir ci-dessous, je ne reçois aucune information d'utilisateur lorsque je fais une recherche LDAP au groupe de sécurité. Je veux utiliser le $_SERVER[remote_user] pour vérifier si l'utilisateur est membre de ce groupe. Je voudrais également récupérer les informations de cet utilisateur et mettre à jour la base de données sql avec lui. Est-ce possible?Comment faire pour récupérer des informations d'utilisateur d'un groupe de sécurité Active Directory en utilisant LDAP et PHP

$dn = "CN=Intra,OU=Common Security Groups,DC=mydomain,DC=local"; 
$filter = "(member=*)"; 

$ad = ldap_connect("IP") or die("Couldn't connect to AD!"); 
ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3); 
$bd = ldap_bind($ad, "[email protected]", "password") or die("Can't bind to server."); 
$sr = ldap_search($ad,$dn,$filter); 
$entries = ldap_get_entries($ad, $sr); 

print_r($entries);

Retours ceci:

Array 
(
    [count] => 1 
    [0] => Array 
     (
      [objectclass] => Array 
       (
        [count] => 2 
        [0] => top 
        [1] => group 
       ) 

      [0] => objectclass 
      [cn] => Array 
       (
        [count] => 1 
        [0] => Intra 
       ) 

      [1] => cn 
      [description] => Array 
       (
        [count] => 1 
        [0] => Group for (LDAP) INTRANET server access 
       ) 

      [2] => description 
      [member] => Array 
       (
        [count] => 4 
        [0] => CN=Fname1 Lname1,OU=Mail enabled users,OU=Aberdeen,DC=mydomain,DC=local 
        [1] => CN=Fname2 Lname2,OU=Mail enabled users,OU=Forres,DC=mydomain,DC=local 
        [2] => CN=Fname3 Lname3,OU=Houston,DC=mydomain,DC=local 
        [3] => CN=Fname4 Lname4,OU=Mail enabled users,OU=Bergen,DC=mydomain,DC=local 
       ) 

      [3] => member 
      [distinguishedname] => Array 
       (
        [count] => 1 
        [0] => CN=Intra,OU=Common Security Groups,DC=mydomain,DC=local 
       ) 

      [4] => distinguishedname 
      [instancetype] => Array 
       (
        [count] => 1 
        [0] => 4 
       ) 

      [5] => instancetype 
      [whencreated] => Array 
       (
        [count] => 1 
        [0] => 20100711172407.0Z 
       ) 

      [6] => whencreated 
      [whenchanged] => Array 
       (
        [count] => 1 
        [0] => 20100712063949.0Z 
       ) 

      [7] => whenchanged 
      [usncreated] => Array 
       (
        [count] => 1 
        [0] => 17491499 
       ) 

      [8] => usncreated 
      [usnchanged] => Array 
       (
        [count] => 1 
        [0] => 17498823 
       ) 

      [9] => usnchanged 
      [name] => Array 
       (
        [count] => 1 
        [0] => Intra 
       ) 

      [10] => name 
      [objectguid] => Array 
       (
        [count] => 1 
        [0] => 
       ) 

      [11] => objectguid 
      [objectsid] => Array 
       (
        [count] => 1 
        [0] => 
       ) 

      [12] => objectsid 
      [samaccountname] => Array 
       (
        [count] => 1 
        [0] => Intra 
       ) 

      [13] => samaccountname 
      [samaccounttype] => Array 
       (
        [count] => 1 
        [0] => 268435456 
       ) 

      [14] => samaccounttype 
      [grouptype] => Array 
       (
        [count] => 1 
        [0] => -2147483646 
       ) 

      [15] => grouptype 
      [objectcategory] => Array 
       (
        [count] => 1 
        [0] => CN=Group,CN=Schema,CN=Configuration,DC=mydomain,DC=local 
       ) 

      [16] => objectcategory 
      [count] => 17 
      [dn] => CN=Intra,OU=Common Security Groups,DC=mydomain,DC=local 
     ) 

) 

Tout fonctionnait bien quand je la normale DN:

$dn = "OU=Mail enabled users,OU=Bergen,DC=mydomain,DC=local"; 

Mais un expert AD m'a dit que c'était un grand NO -NON et que je devrais utiliser les groupes de sécurité à la place: \

Répondre

3

la requête AD comme ceci:

$dn  = "DC=mydomain,DC=local"; 
$group_DN = "CN=Intra,OU=Common Security Groups,DC=mydomain,DC=local"; 
$filter = "(&(objectCategory=user)(memberOf=$group_DN))"; 
// ... 
$sr  = ldap_search($ad, $dn, $filter); 

Jetez un oeil à la MSDN article about the LDAP search filter syntax pour plus d'informations sur les filtres plus complexes.

Veillez à faire attention à la section Caractères spéciaux sur cette page. Une solution correcte doit passer par $group_DN via un mécanisme d'échappement avant de l'utiliser dans la chaîne de filtre! Toujours essayer les filtres de construction aussi spécifiques que possible. Il est plus efficace de laisser le serveur LDAP trier les enregistrements que vous ne voulez pas, au lieu d'avoir plus d'enregistrements transférés sur le réseau que nécessaire et de jeter la moitié d'entre eux sur le client.

+0

Merci pour la réponse rapide! Mais quand j'essaye d'utiliser votre filtre j'obtiens cette erreur: PHP Attention: ldap_search() [function.ldap-search]: Recherche: Erreur d'opérations dans C: \ inetpub \ wwwroot \ test \ test.php sur la ligne 33 PHP Attention: ldap_get_entries(): l'argument fourni n'est pas une ressource de résultat ldap valide dans C: \ inetpub \ wwwroot \ test \ test.php sur la ligne 35 – horgen

+0

Puisque je vois que vous êtes sur Windows, voici un conseil. Téléchargez Softerra LDAP Browser 2.6 (c'est gratuit), connectez-le à votre AD et testez vos recherches avec l'outil. - En théorie, un DN de base de '" DC = mydomain, DC = local "' devrait fonctionner, cependant. – Tomalak

+0

Merci. Maintenant, je ne sais pas ce qui se passe. J'ai fait une recherche de DN: "DC = mydomain, DC = local" FILTER: "(& (objectCategory = utilisateur) (memberOf = CN = Intra, OU = Groupes de sécurité communs, DC = mydomain, DC = local))" dans le navigateur LDAP sans aucun problème. Mais quand j'essaye de faire la même chose en PHP j'obtiens cette erreur: "PHP Avertissement: ldap_search() [function.ldap-search]: Recherche: Erreur d'opérations dans C: \ inetpub \ wwwroot \ test \ test.php en ligne 17 ":(Je ne reçois aucune erreur si j'utilise" OU = Bergen, DC = mydomain, DC = local "Mais ensuite je dois créer une boucle for pour chaque OU – horgen

0

Tomalak

Je pense que le problème est que tous les utilisateurs du groupe de sécurité vient de la même unité d'organisation.

Si je change

$dn  = "DC=mydomain,DC=local"; 

à

$dn  = "OU=Bergen,DC=mydomain,DC=local"; 

le filtre fonctionne. Mais j'ai aussi 2 OU de plus avec les utilisateurs.

+0

Veuillez utiliser la section" Réponses "pour les réponses réelles à la question (oui, vous pouvez répondre à vos questions). Pour de simples commentaires, veuillez utiliser la fonction de commentaire. – Tomalak