Когда мне нужно доменное имя и доменный контейнер для создания 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")
Вы можете опустить доменное имя, но я бы предложил всегда включать его, так как у меня были проблемы с ним в прошлом (некоторые случайные исключения).
Вы должны включить контейнер, если хотите ограничить поиск определенным подразделением.