DirectorySearcher FindOne()在初始执行时延迟

coo*_*raa 6 c# directoryservices ldap

我看到执行DirectorySearcher FindOne()和我看到的第一个网络数据包之间的初始延迟时间为2-5秒.初始执​​行后,后续执行立即完成约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");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Sea*_*all 3

根据LDAP ADsPath MSDN 文章ServerBind如果您的绑定 LDAP 路径指向服务器,则应指定该标志,以避免不必要的网络流量。它还建议提供服务器的完整 DNS 名称。此外,该ReadonlyServer标志在指向服务器时没有任何意义。所以我的第一个建议是将ReadonlyServer标志替换为ServerBind(最好给出完整的 DNS 名称),或删除字符串的服务器部分(在您的示例中,将其设为 LDAP://ou=lab,dc=ourdomain,dc=com或 LDAP://ourdomain.com/ou=lab,dc=ourdomain,dc=com)。

另一件需要注意的事情是您通过专有名称提供用户名。如果您查看 DirectoryEntry 使用的核心 API IADsOpenDSObject::OpenDSObject,您会发现它要求 lpReserved 标志 [ AuthenticationTypesDirectoryEntry 中的参数] 为零 [ ] 或在传递用户名的可分辨名称时None包含 ADS_USE_SSL [ ] 标志。SecureSocketsLayer请注意,该SecureSocketsLayer标志要求 Active Directory 要求先安装证书服务器,然后才能使用该标志。您可能想以不同的格式传递用户名。

最后,此 MDSN 页面表示,在没有任何身份验证标志的情况下,用户名和密码将以明文形式发送。您应该添加该Secure标志。