Сервер не хочет обрабатывать запрос, когда я пытаюсь сохранить после удаления участника в Active Directory C#

Я анализирую и изменяю приложение для Windows, предназначенное для синхронизации данных с Active Directory.

Когда я перемещаю пользователей в другой отдел в активном каталоге,

Я пытаюсь удалить члена в предыдущем отделе.

И Member.Remove в порядке, но когда я пытаюсь сохранить его, он выдает исключение, как это

Server is unwilling to process the request

Итак, ничего не изменилось. К сожалению, я новичок в Active Directory, я не знаю, как справиться с этим.

Код ниже. Пожалуйста, поделитесь своими знаниями.

void MoveUser(string ppk, string pk)
{
   var aduser = adm.GetUser(pk);
   var adde=aduser.GetUnderlyingObject() as DirectoryEntry;
   var pde = adm.FindOU(ppk);
   if (aduser == null || pde == null)
   {
        return;
   }
   adde.MoveTo(pde);
   var pgroup = adm.GetGroup(ppk);
   if (!aduser.IsMemberOf(pgroup))
   {
        var allgroups = adm.GetAllDE(Words.Group);
        foreach (var sg in allgroups)
        {
            var samname = GetSamName(sg);
            var sgroup = adm.GetGroup(samname);
            if (aduser.IsMemberOf(sgroup))
            {
                sgroup.Members.Remove(aduser);
                //exception here
                //message: Server is unwilling to process the request
                sgroup.Save();
            }
        }
        pgroup.Members.Add(aduser);
        pgroup.Save();
    }
}

public UserPrincipal GetUser(string sUserName)
{
    PrincipalContext oPrincipalContext = GetPrincipalContext();
    UserPrincipal oUserPrincipal = UserPrincipal.FindByIdentity(oPrincipalContext, sUserName);
    return oUserPrincipal;
}

public DirectoryEntry FindOU(string ouName)
{
    DirectorySearcher ds = new DirectorySearcher(GetRootOu());
    ds.Filter = "(ou=" + ouName + ")";
    try
    {
        return ds.FindOne().GetDirectoryEntry();
    }
    catch (Exception)
    {
        return null;
    }
 }

public GroupPrincipal GetGroup(string sGroupName)
{
    PrincipalContext oPrincipalContext = GetPrincipalContext();

    GroupPrincipal oGroupPrincipal = GroupPrincipal.FindByIdentity(oPrincipalContext, sGroupName);
    return oGroupPrincipal;
}

1 ответ

Решение

Комментарий от олдвец правильный. Отличительное имя - это то, что хранится в member атрибут группы. Когда вы перемещаете объект, DN меняется.

Однако когда вы перемещаете пользователя, aduser объект не обновляется с новым местоположением. Поэтому, когда вы сейчас пытаетесь удалить пользователя с помощью aduserпытается удалить старое DN. Это не сработает.

Вам лучше сначала удалить членство, а затем переместить объект в новое подразделение.

Другие вопросы по тегам