使用System.DirectoryServices.AccountManagement时,Active Directory用户创建延迟

时间:2012-10-03 20:43:54

标签: c# .net active-directory user-accounts

我正在使用.NET 4.5中的System.DirectoryServices.AccountManagement创建帐户并在其上设置属性。其中一个要求是从模板帐户复制组成员身份(包括主要组)。该代码包括以下内容:

foreach (var group in userPrincipal.GetGroups()) {
    var groupPrincipal = (GroupPrincipal) @group;

    if (groupPrincipal.Sid != templatePrimaryGroup.Sid) {
        groupPrincipal.Members.Remove(userPrincipal);
        groupPrincipal.Save();
    }
}

大约90%的时间都有效。其余时间,它失败了:

  

System.DirectoryServices.DirectoryServicesCOMException was unhandled HResult=-2147016656 Message=There is no such object on the server.

Source=System.DirectoryServices ErrorCode=-2147016656 ExtendedError=8333 ExtendedErrorMessage=0000208D: NameErr: DSID-03100213, problem 2001 (NO_OBJECT), data 0, best match of: 'OU=Whatever,DC=domain,DC=local`

<{1>}来电{p>。我的猜测是,在我下次访问之前,用户没有完全创建某种竞争条件。我从诊断日志记录中知道每次我都要使用相同的域控制器(它使用相同的GetGroups以符合我的预期)所以这不是复制问题。

我的猜测准确吗?有没有一个好方法来处理这个?我可以投入一个PrincipalContext,但这似乎是一个最好的警察,最糟糕的是脆弱。那么正确的做法是什么?

1 个答案:

答案 0 :(得分:1)

尝试类似:

        int maxWait = 120;
        int cnt = 0;
        bool usable = false;

        while (usable == false && cnt < maxWait)
        {
            try
            {
                foreach (var group in userPrincipal.GetGroups())
                {
                    var groupPrincipal = (GroupPrincipal)@group;

                    if (groupPrincipal.Sid != templatePrimaryGroup.Sid)
                    {
                        groupPrincipal.Members.Remove(userPrincipal);
                        groupPrincipal.Save();
                    }
                }
                usable = true;
                break;
            }
            catch
            {
                System.Threading.Thread.Sleep(500);
            }
        }
        if (usable)
            //All okay
            ;
        else
            //Do something
            ;

这样你可以尝试“一段时间”。如果它运行良好,如果不执行记录错误之类的操作,那么以后可以运行fix-it脚本。