使用 DirectorySearcher 在 AD 搜索中包含主要组

Posted

技术标签:

【中文标题】使用 DirectorySearcher 在 AD 搜索中包含主要组【英文标题】:Include primary group in AD search with DirectorySearcher 【发布时间】:2017-10-18 15:14:07 【问题描述】:

我需要在我的 C# 应用程序中获取特定 Active Directory 组中所有用户和联系人的列表。使用哪个组是可变的,并通过配置文件进行更改。

由于 System.DirectoryServices.AccountManagement 无法处理联系人,我将 DirectoryServices API 与 LDAP 查询一起使用。

我对我的 DirectorySearcher 使用以下过滤器:

"(&(memberof:1.2.840.113556.1.4.1941:=" + groupDN +")(objectClass=person))"

groupDN 是源组的专有名称。

这适用于普通组,但应该可以将配置的组作为任何组,甚至是“域用户”。由于我们的 Domain Users 组实际上没有成员,而是用作主要组,因此当组为“Domain Users”时,上述过滤器返回 0 个结果。

我知道您可以使用过滤器搜索主要组成员身份:

(primaryGroupId=513)

但这不包括与域用户类似的其他组(如果您愿意,也可以称为“主要组”)。

还有其他方法可以在搜索结果中包含主要组成员吗?

【问题讨论】:

【参考方案1】:

primaryGroupId 属性包含组 SID 的最后一部分(objectSid 属性)。以下 MS 文章描述了用于获取安全主体的主要组的技术:https://support.microsoft.com/en-us/help/297951/how-to-use-the-primarygroupid-attribute-to-find-the-primary-group-for

请注意,用于检索成员资格的链过滤器会从嵌套组返回用户,但在包含 10K+ 用户的域上存在性能问题

【讨论】:

我使用了像(&(|(memberof:1.2.840.113556.1.4.1941:=[groupDN])(primaryGroupId=[groupRID]))(objectClass=person)) 这样的过滤器,并从组的 SID 中提取了 RID。如果源组直接是“域用户”或任何非主组,则此方法有效。如果“域用户”是源组的子组,则它不起作用。你知道有什么办法可以处理这种情况吗? 好的,现在我明白了。您正在寻找嵌套组和用户,这些组被设置为主要组。我用递归广告查询解决了这个问题。根据我的经验,进行递归分页查询然后使用链过滤器会更有效。此类查询的一个很好的示例可以在 .net 开发人员指南目录服务编程手册中找到。如果您使用 Active Directory 和 c#,这是一本必备书

以上是关于使用 DirectorySearcher 在 AD 搜索中包含主要组的主要内容,如果未能解决你的问题,请参考以下文章

Actiove Directory的DirectoryEntry与DirectorySearcher初识及Filter语法

检查AD组是不是存在

LdapConnection 与 DirectoryEntry

使用 AD 的服务帐户和用户帐户凭据连接到 Active Directory 以登录(在我的产品中)

我可以从 DirectorySearcher 获得超过 1000 条记录吗?

实现域登录 --- 介绍