Получить всех пользователей из группы Active Directory - PullRequest
0 голосов
/ 12 октября 2018

Я использовал следующий код, чтобы получить всех пользователей из определенной группы Active Directory в определенном домене.Этот код работает нормально.

using (var context = new PrincipalContext(ContextType.Domain, "dept.mycomp.net"))
{
    using (var group = GroupPrincipal.FindByIdentity(context, "IT Team"))
    {
        if (group != null)
        {
            var users = group.GetMembers(true);

            foreach (UserPrincipal user in users)
            {
                Console.WriteLine("Name: " + user.DisplayName);
                Console.WriteLine("Network Id: " + user.SamAccountName);
            }
        }
    }
}

Я видел, что есть опция Entire Directory в окне поиска Active Directory.Поэтому я немного искал и нашел следующий код;этот код достанет мне всех пользователей с корневым уровнем Entire Directory.Этот код также работает нормально в моем случае:

var currentForest = Forest.GetCurrentForest();
var gc = currentForest.FindGlobalCatalog();

using (var userSearcher = gc.GetDirectorySearcher())
{
    userSearcher.Filter = "(&((&(objectCategory=Person)(objectClass=User)))(samaccountname=" + username + "))";
    SearchResult result = userSearcher.FindOne();
}

Вопрос : как бы я изменил более поздний код, чтобы получить всех пользователей для определенной группы на корневом уровне?Я бы пропустил только GroupName вместо Domain & Group Name.

1 Ответ

0 голосов
/ 15 октября 2018

Опция Entire Directory ищет в Глобальном каталоге, а не только в домене, как вы, похоже, узнали.Единственная разница в поиске заключается в том, к какому порту он подключается.Порт 389 - это порт LDAP, который ищет только домен сервера, к которому вы подключаетесь.Порт 3268 является глобальным каталогом.В краткой форме для этого используется GC:// вместо LDAP://.

Если вы работаете только в одной среде, в которой вы знаете домен, вы можете просто жестко его кодировать.Это сохранит сетевые запросы GetCurrentForest() и FindGlobalCatalog().

. Это то, что я имею в виду:

var searcher = new DirectorySearcher(new DirectoryEntry("GC://dept.mycomp.net"));

На ваш другой вопрос поиска определенной группы: Сохранитьпомните, что глобальный каталог выполняет поиск в вашем лесу AD, в котором может быть несколько доменов.Имена любого объекта применяются только уникально в домене, а не в лесу.Поэтому, если вы ищете в GC имя группы, вы можете получить дубликаты.(во всех ваших доменах может быть группа "IT Team")

Но в любом случае, если мы предположим, что у вас есть только одна группа с таким именем во всем вашем лесу, вы будете искать ее иполучить членов:

var groupname = "IT Team";
var members = new List<string>();
using (var searcher = new DirectorySearcher(new DirectoryEntry("GC://dept.mycomp.net"))) {
    searcher.Filter = "(&(objectCategory=group)(objectClass=group)(cn=" + groupname + "))";
    searher.PropertiesToLoad.Add("member"); //only get the member attribute

    using (SearchResult result = searcher.FindOne()) {
        foreach (var member in result.Properties["member"]) {
            members.Add(member);
        }
    }
}

Когда это завершится, members будет список distinguishedName каждого члена.Если вам нужен другой атрибут (например, displayName), вам нужно будет создать DirectoryEntry для каждого члена и получить этот атрибут.

Существует несколько предостережений, которые могут иметь или не иметь отношение:

  1. В этой группе могут быть группы.Это не ищет членов этих групп.
  2. Если ваш домен доверяет другому домену за пределами вашего леса, то члены этого внешнего домена отображаются по-разному.Я говорил об этом в посте, который я сделал на своем сайте, под названием Что делает члена участником?
  3. Это может ограничивать число участников, которых вы видите, не более 1000 (еслигруппа насчитывает более 1000 членов).Я не могу вспомнить, если это случится с этим методом.Я знаю, что это происходит при чтении атрибута 'member' из DirectoryEntry.Если ваша группа не такая большая, то это не проблема.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...