我们在测试AD中通过数千名用户进行了枚举。整件事可以在大约一个小时内完成。但有时,对于单个用户,以下几行代码将被卡住大约10个小时。
这并不总是会发生,当它发生时,它可能发生在任何AD用户身上。
using (DirectoryEntry de = new DirectoryEntry(String.Format(@"LDAP://{0}/<GUID={1}>", host, objectGUID), admin, password, server.AuthenticationMethod))
{
try
{
dn = (string)de.Properties["distinguishedName"][0];
}
catch
{
// log it...
}
}
经过长时间的延迟,事情就会继续,好像什么都没有错。
什么可能导致这种延迟?
答案 0 :(得分:0)
TL; DR启用AuthenticationTypes.Secure来解决此问题。
我创建了一个能够按需重现此问题的测试应用程序。所有测试应用程序都是启动4个线程,每个线程包含一个无限的while循环。在while循环中,我创建了一个新的DirectoryEntry并在其上调用了RefreshCache。通常,特别是在启动时,其中一个线程会遇到以下异常
COMException -2147016643 "A decoding error has occurred."
此错误也称为0x8007203D又名-2147016643又名2147950653
当在其中一个线程中看到此异常时,一个或多个其他线程将挂起对RefreshCache的调用。
在DirectoryEntry构造函数中,我们没有包含AuthenticationTypes.Secure。 Secure是一个默认标志,但由于我们设置了其他AuthenticationTypes标志,我们也应手动包含Secure。不确定原因,但启用安全模式时,DirectoryServices在多线程下表现得更好。