Обновление поля имени в UserPrincipal - PullRequest
7 голосов
/ 14 сентября 2011

Когда я пытаюсь обновить поле Имя (соответствует CN) в UserPrincipal (Принципал, действительно), я получаю сообщение об ошибке «Сервер не желает обрабатывать запрос» при вызове 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. Если я обновлю другие поля (например, Фамилия, Имя), все будет работать нормально.

EDIT:

Мне удалось выполнить то, что мне нужно (с помощью ADSI), но я должен запустить следующий код под олицетворением. Код олицетворения уродлив, и приведенный ниже код отличается от того, как я обновляю данные AD (используя DirectoryServices.AccountManagement), поэтому я хотел бы найти лучшее решение.

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

Ответы [ 2 ]

14 голосов
/ 09 января 2014

Это чище

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();
}
3 голосов
/ 29 сентября 2011

Единственный способ, которым я нашел это, - это раздел РЕДАКТИРОВАТЬ в моем вопросе.По сути, вы не можете использовать класс UserPrincipal.В атрибуте CN есть что-то особенное, и вам нужно сбросить уровень и использовать DirectoryEntry, строку LDAP, и вызвать команду ADSI «MoveHere», чтобы переименовать учетную запись пользователя.

...