significa - ¿Cómo escribir una consulta LDAP para probar si el usuario es miembro de un grupo?
que significa cn en active directory (4)
Agregaría una cosa más a la respuesta de Marc: el atributo memberOf no puede contener comodines, por lo que no puede decir algo como "memberof = CN = SPS *", y espera encontrar todos los grupos que comiencen con "SPS".
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?
Supongo que puedo obtener todos los grupos para el usuario y probar cada uno para un partido, pero me preguntaba si podría empacarlo en una expresión LDAP.
¿Algunas ideas?
Gracias
Debe establecer su base de consulta en el DN del usuario en cuestión y luego establecer su filtro en el DN del grupo de quien se está preguntando si es miembro. Para ver si jdoe es miembro del grupo de la oficina, su consulta tendrá el siguiente aspecto:
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 de los que es miembro, solo solicite el atributo ''memberof'' en su búsqueda, como este:
ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host **memberof**
Debería poder crear una consulta con este filtro aquí:
(&(objectClass=user)(sAMAccountName=yourUserName)
(memberof=CN=YourGroup,OU=Users,DC=YourDomain,DC=com))
y cuando ejecuta eso contra su servidor LDAP, si obtiene un resultado, su usuario "yourUserName" es efectivamente un miembro del grupo "CN = YourGroup, OU = Users, DC = YourDomain, DC = com
¡Intenta ver si esto funciona!
Si usa C # / VB.Net y System.DirectoryServices, este fragmento debería ser 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");
}
Advertencia: esto solo probará las membresías inmediatas del grupo, y no probará la membresía en lo que se llama el "grupo primario" (generalmente "cn = Usuarios") en su dominio. No maneja membresías anidadas, por ejemplo, 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 no se refleja aquí.
Bagazo
Si está utilizando OpenLDAP (es decir, slapd), que es común en los servidores Linux, entonces debe habilitar el miembro de 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.