La mejor forma recursiva consulta de ANUNCIOS de pertenencia al Grupo en ASP.NET (utilizando vb)

Estoy tratando de encontrar la manera más sencilla de consulta de Active Directory, en una de dos maneras:

  1. Dado un ANUNCIO nombre de usuario, encuentre todos los grupos (INCLUYENDO grupos anidados) en la que el usuario es un miembro de.

  2. Dado un nombre de grupo de ANUNCIOS, encontrar a todos los usuarios (incluidos los usuarios en grupos anidados) que son parte del grupo.

Mi aplicación está en VB.NET en la v4.0 marco. He revisado las sugerencias de muchos de los diferentes resultados de búsqueda de Google, algunos de los cuales utilizan LDAP y del Sistema.DirectoryServices.DirectorySearcher (que estoy pensando que podría ser la mejor ruta).

Pero estoy girando mis ruedas y estoy buscando ejemplos de código.

Gracias.

ACTUALIZACIÓN:

Tengo estas piezas en su lugar:

<add assembly="System.DirectoryServices, Version=3.5.0.0, etc."/>

<add namespace="System.DirectoryServices.AccountManagement" /> o Imports System.DirectoryServices.AccountManagement

y, en esta línea de código:

Dim ctx As New PrincipalContext(ContextType.Domain)

Todavía se me pone este error: Tipo ‘PrincipalContext’ no está definido

Al mencionar la «instrucción» supongo que quiso decir que necesito para hacer referencia a este espacio de nombres. O ¿quieres decir que debo hacer algo como esto?

Using ctx As New PrincipalContext(ContextType.Domain)

InformationsquelleAutor Octavient | 2012-10-24

