Когда мне нужно доменное имя и доменный контейнер для создания PrincipalContext?

Я занимаюсь разработкой библиотеки C# .NET Framework для доступа к активной директории.

Одна из вещей, которую я должен сделать, это собрать всех пользователей AD, и я вижу, что:

PrincipalContext principalContext =
    new PrincipalContext(ContextType.Domain,
                            domainName.Trim(),
                            domainContainer.Trim());

А также

PrincipalContext principalContext = new PrincipalContext(ContextType.Domain);

Возвращает тех же пользователей с этим кодом:

// define a "query-by-example" principal - here, we search for all users
UserPrincipal qbeUser = new UserPrincipal(principalContext);

// create your principal searcher passing in the QBE principal    
PrincipalSearcher srch = new PrincipalSearcher(qbeUser);

// find all matches
foreach (var found in srch.FindAll())
{
    UserPrincipal user = found as UserPrincipal;
    if (user != null)
    {
        Console.WriteLine(user.SamAccountName);
    }
}

Когда мне нужно использовать доменное имя и контейнер домена?

2 ответа

Решение

Когда используешь

var context = new PrincipalContext(ContextType.Domain);

Он подключится к домену текущего контекста, обычно к домену, в который вошел пользователь, запустивший приложение, или выдаст исключение, если текущий контекст является локальным пользователем, не подключенным к домену.

Когда используешь

var context = new PrincipalContext(ContextType.Domain, domainName, domainContainer);

Свойство домена позволяет подключаться к домену, отличному от текущего контекста, при условии, что текущий контекст имеет разрешения или вы предоставляете действительные учетные данные. Так, например, в среде, где существует несколько доменов в лесу или доверяет домену, вы можете указать другой домен для выполнения запросов вместо того, членом которого является пользователь.

Свойства контейнера ограничивают все запросы, использующие это DomainContext в указанный контейнер.

Контекст используется для создания записи каталога таким образом:

new DirectoryEntry("LDAP://domain_name/container")

или когда нет контейнера:

new DirectoryEntry("LDAP://domain_name/rootDse")

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

Вы должны включить контейнер, если хотите ограничить поиск определенным подразделением.

Другие вопросы по тегам