.net UserPrincipal.Current从一天到下一天抛出COMException

zte4gxcn  于 2023-02-01  发布在  .NET
关注(0)|答案(1)|浏览(100)

今天早上我开始注意到我的几个程序在Active Directory读操作方面出现了一些问题。我注意到所有这些应用程序(客户端和服务器)都使用System.DirectoryServices.AccountManagement.UserPrincipal类进行这些读操作,而仍然正常运行的程序使用System.DirectoryServices.DirectorySearcher
因此,为了缩小问题的范围,我构建了以下非常简单的控制台应用程序

class Program
{
    static void Main(string[] args)
    {
        //this works great
        Console.WriteLine($"Enviroment.Username:{Environment.UserName}");

        //this works great
        PrincipalContext pcFull = new PrincipalContext(ContextType.Domain, "my.company.de", "dc=my,dc=company,dc=de");
        UserPrincipal upPrincipalContextFull = UserPrincipal.FindByIdentity(pcFull, Environment.UserName);

        //this doesn't work at all
        //Exception: “The specified directory service attribute or value does not exist”
        PrincipalContext pc = new PrincipalContext(ContextType.Domain);
        UserPrincipal upPrincipalContext = UserPrincipal.FindByIdentity(pc, Environment.UserName);

        //this doesn't either, same exception
        UserPrincipal upCurrent = UserPrincipal.Current;
        
        Console.ReadKey();
    }
}

正如您在注解中所看到的,后两个操作在我测试它的域中的每台计算机上都将失败,即使它们几年来一直完美地工作。当我调用UserPrincipal.CurrentUserPrincipal.FindByIdentity(pc, Environment.UserName);而没有在PrincipalContext中指定Container时,会发生以下异常:
System.Runtime.InteropServices.COMException: “The specified directory service attribute or value does not exist”
以下是我所知道的:

  • 在最近两周内,突然停止工作的应用程序都没有收到更新
  • 所有这些应用程序,UserPrincipal.Current-Property和UserPrincipal.FindByIdentity-Method昨天都运行得很好
  • 工作站在上周没有收到Windows或. Net更新
  • 这种现象并不涉及单个工作站、用户或操作系统,而是在运行Windows7或10的许多不同机器上发生于许多不同用户。
  • 域控制器在一周前收到更新。显然其中一个更新有关于LDAP查询的已知问题:Due to a defect in WLDAP32.DLL, applications that perform LDAP referral chasing can consume too many dynamic TCP ports。这似乎不太可能是突然出现故障的原因,因为a)该修补程序是在一周前安装的,而问题直到今天才出现,b)Microsoft建议的解决方法(重新启动服务)没有任何效果

什么可能导致这样的行为"一夜之间"?如果它真的与Windows更新有关,其他用户很快也会遇到这个错误!
显然,我可以构建Workarounds,所以我不必使用失败的方法和属性,但我仍然必须知道它最初停止工作的原因。

编辑

首先,理解public PrincipalContext(ContextType contextType);public PrincipalContext(ContextType contextType, string name, string container);之间的区别是很有用的。没有容器的PrincipalContext仍然需要以某种方式获得容器,不是吗?

vq8itlhq

vq8itlhq1#

默认情况下,PrincipalContext在“OU=Computers”-容器中搜索。如果未设置容器的阅读权限,则此操作将失败,并将引发COM异常。

相关问题