为什么在Active Directory中从“域用户”更改用户的“主要组”会阻碍对用户的递归搜索?

时间:2011-05-26 05:10:09

标签: c# .net active-directory ldap directoryservices

给出以下简单的OU / Group层次结构:

OU=MyApplication
    CN=CompanyClients(objectClass="group"; Members="Clients\Client1")
    OU=Clients
        CN=Client1(objectClass="group"; Members=".\client1-emp1; .\client1-emp2")
        CN=client1-Emp1 (objectClass="user"; Primary Group="Client1")
        CN=client1-Emp2 (objectClass="user"; Primary Group="Domain Users")

为什么以下递归搜索会省略client1-emp1,因为它的主要组未设置为“Domain Users”或“Domain Guests”?此外,还可以将其他组设置为主要组,以便将emp1成功包含在搜索中?

using System.DirectoryServices.AccountManagement;

var ctx = new PrincipalContext(ContextType.Domain, "mydomain.org");
var group = GroupPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, "CompanyClients");

var results = group.GetMembers(recursive:true);
//results excludes client1-emp1 but includes client1-emp2
foreach (var principal in results)
{
    Debug.WriteLine("Principal:" + principal.SamAccountName);
}

结果:

Principal: client1-emp2

1 个答案:

答案 0 :(得分:2)

如果您检查Active Directory中对象的“memberOf”属性(请检查您自己的帐户),您会看到 包含您的主要群组(很可能是“域用户”) “)。您可以通过查看“primaryGroupID”属性来查看某个人的主要组,如果您的主要组是“域用户”,则该属性为“513”。

同样,如果您检查“域用户”的“成员”属性,则看不到将域用户作为主要用户的人。

我记得在某处读到这是出于性能原因(当然现在我找不到文章),因为在某些情况下,拥有太多成员的小组会影响性能。

GetMembers的{​​{1}}方法可能不会搜索将该组作为主要组的用户(即它不检查PrimaryGroupId属性),这就是为什么你没有看到其中一个成员。

本文介绍了如何为用户解析主要群组,我认为您应该能够使用此处说明的概念来解决您的问题:How to use the PrimaryGroupID attribute to find the primary group for a user