Answers:
您应该可以在此处使用此过滤器创建查询:
(&(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的成员这一事实在这里没有得到体现。
马克
如果您使用Linux服务器上常见的OpenLDAP(即slapd),则必须使用(memberOf = XXX)属性启用memberof叠加层以使其能够与过滤器进行匹配。
同样,启用叠加后,它不会更新现有组的memberOf属性(您将需要删除现有组,然后再次将其重新添加)。如果启用了覆盖图,那么当数据库为空时,您应该可以。
我还要在Marc的答案中添加另外一件事:memberOf属性不能包含通配符,因此您不能说“ memberof = CN = SPS *”之类的东西,并且期望它找到以“ SPS”开头的所有组。
您必须将查询库设置为有问题的用户的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**