Como escrever uma consulta LDAP para testar se o usuário é membro de um grupo?

129

Quero escrever uma consulta LDAP que testa se um usuário (sAMAccountName) é membro de um grupo específico. É possível fazer isso para obter 0 ou 1 resultado?

Acho que posso obter todos os grupos para o usuário e testar cada um para uma correspondência, mas estava pensando se poderia agrupá-lo em uma expressão LDAP.

Alguma ideia?

obrigado

Paulo
fonte
Consulte também perguntas como a consulta recursiva à associação ao grupo LDAP
Franklin Piat

Respostas:

177

Você deve conseguir 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 no servidor LDAP, se obtiver um resultado, o usuário "yourUserName" é realmente um membro do grupo "CN = YourGroup, OU = Users, DC = YourDomain, DC = com

Experimente e veja se isso funciona!

Se você usa C # / VB.Net e System.DirectoryServices, esse trecho deve fazer 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 cautela: isso testará apenas associações imediatas de grupos e não será membro do que é chamado de "grupo principal" (geralmente "cn = Usuários") em seu domínio. Ele não lida com associações aninhadas, por exemplo, o Usuário A é membro do Grupo A, que é membro do Grupo B - o fato de que o Usuário A é realmente um membro do Grupo B também não se reflete aqui.

Marc

marc_s
fonte
1
Tentei, mas ainda não está funcionando para mim. Deve ser 'OU = Users' ou 'OU = Groups' na cláusula memberOf?
paul
3
Esta é minha consulta: (& (objectClass = person) (sAMAccountName = USERID) (memberof = 'CN = SPSAdmins, OU = Grupos, OU = MYTOWN, OU = Alemanha, OU = MYCOMPANY, DC = MYTOWN, DC = MYCOMPANY, DC = com ')) O DN é realmente esse tempo. Concordo que deveria funcionar. Obrigado por ajudar!
paul
3
Por capricho, removi as aspas simples depois de memberof e agora obtive um resultado! Graças
paul
2
Boa resposta. mas deve-se ressaltar que funcionará apenas em servidores LDAP que mantêm um atributo 'memberOf'. A técnica mais geral é buscar o objeto de grupo e examinar seus atributos uniqueMember, roleOccupant etc. para o DN do usuário, dependendo do esquema que o objeto de grupo usa.
Marquês de Lorne
1
Nomes e valores de atributos @Gunslinger LDAP não são case-sensitive, e nem são DNs, mas AD tem suas próprias regras ...
Marquês de Lorne
35

Se você estiver usando o OpenLDAP (isto é, slapd), que é comum nos servidores Linux, habilite o membro da sobreposição para poder corresponder a um filtro usando o atributo (memberOf = XXX).

Além disso, depois de ativar a sobreposição, ela não atualiza os atributos memberOf para grupos existentes (você precisará excluir os grupos existentes e adicioná-los novamente). Se você ativou a sobreposição, quando o banco de dados estava vazio, você deve estar OK.

Telford Tendys
fonte
8
Um link para uma página que explica como ativar o membro da sobreposição seria útil, eu acho.
Gokhan Sari
5
Tutorial que funcionou para mim: schenkels.nl/2013/03/… @Telford Tendrys, cara, você salvou minha vida com este aviso sobre grupos pré-existentes. Muito Obrigado!
precisa saber é o seguinte
21

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

Bill Brinkley
fonte
Obrigado por essa informação. Eu tenho tentado fazer o que você diz que não pode ser feito. Como posso fazer isso com PHP? É possível obter o mesmo resultado de outra maneira? para encontrar todos os grupos, comece com o SPS e depois o que for ... Sempre posso pegar tudo e fazer um loop na minha matriz e depois corresponder à CN que eu quero, mas prefiro apenas pesquisá-la, se possível.
ODelibalta
15

Você deve definir sua base de consulta para o DN do usuário em questão e, em seguida, definir seu filtro para o DN do grupo em que está se perguntando se é membro. Para ver se jdoe é um membro do grupo de escritórios, sua consulta será mais ou menos assim:

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 dos quais ele é membro, basta solicitar apenas o atributo 'memberof' em sua pesquisa, desta forma:

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