如何编写LDAP查询来测试用户是否是组的成员?

pau*_*aul 121 ldap

我想编写一个LDAP查询来测试用户(sAMAccountName)是否是特定组的成员.有可能这样做,以便我得到0或1结果记录?

我想我可以为用户获取所有组并测试每个组的匹配,但我想知道是否可以将其打包到一个LDAP表达式中.

有任何想法吗?

谢谢

mar*_*c_s 165

您应该可以在此处使用此过滤器创建查询:

(&(objectClass=user)(sAMAccountName=yourUserName)
  (memberof=CN=YourGroup,OU=Users,DC=YourDomain,DC=com))
Run Code Online (Sandbox Code Playgroud)

当你对LDAP服务器运行时,如果你得到一个结果,你的用户"yourUserName"确实是"CN = YourGroup,OU = Users,DC = YourDomain,DC = com"组的成员

试试看看是否有效!

如果你使用C#/ VB.Net和System.DirectoryServices,这个代码片段可以解决这个问题:

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");
}
Run Code Online (Sandbox Code Playgroud)

注意事项:这只会测试直接的组成员身份,并且不会测试域中所谓的"主要组"(通常为"cn = Users")的成员身份.它不处理嵌套成员资格,例如,用户A是作为B组成员的A组成员 - 事实上用户A实际上是B组的成员,这里也没有反映出来.

  • 这是我的查询:(&(objectClass = person)(sAMAccountName = USERID)(memberof ='CN = SPSAdmins,OU = Groups,OU = MYTOWN,OU = Germany,OU = MYCOMPANY,DC = MYTOWN,DC = MYCOMPANY,DC = com'))DN真的很长.我同意*应该*工作.谢谢你的帮助! (3认同)
  • 我一时兴起在memberof之后删除了单引号,现在我得到了一个结果!谢谢 (3认同)
  • 试过了,但仍然不适合我。它应该是 memberOf 子句中的“OU=Users”还是“OU=Groups”? (2认同)
  • 好答案。但应该指出的是,它仅在具有“ memberOf”属性的LDAP服务器中起作用。更为通用的技术是获取* group *对象,并根据用户使用的架构检查用户DN的uniqueMember,roleOccupant等属性。 (2认同)

小智 35

如果您使用的是Linux服务器上常见的OpenLDAP(即slapd),则必须启用memberof overlay才能使用(memberOf = XXX)属性与过滤器匹配.

此外,一旦启用了叠加层,它就不会更新现有组的memberOf属性(您需要删除现有的组并重新添加它们).如果您启用了覆盖,那么当数据库为空时,您应该没问题.

  • 一个链接到一个页面解释如何启用成员覆盖将是有用的我想. (8认同)
  • 对我有用的教程:http://www.schenkels.nl/2013/03/how-to-setup-openldap-with-memberof-overlay-ubuntu-12-04/ @Telford Tendrys,老兄,你救了我的命关于预先存在的群体的这个通知.非常感谢! (5认同)

Bil*_*ley 20

我还要向Marc的答案添加一个:memberOf属性不能包含通配符,所以你不能说"memberof = CN = SPS*",并期望它找到所有以"SPS"开头的组.


小智 10

您必须将查询库设置为相关用户的DN,然后将过滤器设置为您想知道他们是否是其成员的组的DN.要查看jdoe是否是office组的成员,那么您的查询将如下所示:

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)'
Run Code Online (Sandbox Code Playgroud)

如果您想查看他所属的所有群组,只需在搜索中仅请求"memberof"属性,如下所示:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host **memberof**
Run Code Online (Sandbox Code Playgroud)