2009-06-23 75 views
97

Quiero escribir una consulta LDAP que comprueba si un usuario (sAMAccountName) es miembro de un grupo en particular. ¿Es posible hacer eso para obtener 0 o 1 registros de resultados?Cómo escribir una consulta LDAP para probar si el usuario es miembro de un grupo?

Supongo que puedo obtener todos los grupos para el usuario y probar cada uno para una coincidencia, pero me preguntaba si podría empaquetarlo en una expresión LDAP.

¿Alguna idea?

Gracias

+0

Ver también preguntas como [recursiva consulta de pertenencia a un grupo LDAP] (http://stackoverflow.com/q/7826927/1260896) –

Respuesta

132

Usted debe ser capaz de crear una consulta con este filtro aquí:

(&(objectClass=user)(sAMAccountName=yourUserName) 
    (memberof=CN=YourGroup,OU=Users,DC=YourDomain,DC=com)) 

y, al ejecutar este en contra de su servidor LDAP, si se obtiene un resultado, el usuario "yourusername" es de hecho un miembro del grupo "CN = yourgroup, OU = Users, DC = SuDominio, DC = com

probar y ver si esto funciona!

Si utiliza C#/VB.Net y S ystem.DirectoryServices, este fragmento debe hacer el truco:

DirectoryEntry rootEntry = new DirectoryEntry("LDAP://dc=yourcompany,dc=com"); 

DirectorySearcher srch = new DirectorySearcher(rootEntry); 
srch.SearchScope = SearchScope.Subtree; 

srch.Filter = "(&(objectClass=user)(sAMAccountName=yourusername)(memberOf=CN=yourgroup,OU=yourOU,DC=yourcompany,DC=com))"; 

SearchResultCollection res = srch.FindAll(); 

if(res == null || res.Count <= 0) { 
    Console.WriteLine("This user is *NOT* member of that group"); 
} else { 
    Console.WriteLine("This user is INDEED a member of that group"); 
} 

Una advertencia: esto sólo prueba para las pertenencias a grupos inmediatos, y no pondrá a prueba para ser miembro de lo que se llama el "grupo primario" (por lo general " cn = Usuarios ") en su dominio. No maneja membresías anidadas, p. El usuario A es miembro del Grupo A que es miembro del Grupo B; el hecho de que el Usuario A también sea realmente miembro del Grupo B tampoco se refleja aquí.

Marc

+1

intentado, pero aún no funciona para mí. ¿Debería ser 'OU = Usuarios' u 'OU = Grupos' en la cláusula memberOf? – paul

+0

¿Cuál es el DN del nombre de su grupo? Depende de lo que realmente quieras verificar ... –

+0

Debes poner los valores reales reales en tu caso: ¡mis cosas solo son marcadores de posición de demostración! –

17

me gustaría añadir una cosa más a la respuesta de Marc: El atributo de miembro no puede contener comodines, por lo que no se puede decir algo así como "memberof = CN = SPS *", y esperar que se encuentre todos los grupos que comienzan con "SPS".

+0

Gracias para esa información. He estado tratando de hacer lo que dices que no se puede hacer. ¿Cómo puedo hacer eso con PHP? ¿Es posible tener el mismo resultado de otra manera? para encontrar todos los grupos comienzan con SPS y luego lo que sea ... Siempre puedo agarrar todo y hacer un bucle en mi matriz, luego precomodar con el CN ​​que quiero, pero prefiero simplemente buscarlo directamente si es posible. – ODelibalta

+0

'memberOf = CN = SPS *' funciona para mí – tarikakyol

29

Si está utilizando OpenLDAP (es decir, slapd) que es común en los servidores Linux, entonces debe habilitar el miembro de la superposición para que coincida con un filtro utilizando el atributo (memberOf = XXX).

Además, una vez que habilita la superposición, no actualiza los atributos memberOf para grupos existentes (deberá eliminar los grupos existentes y volver a agregarlos). Si habilitó la superposición para comenzar, cuando la base de datos estaba vacía, entonces debería estar bien.

+7

Un enlace a una página que explica cómo habilitar memberof overlay sería útil, supongo. –

+3

Tutorial que funcionó para mí: http://www.schenkels.nl/2013/03/how-to-setup-openldap-with-memberof-overlay-ubuntu-12-04/ @Telford Tendrys, amigo que has guardado mi vida con este aviso sobre grupos preexistentes. ¡Muchas gracias! –

9

Debe establecer su base de consulta en el DN del usuario en cuestión, luego configure su filtro en el DN del grupo de quien se está preguntando si es miembro. Para ver si jperez es un miembro del grupo de oficina, entonces la consulta se verá algo como esto:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host '(memberof=cn=officegroup,dc=example,dc=local)' 

Si desea ver todos los grupos que él es un miembro de, simplemente solicitar sólo el atributo 'memberof' en su búsqueda, de esta manera:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host **memberof** 
Cuestiones relacionadas