今天早上我开始注意到我的几个程序在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.Current
或UserPrincipal.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仍然需要以某种方式获得容器,不是吗?
1条答案
按热度按时间vq8itlhq1#
默认情况下,
PrincipalContext
在“OU=Computers”-容器中搜索。如果未设置容器的阅读权限,则此操作将失败,并将引发COM异常。