【问题标题】:Updating Name Field on UserPrincipal更新 UserPrincipal 上的名称字段
【发布时间】:2011-09-13 21:19:59
【问题描述】:

当我尝试更新 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");
}

【问题讨论】:

  • 请显示一些代码...还有一点:您使用的权限是否足够?
  • 代码相当简单。我已经发布了一些,尽管如此。用户有足够的权限对​​ AD 对象进行编辑。
  • 谢谢 - 每次尝试都会出现这个问题吗?我正在考虑 - 如果该特定用户当前已登录怎么办?
  • 是的,它每次都会发生。不,用户没有登录。事实上,刚才我能够完成我需要的事情,但是以一种丑陋的方式 - 使用 DirectoryEntry 并调用 Invoke("MoveHere", ....)。但我想等着看是否有人有更清洁的解决方案。
  • 试试不带任何特殊字符,如user.Name = "TestUserName";...

标签: c# directoryservices account-management


【解决方案1】:

这是一种更清洁的方式

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

【讨论】:

  • 这绝对是改变CN的方式。更干净、更清晰、更直观。
【解决方案2】:

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

【讨论】:

  • 这是真的,并且 AD 管理单元实际上暗示了原因 - 您无法更改属性表中的 CN,您必须进行明确的“重命名”。我相信这是因为 CN 是 DN 的一部分,很多套路都依赖于 DN 的稳定。显式的“移动”(或重命名的“移动此处”)是 DN 即将更改的显式信号。想想几个转速控制系统不知道如何检测重命名。这很烦人,但你有它。最好根本不用更改 CN,只需更改 displayName、sAMAccountName 和 userPrincipalName。
  • 嗯,根据这个人的实际姓名,最好不要有 CN。如果我只有一台时光机。 :)
猜你喜欢
  • 1970-01-01
  • 2022-07-07
  • 2014-09-21
  • 2013-03-20
  • 2020-05-25
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多