上初始执行的DirectorySearcher FindOne()延迟(DirectorySearc

2019-07-03 20:51发布

我看到的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");
            }
        }
    }
}

Answer 1:

按照LDAP Active Directory路径MSDN文章 ,您应该指定ServerBind如果绑定LDAP路径指向一个服务器,以避免不必要的网络流量标记。 委员会还建议给服务器的完整DNS名称。 此外, ReadonlyServer指向服务器时,标志是无意义的。 所以我的第一个建议是,以取代ReadonlyServer与标志ServerBind (最好给出完整的DNS名称),或删除字符串的服务器部分(在你的榜样,让LDAP:// OU =实验室,DC = ourdomain,DC = COM或LDAP://ourdomain.com/ou=lab,dc=ourdomain,dc=com)。

另外要看看是你提供的专有名称的用户名。 如果你看那个的DirectoryEntry使用,核心API IADsOpenDSObject :: OpenDSObject ,它要求lpReserved标志[在AuthenticationTypes中的DirectoryEntry参数]为零[ None ]或包括ADS_USE_SSL [ SecureSocketsLayer ]标志的用户名通过一个专有名称时。 需要注意的是SecureSocketsLayer标志要求的Active Directory需要一个证书服务器安装才能使用此标志。 你可能想通过用户名以不同的格式。

最后, 这MDSN页说,没有任何认证标志,用户名和密码发送明文。 您应该添加的Secure标志。



文章来源: DirectorySearcher FindOne() delay on initial execution