数百の AD グループのグループ メンバーを取得する必要があります。以下のコードは正しい答えを示していますが、非常に遅いです。これらのグループをそのメンバーに分解するためのより効率的なアプローチはありますか?
私の現在のアプローチは、を使用してSystem.DirectoryServices.AccountManagement
います。検索するList<T>
グループ名があります。それぞれを反復し、それぞれを呼び出しGroupPrincipal.GetMembers()
ます (現在、このコードは約 100 のグループを分解するのに 2 分以上かかります。私の目標は 15 秒未満です)
[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; }
}