usuarios usuario sacar saber que pertenece listar listado grupo exportar activos active active-directory ldap adsi directoryentry

active-directory - sacar - saber a que grupo pertenece un usuario windows



¿La mejor manera de determinar rápidamente si una cuenta de usuario es miembro de un grupo de AD? (4)

Actualmente tengo un código que muestra una lista de usuarios en un grupo y luego recorre ese grupo para determinar si existe una cuenta determinada, pero parece que debería haber una forma más concisa (y tal vez más rápida) de lograrlo.

Este código (VB.NET) intenta usar la propiedad de miembro del objeto de grupo, pero devuelve falso incluso cuando el usuario es miembro de ese grupo. ¿Alguien puede ver lo que estoy haciendo mal aquí?

Dim group As DirectoryEntry = GetNetworkObject(GroupDomanName, NetworkObjectType.NetworkGroup, GroupName) Dim user As DirectoryEntry =GetNetworkObject(UserDomainName, NetworkObjectType.NetworkUser, Login) Return group.Properties("member").Contains(user.Path)

FYI: Las llamadas GetNetworkObject solo devuelven un objeto directoryEntry, he confirmado que se está devolviendo el objeto correcto tanto para el grupo como para el objeto del usuario.


Aquí hay otra manera de usar el buscador de directorio y memberOf. Esto está utilizando los usuarios actuales objectSID pero podría cambiar eso a algún otro identificador.

dSearch.Filter = String.Format("(&(memberOf={0})(objectSid={1}))", groupDN, WindowsIdentity.GetCurrent.User) Return dSearch.FindOne() IsNot Nothing

si va a usar una entrada de usuario que podría contener caracteres no válidos, siempre debe escapar de ellos ...

searchName = searchName.Replace("/", "/5c"). _ Replace("/", "/2f"). _ Replace("*", "/2a"). _ Replace("(", "/28"). _ Replace(")", "/29")


Esto es lo que he usado en el pasado en un Script de VBS que funcionó muy bien:

Set wshNet = CreateObject("WScript.Network") ''Setup connection to the Network Set fso = CreateObject("Scripting.FileSystemObject") ''Create File System Object for any file manipulations Set ADSysInfo = CreateObject("ADSystemInfo") ''Setup connection to Active Directory Set CurrentUser = GetObject("LDAP://" & ADSysInfo.UserName) ''Setup current user to look for in Active Directory strGroups = LCase(Join(CurrentUser.MemberOf)) ''Grabs all the groups the current user is a member of

Luego uso un InStr para ver si el usuario es parte de ese grupo:

If InStr(strGroups, "MyGroup") Then MyGroupSub

Es posible que pueda adaptar lo anterior en su proyecto.

Por cierto, noté que en tu código tienes groupdoman como tu último parámetro para ''group''. No estoy seguro de si quieres que sea groupdomain o no:

Grupo dévil Como DirectoryEntry = GetNetworkObject (GroupDomanName, NetworkObjectType.NetworkGroup, GroupName, groupdoman )

vs

Grupo atenuado como DirectoryEntry = GetNetworkObject (GroupDomanName, NetworkObjectType.NetworkGroup, GroupName, groupdomain )

¡Déjeme saber si esto ayuda! JFV


Si está en la pila .NET 3.5, el ensamblado System.DirectoryServices.AccountManagement.dll tiene una buena API encima de AD. El siguiente método se puede implementar para resolver su problema:

static bool IsUserMemberOf(string userName, string groupName) { using (var ctx = new PrincipalContext(ContextType.Domain)) using (var groupPrincipal = GroupPrincipal.FindByIdentity(ctx, groupName)) using (var userPrincipal = UserPrincipal.FindByIdentity(ctx, userName)) { return userPrincipal.IsMemberOf(groupPrincipal); } } // Usage: bool result = IsUserMemberOf("CONTOSO//john.doe", "CONTOSO//Administrators");

No sé cómo funciona este método, pero es una solución limpia.


Encontré una respuesta que parece funcionar en NET 2.0, es relativamente rápida y supera el posible problema de grupos que contienen más de 100 elementos (que requieren búsqueda de rango)

Aquí está el código con el que terminé:

Dim DSearcher As New DirectorySearcher(group, "(&(objectClass=user)(cn=" + Login + "))", New String() {"member;Range=0-5000"}, SearchScope.OneLevel) group = GetNetworkObject(GroupDomanName, NetworkObjectType.NetworkGroup, GroupName) user = GetNetworkObject(UserDomainName, NetworkObjectType.NetworkUser, Login) DSearcher.AttributeScopeQuery = "member" Return (DSearcher.FindOne() IsNot Nothing)