2010-07-13 43 views
5

Como puede ver a continuación, no obtengo ninguna información de usuario cuando realizo una búsqueda de LDAP en el grupo de seguridad. Deseo usar el $_SERVER[remote_user] para verificar si el usuario es miembro de este grupo. También me gustaría recuperar la información de este usuario y actualizar la base de datos sql con ella. es posible?Cómo recuperar información de usuario de un Grupo de seguridad de Active Directory usando LDAP y 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);

devoluciones esto:

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 
     ) 

) 

todo funcionaba bien cuando utilicé el DN normales:

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

Sin embargo, un experto en AD me dijeron que era un gran NO -NO y que debería usar grupos de seguridad en su lugar: \

Respuesta

3

Consulta el anuncio como este:

$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); 

Tener un vistazo a la MSDN article about the LDAP search filter syntax para obtener información sobre filtros más complejos.

Asegúrese de prestar atención a la sección de Caracteres Especiales en esa página. ¡Una solución correcta debe pasar $group_DN a través de un mecanismo de escape antes de usarlo en la cadena de filtro!

Siempre intente construir filtros lo más específico posible. Es más eficiente dejar que el servidor LDAP clasifique los registros que no desea, en lugar de tener más registros transferidos por el cable de los que necesita y desechar la mitad de ellos en el cliente.

+0

¡Gracias por la respuesta rápida! Pero cuando trato de usar su filtro obtengo este error: Advertencia de PHP: ldap_search() [function.ldap-search]: Buscar: Error de operaciones en C: \ inetpub \ wwwroot \ test \ test.php en la línea 33 Advertencia de PHP: ldap_get_entries(): el argumento proporcionado no es un recurso de resultado LDAP válido en C: \ inetpub \ wwwroot \ test \ test.php en la línea 35 – horgen

+0

Como veo que estás en Windows, aquí tienes un consejo. Descargue Softerra LDAP Browser 2.6 (es gratis), conéctelo a su AD y pruebe sus búsquedas con la herramienta. - En teoría, un DN base de '" DC = mydomain, DC = local "' debería funcionar, sin embargo. – Tomalak

+0

Gracias. Ahora no sé qué demonios está pasando. Hice una búsqueda para DN: "DC = mydomain, DC = local" FILTER: "(& (objectCategory = user) (memberOf = CN = Intra, OU = Grupos de seguridad comunes, DC = mydomain, DC = local))" in el navegador LDAP sin problemas en absoluto. Pero cuando intento hacer lo mismo en PHP obtengo este error: "Advertencia de PHP: ldap_search() [function.ldap-search]: Buscar: error de operaciones en C: \ inetpub \ wwwroot \ test \ test.php en línea 17 ":(No obtengo ningún error si uso" OU = Bergen, DC = mydomain, DC = local ". Pero entonces tengo que crear un bucle for para cada OU. – horgen

0

Tomalak

creo que el problema es que no todos los usuarios del grupo de seguridad proviene de la misma unidad organizativa.

Si cambio

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

a

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

funciona el filtro. Pero también tengo 2 unidades organizativas más con usuarios.

+0

Utilice la sección" Respuestas "para obtener respuestas reales a la pregunta (sí, puede responder sus propias preguntas). Para simples comentarios, usa la función de comentarios. – Tomalak

Cuestiones relacionadas