【问题标题】:How to write LDAP query to test if user is member of a group?如何编写 LDAP 查询来测试用户是否是组的成员?
【发布时间】:2010-11-05 03:56:38
【问题描述】:

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

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

有什么想法吗?

谢谢

【问题讨论】:

标签: ldap


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    (&(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,这个 sn-p 应该可以解决问题:

    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 组的成员,而 A 组是 B 组的成员 - 用户 A 实际上也是 B 组的成员这一事实并未在此处得到体现。

    马克

    【讨论】:

    • 试过了,但仍然不适合我。在 memberOf 子句中应该是“OU=Users”还是“OU=Groups”?
    • 这是我的查询:(&(objectClass=person)(sAMAccountName=USERID)(memberof='CN=SPSAdmins,OU=Groups,OU=MYTOWN,OU=Germany,OU=MYCOMPANY,DC =MYTOWN,DC=MYCOMPANY,DC=com')) DN 真的那么长。我同意它应该起作用。感谢您的帮助!
    • 一时兴起,我删除了 memberof 之后的单引号,现在我得到了结果!谢谢
    • 好答案。但应该指出的是,它只适用于维护 'memberOf' 属性的 LDAP 服务器。更通用的技术是获取 group 对象并检查其 uniqueMember、roleOccupant 等用户 DN 属性,具体取决于组对象使用的架构。
    • @Gunslinger LDAP 属性名称和值不区分大小写,DN 也不区分大小写,但 AD 有自己的规则...
    【解决方案3】:

    如果您使用的是 Linux 服务器上常见的 OpenLDAP(即 slapd),那么您必须启用 memberof 覆盖层才能使用 (memberOf=XXX) 属性匹配过滤器。

    此外,启用覆盖后,它不会更新现有组的 memberOf 属性(您需要删除现有组并重新添加它们)。如果您启用了覆盖开始,当数据库为空时,您应该没问题。

    【讨论】:

    • 我猜一个指向解释如何启用 memberof 覆盖的页面的链接会很有用。
    • 对我有用的教程:schenkels.nl/2013/03/…@Telford Tendrys,老兄,你用这个关于预先存在的组的通知救了我的命。非常感谢!
    【解决方案4】:

    我会在 Marc 的回答中再添加一件事:memberOf 属性不能包含通配符,因此您不能说“memberof=CN=SPS*”之类的内容,并期望它找到所有以“开头的组” SPS”。

    【讨论】:

    • 感谢您提供的信息。我一直在努力做你说做不到的事情。我怎样才能用 PHP 做到这一点?是否有可能以另一种方式获得相同的结果?查找所有组都以 SPS 开头,然后是其他...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多