2011-02-09 1 views
0

Я пытаюсь подключиться к домену Active Directory (W2K8R2 DC) в другом лесу. С этой целью я передать полномочия в следующий конструктор DirectoryEntry:Как сохранить учетные данные подключений через вызовы в System.DirectoryServices?

DirectoryEntry(string path, string username, string password, AuthenticationTypes authenticationType) 

Это все хорошо. То, что я хотел бы хотел бы сделать, хотя и сохраняет соединение как-то и повторно использовать его во всех моих вызовах в AD, чтобы мне не нужно было передавать учетные данные повторно. Возможно ли это как-то?

Спасибо!

+0

Я только что узнал, что System.DirectoryServices.AccountManagement содержит такие функции; это не сработает для меня, потому что мне нужно получить доступ к произвольным полям из Active Directory. – Sleepless

ответ

4

Если вы хотите контролировать уровень соединения, я рекомендую вам использовать System.DirectoryServices.Protocol. Вы можете повторно использовать соединение LDAP для создания разных запросов LDAP. Однако парадигма программирования очень отличается от DirectoryEntry

Если вам нужно использовать DirectoryEntry, вы должны хранить имя пользователя и пароль где-нибудь, а затем передать их всем DirectoryEntry объектов. Что бы я сделал, так это написать метод GetDirectoryEntry(string dn) и создать этот метод для DirectoryEntry для меня с правильным именем пользователя и паролем. Это не выглядит элегантно, но это не делает ничего плохого. Если вам нужен пароль, хранящийся в памяти в виде обычного текста, используйте SecureString для хранения пароля.

Это не что иное, потому что DirectoryEntry поддерживает собственный пул соединений LDAP. Если у вас есть несколько DirectoryEntry с тем же именем пользователя и паролем, он будет достаточно умным, чтобы разделить соединение LDAP. Это в основном то же самое, что и одно соединение LDAP и выполнение разных запросов LDAP. Он не собирается повторно аутентифицировать сервер LDAP для каждого из объектов DirectoryEntry.

Если вам не нравится полагаться на функцию черного ящика от DirectoryEntry, следующее предлагаемое решение может помочь вам почувствовать себя лучше.

static DirectoryEntry GetObject(DirectoryEntry root, string dn) 
{ 
    using (DirectorySearcher searcher = new DirectorySearcher(root)) 
    { 
     searcher.Filter = "(distinguishedName=" + dn + ")"; 
     searcher.SearchScope = SearchScope.Subtree; 
     SearchResult result = searcher.FindOne(); 
     if (result == null) return null; 
     return result.GetDirectoryEntry(); 
    } 
} 

Вам просто нужно привязать корневой объект с помощью имени пользователя и пароля. Затем вы можете сохранить корневой объект как статическую переменную или как угодно. Затем вы получаете еще один объект DirectoryEntry, выполнив запрос LDAP с SearchRoot, установленным для вашего корневого объекта. Возвращенный DirectoryEntry по-прежнему будет использовать имя пользователя и пароль от root. Опять же, это не делает ничего лучше, чем просто передавать имя пользователя и пароль на DirectoryEntry. Действительно, по производительности, это хуже, потому что нам нужно сделать еще один запрос LDAP для получения DirectoryEntry

+0

Отлично - это выглядит очень осуществимо; Я думаю, что пойду для метода DirectorySearcher. Большое вам спасибо за отличный и подробный ответ! – Sleepless

+0

Это красиво. Мне нужно было знать, действительно ли «DirectoryEntry» поддерживает свой собственный пул соединений LDAP, и если я действительно должен создавать новый «DirectoryEntry» и связанный с ним «DirectorySearcher» каждый раз, когда я хотел бы запросить AD, а не синглтон. Это помогло ответить на мой вопрос и скомпоновать мой код в уверенности, что накладные расходы при создании LDAP-соединения выполняются только один раз, а все другие экземпляры 'DirectoryEntry' используют возможности пула соединений и, если это возможно, избегают накладных расходов LDAP. Благодаря! – bradykey

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

  • Нет связанных вопросов^_^