0

数百のADグループのグループメンバーを取得する必要があります。下のコードは正しい答えですが、非常に遅いです。これらのグループをメンバーに分解するための効率的なアプローチはありますか?C#.Net 3.5を使用してADグループを最適化する方法

私の現在のアプローチはSystem.DirectoryServices.AccountManagementです。私は検索するグループ名のList<T>を持っています。各1を反復処理し、各 (現在、このコードは、約100のグループを分解するため2+分かかります。私の目標は15秒未満になる)ためGroupPrincipal.GetMembers()を呼び出す

私があることから、本当に遠いよ

[EnvironmentPermissionAttribute(SecurityAction.LinkDemand, Unrestricted = true)] 
     private static void GetGroupMembership(List<ActiveDirectoryPrincipalProperties> userGroupProperties) 
     { 
      List<ActiveDirectoryPrincipalProperties> groupProperties = new List<ActiveDirectoryPrincipalProperties>(); 

      foreach (ActiveDirectoryPrincipalProperties gProperties in userGroupProperties) 
      { 
       if (gProperties.groupYesNo) 
       { 
        PrincipalContext ctx = new PrincipalContext(ContextType.Domain, gProperties.groupDomain); 
        try 
        { 
         GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, gProperties.groupName); 

         foreach (Principal member in group.GetMembers(true)) 
         { 
          ActiveDirectoryPrincipalProperties memberProperties = new ActiveDirectoryPrincipalProperties(); 
          memberProperties.fullGroupName = gProperties.fullGroupName; 
          memberProperties.groupDomain = gProperties.groupDomain; 
          memberProperties.groupName = gProperties.groupName; 
          memberProperties.groupType = gProperties.groupType; 
          memberProperties.groupYesNo = false; 
          memberProperties.memberDomain = member.Context.Name.ToString(); 
          memberProperties.memberName = member.SamAccountName.ToString(); 
          memberProperties.memberType = member.StructuralObjectClass.ToString(); 
          memberProperties.sqlUserOnlyYesNo = false; 

          groupProperties.Add(memberProperties); 
         } 
         group.Dispose(); 
        } 
        finally 
        { 
         ctx.Dispose(); 
        } 
       } 

      } 

      userGroupProperties.AddRange(groupProperties); 
     } 

     public class ActiveDirectoryPrincipalProperties 
     { 
      public string fullGroupName { get; set; } 
      public string groupDomain { get; set; } 
      public string groupName { get; set; } 
      public string groupType { get; set; } 
      public string memberDomain { get; set; } 
      public string memberName { get; set; } 
      public string memberType { get; set; } 
      public bool groupYesNo { get; set; } 
      public bool sqlUserOnlyYesNo { get; set; } 
     } 

答えて

0

LAMDAフィルタを使用して私の手続きから約半分の時間を削った後、その要素を反復してメソッド内の条件文を1つ削除しました。ここに私の更新されたコードです。

[SecurityCritical] 
     [SecurityPermissionAttribute(SecurityAction.Demand)] 
     private static void GetGroupMembership(List<ActiveDirectoryPrincipalProperties> userGroupProperties) 
     { 
      List<ActiveDirectoryPrincipalProperties> groupProperties = new List<ActiveDirectoryPrincipalProperties>(); 

      foreach (ActiveDirectoryPrincipalProperties gProperties in userGroupProperties.FindAll(token => token.groupYesNo.Equals(true))) 
      { 

       PrincipalContext ctx = new PrincipalContext(ContextType.Domain, gProperties.groupDomain); 
       try 
       { 

        GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, gProperties.groupName); 

        foreach (Principal member in group.GetMembers(true)) 
        { 
         ActiveDirectoryPrincipalProperties memberProperties = new ActiveDirectoryPrincipalProperties(); 
         memberProperties.fullGroupName = gProperties.fullGroupName; 
         memberProperties.groupDomain = gProperties.groupDomain; 
         memberProperties.groupName = gProperties.groupName; 
         memberProperties.groupType = gProperties.groupType; 
         memberProperties.groupYesNo = false; 
         memberProperties.memberDomain = member.Context.Name.ToString(); 
         memberProperties.memberName = member.SamAccountName.ToString(); 
         memberProperties.memberType = member.StructuralObjectClass.ToString(); 
         memberProperties.sqlUserOnlyYesNo = false; 

         groupProperties.Add(memberProperties); 
        } 
        group.Dispose(); 
       } 
       finally 
       { 
        ctx.Dispose(); 
       } 


      } 

      userGroupProperties.AddRange(groupProperties); 
     } 
0

まあエキスパートですが、ユーザーは複数のグループに属している可能性があります。グループ内のすべてのユーザーに要求してから、グループを作成してみましたか?どの方法がボトルネックであるかを知るためにプロファイリングを行い、どのように進むべきかについてのよりよい考え方を持たせることも提案します。

希望します。

+0

k-devお返事ありがとうございます。この方法では、私はユーザーではなくグループプリンシパルしか持たない。私は各グループのメンバーを返す必要があります。私のプロジェクトをプロファイリングしたところ、私が投稿した方法は、実行に最長(2分以上)を要した方法でした。 – MauMen

関連する問題