8

UserPrincipal (実際にはプリンシパル) の Name フィールド (CN に対応) を更新しようとすると、UserPrincipal.Save() の呼び出しで「サーバーは要求を処理することを望んでいません」というエラーが表示されます。

同じ OU に同じ名前 (CN) を持つ別のオブジェクトがないことを確認しました。

私が操作している PrincipalContext はドメイン ルートです (正確には、ユーザー アカウントが存在する OU レベルではありません)。

このエラーにはどのような理由が考えられますか? セキュリティ ポリシーに関連するものでしょうか (他のすべてのフィールドを更新できますが)。

using (var context = new PrincipalContext(ContextType.Domain, ConfigurationManager.AppSettings["domain"], ConfigurationManager.AppSettings["rootDN"], ContextOptions.Negotiate, ConfigurationManager.AppSettings["username"], ConfigurationManager.AppSettings["password"])) {
    var user = UserPrincipal.FindByIdentity(context, IdentityType.Sid, "..."); // SID abbreviated

    user.Name = "Name, Test";

    user.Save();
}

PrincipalContext の作成に使用しているユーザーには、AD オブジェクトを変更するセキュリティ権限があります。他のフィールド (Surname、GivenName など) を更新すると、すべて正常に動作します。

編集:

必要なことは (ADSI を使用して) 達成できましたが、偽装の下で次のコードを実行する必要があります。偽装コードは醜く、以下のコードは AD データを更新する別の方法 (DirectoryServices.AccountManagement を使用) とはかけ離れているため、より良い解決策を見つけたいと考えています。

using (var companyOU = new DirectoryEntry("LDAP://" + company.UserAccountOU)) {
    companyOU.Invoke("MoveHere", "LDAP://" + user.DistinguishedName, "cn=Name\, Test");
}
4

2 に答える 2

17

これはよりクリーンな方法です

using (var context = new PrincipalContext(ContextType.Domain))
{
    var group = GroupPrincipal.FindByIdentity(context, groupName);
    group.SamAccountName = newGroupName;
    group.DisplayName = newGroupName;
    group.Save();

    var dirEntry = (DirectoryEntry)group.GetUnderlyingObject();    
    dirEntry.Rename("CN=" + newGroupName);
    dirEntry.CommitChanges();
}
于 2014-01-09T12:19:47.127 に答える
3

これを行うために私が見つけた唯一の方法は、私の質問の編集セクションにあります。基本的に、UserPrincipalクラスは使用できません。CN属性には特別なものがあり、レベルをドロップダウンしてLDAP文字列であるDirectoryEntryを使用し、「MoveHere」ADSIコマンドを呼び出してユーザーアカウントの名前を変更する必要があります。

于 2011-09-29T18:49:09.650 に答える