【发布时间】:2014-07-25 15:51:01
【问题描述】:
我尝试在 C# 中获取 Active Directory 组的所有成员。我的代码如下:
var searcher = new DirectorySearcher(defaultNamingContextEntry) {
Filter = "(memberOf=" + group.Properties["distinguishedName"].Value + ")",
PageSize = 1000,
SearchScope = SearchScope.Subtree,
Sort = new SortOption("sAMAccountName", SortDirection.Ascending)
};
var members = searcher.FindAll();
到目前为止,该代码工作正常,但存在的问题是它不返回所有组成员。
我相信(我不确定)它返回了我在 ADSI Edit 中实际看到的“成员”属性(有问题的组有点大,无法比较所有内容,但远低于 1000),但这些是不是所有成员。根据 AD 用户和计算机,该组中有未列出的用户。如果我查看“Member Of”页面,我可以看到组,并且通过组的 ACL 设置也会影响丢失的用户。但是,它们不在结果集中。
如果相关,相关组是主要组。
这里有什么问题?什么是正确的参数或查询?这是广告本身的问题吗?
更新:我已经进一步调查了这个问题(并测试了Brian的解决方案,如果你的属性集合真的很大,我强烈建议这样做;我认为属性必须有某种分页机制,但找不到它是如何工作的):
我现在知道DirectorySearcher 返回ADSI 编辑中看到的正确结果。
我还知道缺少“主要组”(由 AD 用户和计算机中“成员”页面上的“设置主要组”按钮设置)。 AD中启用了Unix扩展,所以我们通常使用这个选项。更改主要组会更改缺少哪些成员。效果是确定性的。
我使用 ADSI 编辑查看了条目,但找不到允许我在搜索中添加主要组的字段。虽然我已启用所有内容(强制、可选、构造、反向链接和仅系统属性),但我看不到主要组。
我修改后的问题是:用于检索主要组的正确 LDAP 过滤器是什么?
【问题讨论】:
标签: c# active-directory ldap