为什么 DirectoryEntry 属性需要 10 个小时才能达到 return?

Why would it take 10 hours for DirectoryEntry Properties to return?

我们正在对测试广告中的数千名用户进行枚举。整个事情可以 运行 大约一个小时。但是有时候,对于单个用户来说,下面几行代码会卡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...
            }
        }

经过长时间的延迟后,事情继续进行,好像没有任何问题。

什么会导致这种延迟?

TL;DR 启用 AuthenticationTypes.Secure 来解决这个问题。

我创建了一个能够按需重现此问题的测试应用程序。测试应用程序所做的只是启动 4 个线程,每个线程包含一个无限循环。在 while 循环中,我创建了一个新的 DirectoryEntry 并在其上调用了 RefreshCache。很多时候,尤其是在启动时,其中一个线程会遇到以下异常

COMException -2147016643 "A decoding error has occurred."

此错误也称为 0x8007203D 又名 -2147016643 又名 2147950653

当其中一个线程出现此异常时,一个或多个其他线程将挂起对 RefreshCache 的调用。

在 DirectoryEntry 构造函数中我们没有包含 AuthenticationTypes.Secure。 Secure 是默认标志,但因为我们设置了其他 AuthenticationTypes 标志,所以我们也应该手动包含 Secure。不知道为什么,但是当启用安全模式时,DirectoryServices 在多线程下表现得更好。