En una aplicación web, estamos buscando mostrar una lista de cuentas sam para usuarios que son miembros de un determinado grupo. Los grupos pueden tener 500 o más miembros en muchos casos y necesitamos que la página responda.Forma rápida de obtener una lista de miembros del grupo en Active Directory con C#
Con un grupo de aproximadamente 500 miembros, se requieren de 7-8 segundos para obtener una lista de las cuentas de sam para todos los miembros del grupo. ¿Hay formas más rápidas? Sé que la Consola de administración de Active Directory lo hace en menos de un segundo.
He probado unos cuantos métodos:
1)
PrincipalContext pcRoot = new PrincipalContext(ContextType.Domain)
GroupPrincipal grp = GroupPrincipal.FindByIdentity(pcRoot, "MyGroup");
List<string> lst = grp.Members.Select(g => g.SamAccountName).ToList();
2)
PrincipalContext pcRoot = new PrincipalContext(ContextType.Domain)
GroupPrincipal grp = GroupPrincipal.FindByIdentity(pcRoot, "MyGroup");
PrincipalSearchResult<Principal> lstMembers = grp.GetMembers(true);
List<string> lst = new List<string>();
foreach (Principal member in lstMembers)
{
if (member.StructuralObjectClass.Equals("user"))
{
lst.Add(member .SamAccountName);
}
}
3)
PrincipalContext pcRoot = new PrincipalContext(ContextType.Domain)
GroupPrincipal grp = GroupPrincipal.FindByIdentity(pcRoot, "MyGroup");
System.DirectoryServices.DirectoryEntry de = (System.DirectoryServices.DirectoryEntry)grp.GetUnderlyingObject();
List<string> lst = new List<string>();
foreach (string sDN in de.Properties["member"])
{
System.DirectoryServices.DirectoryEntry deMember = new System.DirectoryServices.DirectoryEntry("LDAP://" + sDN);
lst.Add(deMember.Properties["samAccountName"].Value.ToString());
}
Esto es similar al ejemplo 3 en mi pregunta, la parte que requiere un tiempo de registro se integra a través de cada elemento en la propiedad del miembro. – Jeremy
tiene que amar la notación húngara, algunos restos arcaicos de un ejemplo original –