繁体   English   中英

在UserPrincipal上更新名称字段

[英]Updating Name Field on UserPrincipal

当我尝试更新UserPrincipal(Principal,真的)上的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");
}

这是一种更清洁的方式

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();
}

我发现这样做的唯一方法是在我的问题的编辑部分。 基本上,您不能使用UserPrincipal类。 CN属性有一些特殊之处,您需要下拉一个级别并使用DirectoryEntry,一个LDAP字符串,并调用“MoveHere”ADSI命令来重命名用户帐户。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM