2017-04-04 70 views
0

我正在分析和修改將數據同步到Active Directory的Windows應用程序。服務器不願處理請求,當我嘗試保存後刪除成員在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,然後再次詢問用戶主管 – oldovets

+0

是的,您的方法是正確的。我改變了你的流程的方法,它的工作原理。感謝您的詳細解釋! –

回答

1

oldvets的評論是正確的。 distinguishedName是存儲在該組的member屬性中的內容。移動對象時,DN會更改。

但是,當您移動用戶時,aduser對象沒有更新到新位置。因此,當您嘗試使用aduser刪除用戶時,它正在嘗試刪除舊的DN。這是行不通的。

您最好先移除成員資格,然後將對象移動到新的OU。

+0

oldovets,你是正確的。我修改了代碼,效果很好。謝謝!! :) –

相關問題