usuarios usuario servidor query obtener nombre net leer funcional crear consultar conectar con asp active c# asp.net wpf web-services active-directory

servidor - obtener nombre de usuario de windows c#



Obtener grupos de usuarios en Active Directory (2)

Tengo un problema con la integración de mi servicio web ASP.NET con una configuración de Active Directory y su uso para autenticar usuarios y verificar con los grupos de AD de los que son miembros y si tienen permisos para usar mi aplicación personalizada.

Mi aplicación personalizada tiene sus propios permisos y los administradores configuran grupos de Active Directory que permiten usar la aplicación personalizada.

El problema que tengo es cuando un usuario de un bosque diferente de Trusted Trusted, con plena confianza bidireccional, intenta iniciar sesión. No puedo obtener una lista de sus grupos del servidor AD con el que se comunican mis servicios web ASP.NET. El servicio web ASP.NET solo tiene acceso al servidor AD (AD Main), no al controlador AD de confianza (Secundario AD).

El usuario es un miembro del dominio (AD Secundario) y puedo autenticar a ese usuario contra el dominio (AD Principal), pero no puedo obtener una lista de grupos del dominio (Principal de AD) cuando el usuario está en el (AD Secundario) dominio.

He intentado este código.

StringCollection groupids = new StringCollection(); try { DirectoryLibrary dirLib = new DirectoryLibrary(); DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://" + domain,username, password); if (directoryEntry != null) { //Enum the properties so we can see what is in them foreach (string propname in directoryEntry.Properties.PropertyNames) { Debug.WriteLine(propname); } object obGroups = directoryEntry.Invoke("Groups"); foreach (object ob in (IEnumerable)obGroups) { // Create object for each group. DirectoryEntry obGpEntry = new DirectoryEntry(ob); groupids.Add(obGpEntry.NativeGuid); } } } catch (DirectoryServicesCOMException ex) { throw ex; }

Intenté alejarme del objeto DirectoryEntry para, algo como esto.

List<GroupPrincipal> result = new List<GroupPrincipal>(); StringCollection groupids = new StringCollection(); PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain, domain, userName, password); // find your user UserPrincipal user = UserPrincipal.FindByIdentity(yourDomain, userName); // if found - grab its groups if (user != null) { PrincipalSearchResult<Principal> groups = user.GetGroups(); // iterate over all groups foreach (Principal p in groups) { // make sure to add only group principals if (p is GroupPrincipal) { groupids.Add(p.DisplayName); } } }

Pero no obtengo el usuario y no puedo obtener una lista de los grupos para ese usuario en el otro dominio. Cualquier ayuda sería apreciada.


Creo que debes conectarte al AD remoto y obtener la información que deseas.

Escribí una réplica una vez, donde replico desde muchos AD

Algunos codifican fuera de esto:

Public Function GetDirectoryEntry() As Object If InStr(1, m_sLdapPath, "DC=") > 0 Then Dim directory_service As New PrincipalContext(ContextType.Domain, m_sDomain, m_sLdapPath) Return directory_service Else Dim directory_service As New PrincipalContext(ContextType.Machine, m_sDomain, m_sLdapPath) Return directory_service End If End Function Public Function GetUserList() As PrincipalSearchResult(Of Principal) Dim directory_service As PrincipalContext = CType(GetDirectoryEntry(), PrincipalContext) Dim directory_user As New UserPrincipal(directory_service) Dim directory_userlist As New PrincipalSearcher(directory_user) directory_userlist.QueryFilter = directory_user Return directory_userlist.FindAll End Function Public Function GetGroupList() As PrincipalSearchResult(Of Principal) Dim directory_service As PrincipalContext = CType(GetDirectoryEntry(), PrincipalContext) Dim directory_group As New GroupPrincipal(directory_service) Dim directory_grouplist As New PrincipalSearcher(directory_group) directory_grouplist.QueryFilter = directory_group Return directory_grouplist.FindAll End Function

Sé que esto no es exactamente lo que necesita, pero muestra cómo conectarse y obtener datos de cualquier AD. En mi caso, obtengo una lista de usuarios, una lista de grupos o lo que sea y luego trabajo con esas colecciones.

Dim l_oGroupList As Object = oDirectory.GetGroupList() For Each l_oGroup In l_oGroupList If l_oGroup.Members.Count > 0 Then If l_oGroup.Members.Contains(directory_service, IdentityType.UserPrincipalName, Username) Then '' he is part of the group End If End If Next

Espero que esto ayude un poco a resolver el problema ...


Este parece ser un gran caso de uso para el atributo AD derivado memberOf. Con el objeto DirectoryEntry directoryEntry , puede enumerar a qué grupo pertenece un usuario.

foreach (object group in directoryEntry.Properties["memberOf"]) { DirectoryEntry obGpEntry = New DirectoryEntry("LDAP://" + (String)group); groupids.Add(obGpEntry.NativeGuid); }

También es probable que pueda usar el primer segmento de código si prefirió ob con "LDAP: //"