2017-04-04 5 views
0

Windowsアプリケーションを分析してActive Directoryにデータを同期しようと変更しています。Active Directoryでメンバーを削除した後に保存しようとするとサーバーが要求を処理したくないC#

私は、以前の部署のメンバーを削除しようとする、アクティブディレクトリ内の別の部署に

をユーザーを移動。

そして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を変更します。もう1つのオプションは、ユーザーを照会し、DNを変更してから、再度userprincipalを照会することです – oldovets

+0

はい、あなたのアプローチは正しかったです。私はあなたの流れのような方法を変えました、それは動作します。あなたの詳細な説明をありがとう! –

答えて

1

oldvetsからのコメントは正しいです。 distinguishedNameは、グループのmember属性に格納されているものです。オブジェクトを移動すると、DNが変更されます。

ただし、ユーザーを移動すると、aduserオブジェクトは新しい場所で更新されません。したがって、今ユーザがaduserを使用してユーザを削除しようとすると、古いDNを削除しようとしています。それは動作しません。

メンバーシップを最初に削除してから、オブジェクトを新しいOUに移動する方がよいでしょう。

+0

oldovetsとあなたは正しいです。私はコードを修正し、うまく動作します。ありがとうございました!! :) –

関連する問題