在单个查询中递归地查找给定 SAM 帐户的所有 AD 组

Find All AD groups recursively given SAM account in single query

是否可以根据用户的 SAM 帐户标识符递归检索所有 AD 组?

我一直在使用以下 ldapsearch 过滤器

ldapsearch -D 'domain\john.doe' -W -h 'ldap.domain.com' -b 'DC=domain,DC=local' '(member:1.2.840.113556.1.4.1941:=CN=John Doe,OU=Users,OU=World,DC=domain,DC=local)' dn

查询我们的本地 LDAP 服务器(基于 AD)以检索用户的 AD 组,但这是一个两步过程,因为我需要用户的完整 DN。

以前我曾经通过非递归过滤器获取用户的直接组:

ldapsearch -D 'domain\john.doe' -W -h 'ldap.domain.com' -b 'DC=domain,DC=local' '(|(userPrincipalName=john.doe@domain.com)(sAMAccountName=john.doe))' dn

是否可以实现第一个查询的结果(递归所有 AD 组)和第二个查询的单个步骤(因为我只需要知道用户名的用户的电子邮件地址

不,你不能不执行多个查询。

如果您的服务器基于 AD,它可能会使用 memberOf 属性,在这种情况下您可以在一个查询中获取用户组,但 没有嵌套组 :

ldapsearch -D 'domain\john.doe' -W -h 'ldap.domain.com' -b 'DC=domain,DC=local' '(|(userPrincipalName=john.doe@domain.com)(sAMAccountName=john.doe))' memberOf

如果我们可以在上面的查询中使用可扩展匹配作为属性请求,使用 memberof:1.2.840.113556.1.4.1941: 而不是 memberOf,那就太好了,但它不是您可以获取的维护属性搜索组时的值,它只能用于过滤器中的可扩展匹配(参见 LDAP_MATCHING_RULE_IN_CHAIN),并且它特定于 AD(未在 OpenLDAP 中实现)。

另一方面,您可以使用过滤器 member:1.2.840.113556.1.4.1941: 搜索组,但问题恰恰是它首先需要知道用户的 dn。

有人可能会想到使用过滤器匹配 memberUid 和用户登录或 sAMAccountName 来查询群组,但这取决于您的目录中是否维护了此属性,而我'我很确定你不能与这个过滤器有可扩展的匹配,这意味着这个过滤器不能匹配嵌套的组成员。

因此,最后您需要使用第二个查询来获取所有用户的 dn,并为每个用户构建查询以获取该用户的组成员资格,包括嵌套组。