6

我看到在执行 DirectorySearcher FindOne() 和我看到的第一个网络数据包发送到 LDAP 服务器之间存在 2-5 秒的初始延迟。初始执​​行后,后续执行会立即完成约 45 秒。在那段快速执行之后,下一次执行将被延迟,并且所有后续执行都将立即完成。似乎正在进行某种缓存,但我无法找到任何资源来确认或描述导致初始延迟的原因。

我们在客户端 Windows 2008 服务器上注意到了这一点,然后在我们自己的 Windows 2008 和 Windows 7 机器上进行了复制。

这是我的简单 .NET 4.0 C# 应用程序的样子。延迟发生在“Started”和“Finished”消息之间。

知道为什么在初始 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");
            }
        }
    }
}
4

1 回答 1

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标志。

于 2012-11-26T14:24:35.970 回答