我需要检索数百个 AD 组的组成员。虽然下面的代码给出了正确的答案,但它非常慢。是否有更有效的方法将这些组分解为其成员?
我目前的方法是使用System.DirectoryServices.AccountManagement
. 我有一List<T>
组要搜索的组名。遍历每个并调用GroupPrincipal.GetMembers()
每个(目前此代码需要 2 分钟以上才能分解大约 100 个组;我的目标将在 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; }
}