usuario single obtener ejemplos datos crear conectar con active c# active-directory directoryservices

obtener - single sign on c# active directory



C#- GroupPrincipal.GetMembers(true)-¿Qué grupo? (2)

Así que estoy tratando de hacer algo con la enumeración recursiva de miembros del grupo AD. Por el momento tengo ...

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "mine.domain.com"); GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, "myADGroup"); if (grp != null) { foreach (Principal p in grp.GetMembers(true)) { Console.WriteLine(p.Name); } }

Todo esto funciona genial, por supuesto. Enumera todos los usuarios que son miembros del grupo y todos los usuarios que son miembros de grupos anidados dentro, sin importar cuántos niveles de anidación puedan tener. Lo cual es genial.

Lo que realmente necesito es saber en qué grupo de este pequeño anidamiento vino el usuario.

GRP-MainProject -- GRP-Producers -- GRP-Artists -- UserA

Ejecutar mi consulta actual contra GRP-MainProject devolverá UserA, ¿cómo debo proceder para devolver al usuario y el hecho de que fue GRP-Artists de la que heredó membresía de GRP-MainProject?

UserA es miembro de aproximadamente 40 grupos más o menos, en caso de que eso importe. Editar: vale la pena mencionar que el usuario podría tener membresía del grupo de múltiples grupos anidados.

Cualquier pensamiento sería apreciado.


Qué tal si:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "mine.domain.com"); GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, "myADGroup"); if (grp != null) { foreach (UserPrincipal user in grp.GetMembers(true)) { Console.WriteLine("User: {0}", user.Name); foreach (Principal userGroup in user.GetGroups(ctx)) { Console.WriteLine(" - Member of Group: {0}", userGroup.Name); } } }


Pruebe algo como esto tal vez:

Declarar lista estática de objetos grupales (clase simple de GroupPrincipal, nivel entero y ParentPrincipal principal)

public class SomeDirTraverser { private static List<GroupObj> _groups = new List<GroupObj>(); public List<string> GetMembershipWithPath(string groupname) { List<string> retVal = new List<string>(); PrincipalContext ctx = new PrincipalContext(ContextType.Domain); GroupPrincipal grp = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, groupname); if (grp != null) { BuildHList(grp, 0, null); foreach (UserPrincipal usr in grp.GetMembers(true)) retVal.Add(GetMbrPath(usr)); } return retVal; } private void BuildHList(GroupPrincipal node, int level, GroupPrincipal parent) { PrincipalSearchResult<Principal> rslts = node.GetMembers(); _groups.Add(new GroupObj() { Group = node, Level = level, Parent = parent }); foreach (GroupPrincipal grp in rslts.Where(g => g is GroupPrincipal)) BuildHList(grp, level + 1, node); } private string GetMbrPath(UserPrincipal usr) { Stack<string> output = new Stack<string>(); StringBuilder retVal = new StringBuilder(); GroupObj fg = null, tg = null; output.Push(usr.Name); foreach (GroupObj go in _groups) { if (usr.IsMemberOf(go.Group)) { output.Push(go.Group.Name); fg = go; while (fg.Parent != null) { output.Push(fg.Parent.Name); tg = (from g in _groups where g.Group == fg.Parent select g).FirstOrDefault(); fg = tg; } break; } } while (output.Count > 1) retVal.AppendFormat("{0} ->", output.Pop()); retVal.Append(output.Pop()); return retVal.ToString(); } } public class GroupObj { public GroupPrincipal Group { get; set; } public int Level { get; set; } public GroupPrincipal Parent { get; set; } }

Parece que debería darte lo que quieres.