Если вы хотите контролировать уровень соединения, я рекомендую вам использовать 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
Я только что узнал, что System.DirectoryServices.AccountManagement содержит такие функции; это не сработает для меня, потому что мне нужно получить доступ к произвольным полям из Active Directory. – Sleepless