2

System.DirectoryServices.AccountManagement.NET 4.5でアカウントを作成し、それらにプロパティを設定しています。要件の1つは、グループメンバーシップ(プライマリグループを含む)をテンプレートアカウントからコピーすることです。コードには次のものが含まれます。

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`

GetGroups電話で。私の推測では、次にアクセスする前にユーザーが完全に作成されていない、ある種の競合状態があります。診断ログから、毎回同じドメインコントローラーに対して実行していることがわかります(PrincipalContext予想に一致するように同じドメインコントローラーを使用しているため)。したがって、レプリケーションの問題ではありません。

私の推測は正確ですか?これを処理する良い方法はありますか?私はただ投げ込むことができましたSleepが、それはせいぜい警官のようで、最悪の場合は壊れやすいようです。では、正しいことは何ですか?

4

1 に答える 1

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
            ;

このようにして、「しばらく」試すことができます。正常に機能する場合は、エラーをログに記録するなどの操作を行い、後で修正スクリプトを実行できます。

于 2012-10-05T20:33:14.223 に答える