我看到从执行DirectorySearcher FindOne()到看到的第一个网络数据包到LDAP服务器的时间之间的初始延迟为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");
}
}
}
}
最佳答案
根据LDAP ADsPath MSDN article,如果绑定(bind)的LDAP路径指向服务器,则应指定ServerBind
标志,以避免不必要的网络通信。它还建议提供服务器的完整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标志[DirectoryEntry中的AuthenticationTypes
参数]为零[None
]或包含ADS_USE_SSL [SecureSocketsLayer
]标志。请注意,SecureSocketsLayer
标志要求Active Directory要求先安装证书服务器,然后才能使用此标志。您可能想要以其他格式传递用户名。
最后,this MDSN page说,没有任何身份验证标志,用户名和密码将以明文形式发送。您应该添加Secure
标志。