Найти компонент домена из PrincipalContext - PullRequest
2 голосов
/ 29 января 2011

Я пытаюсь найти компонент домена через службы 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)));

}

Это похоже на плохой хак; слишком много может пойти не так. Я надеюсь, что есть что-то лучшее. У кого-нибудь есть идея?

1 Ответ

5 голосов
/ 29 января 2011

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

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

LDAP://RootDSE

Вот как вы можете получить ее, используя DirectoryEntry

DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE");
string domainContext = rootDSE.Properties["defaultNamingContext"].Value as string;
...