2011-01-29 5 views
2

Я пытаюсь выяснить компонент домена через службы Active Directory с помощью PrincipalContext.Найти компонент домена из PrincipalContext

Я создал PrincipalContext используя очень мало параметров:

PrincipalContext theContext = new PrincipalContext(ContextType.Domain); 

theContext возвращается правильно. Я могу запросить много вещей и получить ожидаемые результаты. Но то, что я действительно хотел бы сделать, это эквивалент:

Console.WriteLine("Domain Component: " + theContext.Container); 

Согласно MSDN, это только «Получает значение, указанное в параметре контейнера в конструкторе.» Поскольку я ничего не прошел, я ничего не получаю.

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

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

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))); 

} 

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

ответ

4

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

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

LDAP://RootDSE 

Вот как вы можете получить его с помощью DirectoryEntry

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

Это подействовало. Благодарю. –

Смежные вопросы