DirectorySearcher FindOne() задержка при начальном выполнении
Я вижу начальную задержку в 2-5 секунд между временем выполнения DirectorySearcher FindOne() и первым увиденным сетевым пакетом, выходящим на сервер LDAP. После первоначального выполнения последующие выполнения завершаются мгновенно в течение примерно 45 секунд. После этого периода быстрых выполнений следующее выполнение будет отложено, и снова все последующие исполнения будут завершены немедленно. Кажется, что происходит какое-то кэширование, но я не смог найти никаких ресурсов, подтверждающих это или описывающих причину первоначальной задержки.
Мы заметили это на клиентском сервере Windows 2008, а затем воспроизвели на наших собственных коробках Windows 2008 и Windows 7.
Вот как выглядит мое простое приложение.NET 4.0 C#. Задержка происходит между сообщениями "Запущено" и "Завершено".
Любая идея, почему эта задержка происходит при начальном выполнении FindOne ()? Любая помощь высоко ценится!
using System;
using System.Collections.Generic;
using System.Text;
using System.DirectoryServices;
namespace LdapTest
{
class Program
{
static void Main(string[] args)
{
string[] fetchAttributes;
fetchAttributes = new string[] { "{string[0]}" };
using (DirectoryEntry searchRoot = new DirectoryEntry("LDAP://localserver/ou=lab,dc=ourdomain,dc=com", "cn=binduser,ou=Services,dc=ourdomain,dc=com", "Password", AuthenticationTypes.ReadonlyServer))
{
using (DirectorySearcher searcher = new DirectorySearcher(searchRoot, "(sAMAccountName=UserName)", fetchAttributes, SearchScope.Subtree))
{
Console.WriteLine("Started");
SearchResult result = searcher.FindOne();
Console.WriteLine("Finished");
}
}
}
}
1 ответ
В соответствии со статьей LDAP ADsPath MSDN, вы должны указать ServerBind
Отметьте, если ваш связующий путь LDAP указывает на сервер, чтобы избежать ненужного сетевого трафика. Также рекомендуется указать полное DNS-имя сервера. В дополнение ReadonlyServer
Флаг не имеет смысла при указании на сервер. Поэтому мое первое предложение состоит в том, чтобы заменить ReadonlyServer
флаг с ServerBind
(и желательно дать полное DNS-имя), или удалите серверную часть строки (в вашем примере, сделайте это LDAP://ou=lab,dc=ourdomain,dc=com или LDAP://ourdomain.com/ou= лабораторный, dc = ourdomain, DC = COM).
Еще одна вещь, на которую стоит обратить внимание, это то, что вы предоставляете имя пользователя с отличительным именем. Если вы посмотрите на базовый API-интерфейс, который использует DirectoryEntry, IADsOpenDSObject:: OpenDSObject, он требует, чтобы флаг lpReserved [the AuthenticationTypes
параметр в DirectoryEntry] равен нулюNone
] или включает в себя ADS_USE_SSL [SecureSocketsLayer
] флаг при передаче отличительного имени для имени пользователя. Обратите внимание, что SecureSocketsLayer
флаг требует, чтобы Active Directory требовал установки сервера сертификатов, прежде чем вы сможете использовать этот флаг. Возможно, вы захотите передать имя пользователя в другом формате.
Наконец, на этой странице MDSN говорится, что без каких-либо флагов аутентификации имя пользователя и пароль отправляются открытым текстом. Вы должны добавить Secure
флаг.