Если вам нужен элемент управления на уровне соединения, я рекомендую вам использовать 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