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

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

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

有什么想法吗?

谢谢

567530 次浏览

您应该能够使用这个过滤器在这里创建一个查询:

(&(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 = 用户”)中的成员关系。它不处理嵌套成员关系,例如,用户 A 是 A 组的成员,而 A 是 B 组的成员——用户 A 实际上也是 B 组的成员这一事实并没有反映在这里。

马克

对于 Marc 的回答,我还要补充一点: memOf 属性不能包含通配符,所以你不能说“ memof = CN = SPS *”,然后期望它能找到所有以“ SPS”开头的组。

如果您正在使用 Linux 服务器上常见的 OpenLDAP (即 slapd) ,那么您必须启用 overlay 的成员,以便能够使用(member Of = XXX)属性与过滤器进行匹配。

此外,一旦启用了覆盖,它就不会更新现有组的 member Of 属性(您需要删除现有组并再次添加它们)。如果您启用了覆盖开始,当数据库是空的,那么您应该是确定的。

您必须将查询基础设置为相关用户的 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)'

如果你想看到他所属的所有组,只需要在你的搜索中请求“ member of”属性,像这样:

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