Como escrever a pesquisa LDAP para testar se o Usuário é membro de um grupo?

quero escrever uma pesquisa LDAP que testa se um utilizador (sAMAccountName) é um membro de um grupo em particular. É possível fazer isso para que eu tenha ou 0 ou 1 registros de resultados?

acho que consigo obter todos os grupos para o utilizador e testar cada um deles para uma correspondência, mas estava a pensar se poderia encaixotar numa expressão LDAP.

Alguma ideia?

Obrigado.
 105
Author: paul, 2009-06-23

4 answers

Você deve ser capaz de criar uma consulta com este filtro aqui:

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

E quando você executa isso com o seu servidor LDAP, se tiver um resultado, o seu utilizador "seu utilizador" é de facto um membro do grupo " CN=seu grupo, OU = utilizadores, DC=YourDomain, DC=com

Tenta ver se isto funciona!

Se utilizar C# / VB.Net e sistema.DirectoryServices, este excerto deve servir para o truque:

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");
}
Palavra de precaução: isto só testará a adesão imediata ao grupo, e irá não testar para a adesão no que é chamado de "grupo primário" (geralmente "CN=usuários") em seu domínio. Ele não lida com membros aninhados, por exemplo, o usuário A é membro do grupo a que é membro do Grupo B - que o fato de que o usuário A é realmente um membro do Grupo B também não se reflete aqui.

Marc

 139
Author: marc_s, 2014-02-24 22:45:21

Se estiver a usar o OpenLDAP (ou seja, o slapd), que é comum nos servidores Linux, então deve activar o memberof overlay para ser capaz de corresponder com um filtro usando o atributo (memberOf=XXX).

Além disso, uma vez activada a sobreposição, não actualiza o membro dos atributos dos grupos existentes (terá de apagar os grupos existentes e adicioná-los de novo). Se você ativou a sobreposição para começar, quando a base de dados estava vazia, então você deve estar OK.

 29
Author: Telford Tendys, 2011-11-01 04:25:22

Eu acrescentaria mais uma coisa à resposta de Marc: o atributo memberOf não pode conter caracteres especiais, então você não pode dizer algo como "memberof=CN=SPS*", e esperar que ele encontre todos os grupos que começam com "SPS".

 19
Author: Bill Brinkley, 2011-02-23 22:28:04

Você deve definir sua base de consulta para o DN do usuário em questão, em seguida, definir o seu filtro para o DN do grupo que você está se perguntando se eles são um membro. Para ver se o jdoe é um membro do grupo office, então a sua consulta será algo parecido com isto:

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

Se você quiser ver todos os grupos de que ele é membro, basta pedir apenas o atributo 'memberof' em sua pesquisa, assim:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host **memberof**
 9
Author: gpayne_007, 2014-08-21 22:58:08