Почему изменение основной группы пользователя с «Пользователи домена» в Active Directory блокирует рекурсивный поиск пользователей?

Учитывая следующую простую иерархию 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 будет пропущен просто потому, что его основная группа не настроена ни на «Пользователи домена», ни на «Гости домена»? Кроме того, какие еще группы можно установить в качестве основной группы, чтобы 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

person Jason    schedule 26.05.2011    source источник


Ответы (1)


Если вы проверите свойство "memberOf" объекта в Active Directory (проверьте, например, свою учетную запись), вы увидите, что оно не включает вашу основную группу (которая, скорее всего, "Пользователи домена"). Вы можете узнать, что является основной группой человека, взглянув на свойство «primaryGroupID», которое равно «513», если вашей основной группой являются пользователи домена.

Точно так же, если вы отметите свойство «член» в «Пользователи домена», вы не увидите людей, которые имеют пользователей домена в качестве основной группы.

Я помню, как где-то читал, что это делается из соображений производительности (конечно, сейчас я не могу найти статью), так как наличие группы со слишком большим количеством участников может повлиять на производительность при некоторых обстоятельствах.

Вероятно, метод GetMembers из GroupPrincipal не ищет пользователей, для которых группа является основной (т. е. не проверяет атрибут PrimaryGroupId), поэтому вы не видите ни одного из участников.

В этой статье объясняется, как разрешить первичную группу для пользователя. Я думаю, вы сможете использовать изложенные здесь концепции для решения своей проблемы: Как использовать атрибут PrimaryGroupID для поиска основной группы пользователя

person Paolo Tedesco    schedule 26.05.2011
comment
Блестящий. Спасибо, Паоло! Я заметил, что он что-то делает с основной группой через Resharper (например, ADStoreCtx.GetGroupMembership(GroupPrincipal g, bool recursive)); однако я не мог понять, как он использовал его в своем поиске. - person Jason; 26.05.2011