为什么DirectoryEntry Properties需要10个小时才能返回?

时间:2015-10-13 15:14:56

标签: c# active-directory ldap directoryservices

我们在测试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...
            }
        }

经过长时间的延迟,事情就会继续,好像什么都没有错。

什么可能导致这种延迟?

1 个答案:

答案 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在多线程下表现得更好。