当我尝试更新UserPrincipal(Principal,真的)上的Name字段(对应于CN)时,我在调用UserPrincipal.Save()时收到错误“服务器不愿处理请求”。 / p>
我已经检查过以确保同一个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");
}
答案 0 :(得分:14)
这是一种更清洁的方式
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();
}
答案 1 :(得分:2)
我发现这样做的唯一方法是在我的问题的编辑部分。基本上,您不能使用UserPrincipal类。 CN属性有一些特殊之处,您需要下拉一个级别并使用DirectoryEntry,一个LDAP字符串,并调用“MoveHere”ADSI命令来重命名用户帐户。