Требование уникальности имени группы Active Directory (запрос от клиента C #)

Продукт C # нашей компании использует System.DirectoryServices.AccountManagement для запроса Active Directory для пользователей и групп. Мы используем следующий метод для получения принципала:

...
PrincipalContext principalContext = new PrincipalContext(ContextType.Domain);
return principalContext;
...

Мы получаем группы Active Directory, используя (например, groupName = "Devs"):

...
GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(this.principalContext, groupName);
...

Все работает нормально с этой настройкой, когда мы запускаем ее в простой базе данных Active Directory с одним доменом.

У меня вопрос: что произойдет, если мы запустим этот код в большом лесу с более чем одной группой разработчиков? Может ли в лесу быть более одной группы безопасности «Разработчики»? Если да, то как это разрешит "Devs"? Надо ли переходить на использование метода:

public static GroupPrincipal FindByIdentity(
    PrincipalContext context,
    IdentityType identityType,
    string identityValue
)

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


person Anda    schedule 25.09.2015    source источник
comment
Под дубликатами Devs я подразумеваю, что есть группы с именем Devs, но они принадлежат к разным доменам и т. Д. Вероятно, им нужно иметь разные отличительные имена.   -  person Anda    schedule 25.09.2015


Ответы (1)


Поиск в иерархии доменов - довольно распространенная задача. С помощью классов AccountManagement вы можете делать следующее:

// Connect to global catalog of the forest
var context = new PrincipalContext(ContextType.Domain, "contoso.com:3268", "DC=contoso,DC=com");

// Build a filter principal by name and context
var groupFilter = new GroupPrincipal(context) {Name = "Devs"};

// Build a searcher with a filter applied
var searcher = new PrincipalSearcher(groupFilter);

// This should return all groups in all subdomains matching specified name
var groups = searcher.FindAll().ToList();

foreach (var group in groups)
{
    Console.WriteLine(group.DistinguishedName);
}

У вас не будет дубликатов, потому что в домене не может быть более одной группы с таким именем («Разработчики»). В терминах AccountManagement вы создаете объект GroupPrincipal с параметрами контекста и имени и не может иметь более одного в контексте с тем же именем.

Если вы подключаетесь к контроллеру домена (new PrincipalContext(ContextType.Domain)), тогда FindByIdentity будет искать этот единственный домен. Если вы подключитесь к глобальному каталогу леса (как в моем примере, порт 3268), тогда FindByIdentity будет искать весь лес. Свойство DistinguishedName покажет, к какому домену принадлежит группа.

Что касается доступа между лесами, вам необходимо подключиться к глобальному каталогу в каждом лесу отдельно, потому что нет репликации данных пользователя / группы между глобальными каталогами лесов.

person Mikhail Tumashenko    schedule 28.09.2015
comment
Я определенно могу это сделать. А как насчет междоменных дубликатов? Что делать, если в лесу более одного домена? Например. contoso.com, contoso.ca и contoso.ru обрабатываются лесом Active Directory. Имеет ли значение, откуда приложение входит в систему (из какого домена)? Может ли он получить доступ ко всем доменам (.com / .ca / ru), если есть доверие? Если да, то что произойдет, если во всех трех доменах есть «разработчики»? - person Anda; 28.09.2015
comment
GroupPrincipal не может иметь междоменного дубликата, потому что он содержит свойство контекста, которое представляет домен, к которому принадлежит группа. В одном дереве может быть несколько групп разработчиков, но они должны находиться в разных доменах (контекстах). Что касается межлесного доступа, вам нужно подключиться к глобальному каталогу в каждом лесу отдельно, потому что нет репликации данных пользователя / группы между глобальными каталогами лесов. - person Mikhail Tumashenko; 28.09.2015
comment
Превосходно. Итак, если я вхожу в систему с приложением из домена D1 и выполняю GroupPrincipal.FindByIdentity (this.principalContext, groupName), то он найдет точную группу «Devs» в контексте, который я приобрел, когда получил объект PrincipalContext (т. Е. Из домен D1). Если каким-то образом параметр groupName содержит отличительное имя группы из другого контекста, связанного с другим доменом D2, я предполагаю, что ничего не будет возвращено, потому что this.principalContext был получен из текущего домена. Можно ли в этом случае проверить разные контексты в дереве? - person Anda; 28.09.2015
comment
Если вы подключаетесь к контроллеру домена (новый PrincipalContext (ContextType.Domain), тогда FindByIdentity будет искать этот единственный домен. Если вы подключаетесь к глобальному каталогу леса (как в моем примере, порт 3268), тогда FindByIdentity будет искать весь лес. DistinguishedName покажет, к какому домену принадлежит группа. - person Mikhail Tumashenko; 28.09.2015
comment
Помечено как ответ. Спасибо. - person Anda; 28.09.2015
comment
Прости за это. Это мой первый вопрос на этом сайте (хотя я использую его ежедневно). :-) - person Anda; 29.09.2015