UserPrincipal oUserPrincipal = UserPrincipal.FindByIdentity(ctx,found.DisplayName)返回null

时间:2013-03-13 22:06:32

标签: c# .net

不确定为什么会发生这种情况但是当我运行此代码时,它可以在一台服务器上运行,但不能在另一台服务器上运行。

两个服务器都返回一个正确的found.DisplayName但是只有一个服务器返回oUserPrincipal的值,另一个返回null值。

错误行:

       UserPrincipal oUserPrincipal = UserPrincipal.FindByIdentity(ctx, found.DisplayName) returns null


        dynamic config = _getExpandoFromXml("config.xml");

        PrincipalContext ctx = new PrincipalContext(ContextType.Domain, config.activeDirectory.sDomain, config.activeDirectory.sDefaultOU,config.mailServer.user, config.mailServer.pass);
        UserPrincipal user = new UserPrincipal(ctx);

        PrincipalSearcher search = new PrincipalSearcher(user);
        Console.WriteLine("before foreach");
        foreach (Principal found in search.FindAll())
        {
            try{
                if (found.DisplayName == null)
                {
                    Console.WriteLine("found.Dispalyname is null");
                }
                else
                {    
                    Console.Write("Dispalyname: ");
                    Console.WriteLine(found.DisplayName);
                }
                UserPrincipal oUserPrincipal = UserPrincipal.FindByIdentity(ctx, found.DisplayName);
                Console.Write("looking for user: ");
                Console.WriteLine(found.DisplayName);
                Console.WriteLine("after findbyidentiy");
                if (oUserPrincipal == null)
                {
                    Console.WriteLine("oUserPrinciapal is null");
                }
                if (oUserPrincipal.LastPasswordSet == null)
                {
                    Console.WriteLine("lastpasswordset is null");
                }
                DateTime? dateOrNull = oUserPrincipal.LastPasswordSet;
                Console.WriteLine("after LastPasswordSet");

2 个答案:

答案 0 :(得分:1)

FindByIdentity只能搜索少数几个属性。这些是“IdentityType枚举中包含的任何格式”。

名称是一个有效选项,但未列出DisplayName,因此您可能会得到DisplayName和Name恰好相同的结果,否则会失败。

使用:

var oUserPrincipal = UserPrincipal.FindByIdentity(ctx, found.Name);

var oUserPrincipal = UserPrincipal.FindByIdentity(ctx, found.SamAccountName);

应该有用。

还有一个three parameter version of FindByIdentity,可让您指定要搜索的媒体资源。

答案 1 :(得分:0)

在我的情况下,我发现问题是它没有连接到AD服务器。如果我在oPrincipalContext上空盘旋,则其ConnectedServer的属性显示它引发了System.DirectoryServices.DirectoryServicesCOMException类型的异常。如果发生这种情况,域控制器上的服务重新启动应该可以正常工作。我们发现它可能在高登录时间发生,因为我们的开发网络上只有1个DC。

enter image description here