Я пытаюсь найти компонент домена через службы Active Directory с использованием PrincipalContext.
Я создал PrincipalContext, используя очень мало параметров:
PrincipalContext theContext = new PrincipalContext(ContextType.Domain);
theContext возвращается правильно. Я могу сделать много запросов и получить ожидаемые результаты. Но то, что я действительно хотел бы сделать, это эквивалент:
Console.WriteLine("Domain Component: " + theContext.Container);
Согласно MSDN, это только «Получает значение, указанное в параметре контейнера в конструкторе». Поскольку я ничего не прошел, я ничего не получаю.
Но теоретический контейнер содержит доменные компоненты, которые необходимы для любых отличительных имен, которые вам может понадобиться использовать или создать. Я специально ищу нового пользователя в организационной единице, который, я знаю, будет там. Но, поскольку я не знаю компонентов домена, я не могу создать отличительное имя. Я не видел поддержки относительных путей.
Лучший вариант, который я нашел, - это выполнить поиск любого пользователя, а затем получить его отличительное имя и отрубить часть "dc".
var searchUser = new UserPrincipal(theContext);
var searcher = new PrincipalSearcher(searchUser);
Principal aUser = searcher.FindOne();
if (aUser != null)
{
string dn = aUser.DistinguishedName;
Console.WriteLine(dn.Substring(dn.IndexOf("dc=", StringComparison.InvariantCultureIgnoreCase)));
}
Это похоже на плохой хак; слишком много может пойти не так. Я надеюсь, что есть что-то лучшее. У кого-нибудь есть идея?