2017-04-04 18 views
0

Windows 응용 프로그램을 분석하고 수정하여 Active Directory에 데이터를 동기화하려고합니다. Active Directory에서 구성원을 제거한 후 저장하려고하면 서버가 요청을 처리하지 않습니다. C#

내가 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; 
} 
+2

그룹에서 사용자를 제거한 다음 새 OU로 이동하려고하면 어떻게됩니까? LDAP 수준의 그룹 구성원은 고유 이름을 기반으로하며 사용자 DN을 변경합니다. 다른 옵션은 사용자를 쿼리하고 DN을 변경 한 다음 다시 userprincipal을 다시 쿼리하는 것입니다. – oldovets

+0

예, 접근 방식이 옳았습니다. 나는 당신의 흐름과 같은 방법을 바꾸었다. 자세한 설명을 해주셔서 감사합니다! –

답변

1

oldvets의 의견이 정확합니다. distinguishedName은 그룹의 member 속성에 저장된 이름입니다. 개체를 이동하면 DN이 변경됩니다. 그러나 aduser 개체는 새 위치로 업데이트되지 않습니다. 따라서 이제 aduser을 사용하여 사용자를 제거하려고 시도하면 이전 DN을 제거하려고합니다. 그것은 작동하지 않습니다.

회원 자격을 먼저 제거한 다음 개체를 새 OU로 옮기는 것이 좋습니다.

+0

oldovets이고 정확합니다. 코드를 수정하고 잘 작동합니다. 고맙습니다!! :) –