UserPrincipal.Save()的神奇BUG

      我今天有够凄惨的,误删了客户AD上的上千个用户,发现误删后我一直觉得很纳闷,因为根据程序记录的日志上来看,对误删的用户执行的操作全都是新增,执行新增的结果是捕获到“PrincipalExistsException,对象已存在”的异常,新增失败后没有执行任何操作AD的代码。很仔细的检查了程序,是不可能执行了删除操作的,奇异的是,每次执行UserPrincipal.Save()方法后,账号就消失了!!?

     接下来做了个小程序仔细测试,先把测试用的代码贴上:

    static void Main(string[] args)
    {
        string container = "DC=contosocorp,DC=local";
        using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "contosocorp.local", container,
            ContextOptions.Negotiate, "administrator", "p@ssw0rd"))
        {
            string emailPrefix = "zhanqing";
            string password = "p@ssw0rd";
            string name = "詹青";
            string id = "56447";

            UserPrincipal userPri = new UserPrincipal(context, emailPrefix, password, true);
            userPri.Description = id;
            userPri.DisplayName = name + id;
            userPri.Name = name + id;
            userPri.SamAccountName = emailPrefix;
            userPri.UserPrincipalName = emailPrefix + "@" + "contosocorp.local";

            try
            {
                userPri.Save();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        Console.Read();
    }

      用了好几个AD中现存的帐号测试,没有出现一保存后账户就消失的情况,后面仔细分析,发现与正式程序唯一不同的地方在于:测试代码中context关联的容器始终是AD根目录容器,而正式发布程序中context关联的容器是账户所在OU的容器,把container的值改一下试试,与账户"zhanqing”所在OU保持一致:

      string container = "DC=信息技术总部,DC=contosocorp,DC=local";

      结果着实让我吃惊,当执行到Console.WriteLine(ex.Message)后,AD中的账户"zhangqing”被删除了!

      这是我无法理解的现象。

      之后再进行了一些尝试,发现当把 userPri.Name = name + id 注释掉后,哪怕context关联的容器与AD中账户所在OU的容器一致,调用Save方法时账户不会被删除,然而只要userPri.Name的值与AD中账户的Name一致,且container与所在OU的容器一致,账户就会在调用Save方法后消失。

      哎……

原文地址:https://www.cnblogs.com/sdlfx/p/2032172.html