3 Kommentare

  1. 4

    Un ejemplo Completo

    Este código mostrará la lista de todos los usuarios en un grupo Y sub grupos mediante la enumeración de un determinado nombre de grupo.
    también, si una cuenta de usuario está habilitada /deshabilitada.

    A usar, sólo tienes que llamar ListADGroupMembers(«Some_Group_Name»).
    Esto llenará los usuarios nombre completo y su número de móvil en una matriz, la cual se puede recorrer en iteración.

    Su muy fáciles de seguir, acabo de leer a través de él.

    Public ADUSers(,) As String
     Public n As Integer = 0
    
     Public Sub ListADGroupMembers(ByVal GN As String)
    
        Dim DirectoryRoot As New DirectoryEntry("LDAP://RootDSE")
        Dim DNC = DirectoryRoot.Properties("DefaultNamingContext")(0).ToString()
        Dim GroupName As String = GN '"G_All_IT_Users"
        Dim GroupMembers As System.Collections.Specialized.StringCollection = GetGroupMembers(DNC, GroupName)
        'Dim GroupMembersMobile As System.Collections.Specialized.StringCollection = GetGroupMembers(DNC, GroupName)
        '  For Each Member As String In GroupMembers
        '    ListBox1.Items.Add(Member)
        'Next Member
    
    End Sub
    
    Public Function GetGroupMembers(ByVal strDomain As String, ByVal strGroup As String) As System.Collections.Specialized.StringCollection
    
        Dim GroupMembers As New System.Collections.Specialized.StringCollection()
    
        Try
            Dim DirectoryRoot As New DirectoryEntry("LDAP://" & strDomain)
            Dim DirectorySearch As New DirectorySearcher(DirectoryRoot, "(CN=" & strGroup & ")")
            Dim DirectorySearchCollection As SearchResultCollection = DirectorySearch.FindAll()
            For Each DirectorySearchResult As SearchResult In DirectorySearchCollection
                Dim ResultPropertyCollection As ResultPropertyCollection = DirectorySearchResult.Properties
                Dim GroupMemberDN As String
                For Each GroupMemberDN In ResultPropertyCollection("member")
                    Dim DirectoryMember As New DirectoryEntry("LDAP://" & GroupMemberDN)
                    Dim DirectoryMemberProperties As System.DirectoryServices.PropertyCollection = DirectoryMember.Properties
                    Dim DirectoryItem As Object = DirectoryMemberProperties("sAMAccountName").Value
                    Dim DirectoryPhone As Object = DirectoryMemberProperties("mobile").Value
                    Dim uac As Object = DirectoryMemberProperties("userAccountControl").Value
    
                    If DirectoryMember.SchemaClassName = "group" Then
                        ' this is a group.                        
                        ListADGroupMembers(DirectoryItem)
                    End If
    
                    If DirectoryMember.SchemaClassName = "user" Then
                        ' this is a user.
                        If Nothing IsNot DirectoryItem Then
                            If AccEnabled(uac) = 1 Then ' check the ad account is enabled
                                GroupMembers.Add(DirectoryItem.ToString())
                                ListBox1.Items.Add(DirectoryItem.ToString() & " " & DirectoryPhone)
    
                                ADUSers(0, n) = DirectoryItem.ToString()
                                ADUSers(1, n) = DirectoryPhone
                                n += 1
                                ReDim Preserve ADUSers(1, n)
                            End If
                        End If
                    End If
    
                Next GroupMemberDN
    
            Next DirectorySearchResult
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    
        Return GroupMembers
    
    
    
    End Function
    
    
    
    
      ' check account is active or not.
    Function AccEnabled(ByVal uac As String) As String
    
        Dim aret As Integer = 0
        Select Case uac
            Case 512 'Enabled 
                aret = 1
            Case 514 ': ACCOUNTDISABLE()
                aret = 0
            Case 528 ': Enabled(-LOCKOUT)
                aret = 1
            Case 530 ': ACCOUNTDISABLE(-LOCKOUT)
                aret = 0
            Case 544 ': Enabled(-PASSWD_NOTREQD)
                aret = 1
            Case 546 ': ACCOUNTDISABLE(-PASSWD_NOTREQD)
                aret = 0
            Case 560 ': Enabled(-PASSWD_NOTREQD - LOCKOUT)
                aret = 1
            Case 640 ': Enabled(-ENCRYPTED_TEXT_PWD_ALLOWED)
                aret = 1
            Case 2048 ' : INTERDOMAIN_TRUST_ACCOUNT()
                aret = 1
            Case 2080 ': INTERDOMAIN_TRUST_ACCOUNT(-PASSWD_NOTREQD)
                aret = 1
            Case 4096 ': WORKSTATION_TRUST_ACCOUNT()
                aret = 1
            Case 8192 ': SERVER_TRUST_ACCOUNT()
                aret = 1
            Case 66048 ': Enabled(-DONT_EXPIRE_PASSWORD)
                aret = 1
            Case 66050 ': ACCOUNTDISABLE(-DONT_EXPIRE_PASSWORD)
                aret = 0
            Case 66064 ': Enabled(-DONT_EXPIRE_PASSWORD - LOCKOUT)
                aret = 1
            Case 66066 ': ACCOUNTDISABLE(-DONT_EXPIRE_PASSWORD - LOCKOUT)
                aret = 0
            Case 66080 ': Enabled(-DONT_EXPIRE_PASSWORD - PASSWD_NOTREQD)
                aret = 1
            Case 66082 ': ACCOUNTDISABLE(-DONT_EXPIRE_PASSWORD - PASSWD_NOTREQD)
                aret = 0
            Case 66176 ': Enabled(-DONT_EXPIRE_PASSWORD - ENCRYPTED_TEXT_PWD_ALLOWED)
                aret = 1
            Case 131584 ': Enabled(-MNS_LOGON_ACCOUNT)
                aret = 1
            Case 131586 ': ACCOUNTDISABLE(-MNS_LOGON_ACCOUNT)
                aret = 0
            Case 131600 ': Enabled(-MNS_LOGON_ACCOUNT - LOCKOUT)
                aret = 1
            Case 197120 ': Enabled(-MNS_LOGON_ACCOUNT - DONT_EXPIRE_PASSWORD)
                aret = 1
            Case 532480 'SERVER_TRUST_ACCOUNT - TRUSTED_FOR_DELEGATION (Domain Controller) 
                aret = 1
            Case 1049088 ': Enabled(-NOT_DELEGATED)
                aret = 1
            Case 1049090 ': ACCOUNTDISABLE(-NOT_DELEGATED)
                aret = 0
            Case 2097664 ': Enabled(-USE_DES_KEY_ONLY)
                aret = 1
            Case 2687488 ': Enabled(-DONT_EXPIRE_PASSWORD - TRUSTED_FOR_DELEGATION - USE_DES_KEY_ONLY)
                aret = 1
            Case 4194816 ': Enabled(-DONT_REQ_PREAUTH)
                aret = 1
            Case Else
                aret = 0
        End Select
    
        AccEnabled = aret
    
    End Function
    • ROCK EN. Muchas gracias–el código que me ayudó enormemente. Bien hecho.
  2. 3

    Intente esto:

    ' set up domain context
    Dim ctx As New PrincipalContext(ContextType.Domain)
    
    ' find a user
    Dim user As UserPrincipal = UserPrincipal.FindByIdentity(ctx, "SomeUserName")
    
    If user IsNot Nothing Then
        Dim groupMemberships = user.GetAuthorizationGroups()
    
                ' do something with group....
        For Each gp As GroupPrincipal In groupMemberships
        Next
    End If

    Usted debe comprobar fuera de la System.DirectoryServices.AccountManagement (S. DS.AM) de espacio de nombres. Leer todo sobre ella aquí:

    El nuevo S. DS.SOY lo hace realmente fácil de jugar con usuarios y grupos de AD!

    El método .GetAuthorizationGroups() va a hacer una búsqueda recursiva – así que usted debe conseguir todos los grupos de un usuario es miembro de manera directa o indirecta.

    • Fresco–voy a probar esto. Pero no tengo que definir la ruta de acceso LDAP? O ¿esto supone que yo estoy usando <authentication mode="Windows" />…?
    • Estoy recibiendo este error: BC30002: Tipo ‘PrincipalContext’ no está definido. He incluido esta en la web.config: <add namespace="System.DirectoryServices.AccountManagement" /> de Acuerdo a MSDN, el PrincipalContext Clase es parte de este AccountManagement clase. Hay otros espacios de nombres y clases debo incluir?
    • Hizo ver mi reciente comentario re: PrincipalContext error? Alguna idea?
    • has incluido el uso de instrucción en el archivo de código subyacente donde estés usando PrincipalContext, también? Sólo añadir que la asamblea no es suficiente …
    • He añadido una actualización de mi post original, con detalles más específicos. La esperanza de que usted está dispuesto a ayudar a mí ver a través de esto…?
    • sí, pero no sé lo que está pasando – de todo lo que veo, no entiendo por qué se quejaban PrincipalContext no definido … estoy en una pérdida (y también no muy fluido en VB.NET)

  3. 0
    Imports System.Security.Principal
    
    Private Function GetGroups(userName As String) As List(Of String)
        Dim result As New List(Of String)
        Dim wi As WindowsIdentity = New WindowsIdentity(userName)
    
        For Each group As IdentityReference In wi.Groups
            Try
                result.Add(group.Translate(GetType(NTAccount)).ToString())
            Catch ex As Exception
            End Try
        Next
    
        result.Sort()
        Return result
    End Function

    Tan sólo utilizar métodos getgroups(«id de usuario»). Debido a este enfoque utiliza el SID del usuario, no explícita llamada LDAP está hecho. Si usted utiliza su propio nombre de usuario que va a utilizar las credenciales almacenadas en caché y por lo que esta función es muy rápido.

    El Try Catch es necesario porque en las grandes empresas el ANUNCIO es tan grande que algunos de los Peid son perderse en el espacio.

    ver https://stackoverflow.com/a/19403297/2886367

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea