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