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


129

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

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

有任何想法吗?

谢谢


Answers:


177

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

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

并且当您对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");
}

提醒您:这只会测试直接的组成员身份,而不会测试您域中所谓的“主要组”(通常为“ cn = Users”)的成员身份。它不处理嵌套的成员资格,例如,用户A是组A的成员,而后者是组B的成员-用户A确实也是组B的成员这一事实在这里没有得到体现。

马克


1
尝试过,但仍然无法为我工作。在memberOf子句中应该是“ OU = Users”还是“ OU = Groups”?
paul,2009年

3
这是我的查询:(&(objectClass = person)(sAMAccountName = USERID)(memberof ='CN = SPSAdmins,OU = Groups,OU = MYTOWN,OU = Germany,OU = MYCOMPANY,DC = MYTOWN,DC = MYCOMPANY,DC = com'))DN确实很长。我同意它应该起作用。感谢您的帮助!
paul,2009年

3
一时兴起,我删除了memberof之后的单引号,现在我得到了结果!谢谢
paul,2009年

2
好答案。但应该指出的是,它将仅在维护“ memberOf”属性的LDAP服务器中工作。更通用的技术是获取对象,并根据用户使用的架构检查用户DN的uniqueMember,roleOccupant等属性。
2014年

1
@Gunslinger LDAP属性名称和值不区分大小写,也不是DN,但是AD有其自己的规则...
Lorne侯爵(Marquis of Lorne),2014年

35

如果您使用Linux服务器上常见的OpenLDAP(即slapd),则必须使用(memberOf = XXX)属性启用memberof叠加层以使其能够与过滤器进行匹配。

同样,启用叠加后,它不会更新现有组的memberOf属性(您将需要删除现有组,然后再次将其重新添加)。如果启用了覆盖图,那么当数据库为空时,您应该可以。


8
我想,一个解释如何启用memberof overlay的页面的链接将很有用。
Gokhan Sari 2014年

5
对我 有用的教程:schenkels.nl/2013/03/…@Telford Tendrys,老兄,您对这条关于现有群体的通知拯救了我的性命。非常感谢!
ŁukaszBachman

21

我还要在Marc的答案中添加另外一件事:memberOf属性不能包含通配符,因此您不能说“ memberof = CN = SPS *”之类的东西,并且期望它找到以“ SPS”开头的所有组。


感谢您提供的信息。我一直在努力做你说不能做的事情。我怎样才能用PHP做到这一点?是否可以通过其他方式获得相同的结果?要找到所有以SPS开头的组,然后是任何东西...我可以随时抓取所有内容并循环排列数组,然后预匹配与所需的CN,但我更喜欢尽可能地直接搜索它。
ODelibalta

15

您必须将查询库设置为有问题的用户的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)'

如果要查看他所属的所有组,只需在搜索中仅请求'memberof'属性即可,如下所示:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host **memberof**
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.