我看到在我执行LDAP FindOne()和我看到的第一个发往DirectorySearcher服务器的网络数据包之间有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");
}
}
}
}发布于 2012-11-26 22:24:36
根据LDAP ADsPath MSDN article,如果绑定的LDAP路径指向服务器,则应该指定ServerBind标志,以避免不必要的网络流量。它还建议提供服务器的完整DNS名称。此外,当指向服务器时,ReadonlyServer标志没有任何意义。因此,我的第一个建议是将ReadonlyServer标志替换为ServerBind (最好给出完整的DNS名称),或者删除字符串中的服务器部分(在您的示例中,将其设置为LDAP://ou=lab,dc=ourdomain,dc=com或LDAP://ourdomain.com/ou=lab,dc=ourdomain,dc=com)。
需要注意的另一件事是,您正在按可分辨名称提供用户名。如果查看DirectoryEntry使用的核心IADsOpenDSObject::OpenDSObject,就会发现它要求lpReserved标志DirectoryEntry中的AuthenticationTypes参数为零None,或者在为用户名传递可分辨名称时包含ADS_USE_SSL SecureSocketsLayer标志。注意,SecureSocketsLayer标志要求Active Directory要求先安装证书服务器,然后才能使用此标志。您可能希望以不同的格式传递用户名。
最后,this MDSN page说,在没有任何身份验证标志的情况下,用户名和密码是明文发送的。您应该添加Secure标志。
https://stackoverflow.com/questions/13406955
复制相似问题