2

ローカル アカウント (Active Directory ではない) を管理するために、リモート Windows サーバーへの接続を開くプログラムを作成しました。プログラムは次の手順を実行します。

  • ユーザーの作成
  • ユーザーをグループに追加する

どちらのメソッドも System.DirectoryServices.AccountManagement を使用します。ここでは 2 つの関数を使用します。

public void CreateUser()
    {
        PrincipalContext pc = new PrincipalContext(ContextType.Machine,
            "host_ip",
            "adminaccount",
            "adminpassword");
        UserPrincipal up = new UserPrincipal(pc);

        up.Name = "user";
        up.DisplayName = "user";
        up.SetPassword("user");
        up.Description = "user";
        up.UserCannotChangePassword = true;
        up.PasswordNeverExpires = true;
        try
        {
            up.Save();
        }
        catch (Exception ex)
        {
        }
        try
        {
            AddToGroup(pc, up);
        }
        catch (Exception ex)
        {
        }
    }

    private void AddToGroup(PrincipalContext pc, UserPrincipal u)
    {
        string group = "Remote Desktop Users";

        GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(pc, group);
        if (groupPrincipal.Members.Contains(pc, IdentityType.SamAccountName, u.SamAccountName)) //error occurs here
        {
            return;
        }
        groupPrincipal.Members.Add(u);
        try
        {
            groupPrincipal.Save();
        }
        catch (Exception e)
        {
        }
    }

今朝から機能しました。ユーザーの作成は常に成功しますが、次の行でこのエラーが発生します。

  • if (groupPrincipal.Members.Contains(pc, IdentityType.SamAccountName, u.SamAccountName))

グループ メンバーシップの列挙中にエラー (1332) が発生しました。メンバーの SID を解決できませんでした。

回答ありがとうございます

4

1 に答える 1

3

これが役立つかどうかはわかりませんが、Microsoft Connectに関するこのレポートによると、これは関連している可能性があります。

System.DirectoryServices.AccountManagement グループ列挙の現在のリリースには、グループ内のすべてのオブジェクトにアクセスできるか、例外がスローされるという要件があります。表示されているのは、ActiveDirectory には存在しないローカル グループにリストされているオブジェクトです。システムはこれらのリンクを自動的に削除しないため、このグループが列挙されるたびに失敗します。この失敗を防ぐには、存在しない ActiveDirectory 内のオブジェクトへのリンクを削除します。このようなシナリオに対処しやすくするために、今後のリリースで API を変更することを検討しています。

于 2010-07-08T13:17:29.743 に答える