Imports System.DirectoryServices.AccountManagement
Imports System.DirectoryServices
Imports System.Text
Public Class Form1    
    'Boton que devuelve la lista de usuarios de un grupo especifico
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim strNombreGrupo As String
        Dim strUsuariosGrupo As String
        strNombreGrupo = InputBox("Introduce el nombre del grupo del directorio activo " _
            & "del que quieres visualizar los usuarios :", "INTRODUZCA EL GRUPO ")
        strUsuariosGrupo = ObtenerUsuariosGrupo(strNombreGrupo)
        MessageBox.Show(strUsuariosGrupo, "USUARIOS DEL GRUPO: " & strNombreGrupo, _
            MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub
 
    'Funcion que devuelve toda la lista de usuarios de un grupo especifico
    Public Function ObtenerUsuariosGrupo(ByVal strNombreGrupo As String) As String
        Dim objDirectorioActivo As DirectoryEntry = New DirectoryEntry("LDAP://192.168.1.108/DC=indar,DC=local")
        Dim dsDirectorySearcher As New DirectorySearcher(objDirectorioActivo)
        Dim strUsuarios As String
        Dim intEqualsIndex As Integer
        Dim intCommaIndex As Integer
        Dim sbGroupUsers As New StringBuilder
        With dsDirectorySearcher
            .Filter = "sAMAccountName=" & strNombreGrupo
            .PropertiesToLoad.Add("member")
            Try
                Dim dsResult As SearchResult = .FindOne
                Dim contador As Integer
                If dsResult Is Nothing Then
                    Return Nothing
                End If
 
                For contador = 0 To dsResult.Properties("member").Count - 1
                    strUsuarios = dsResult.Properties("member")(contador).ToString
                    intEqualsIndex = strUsuarios.IndexOf("=", 1)
                    intCommaIndex = strUsuarios.IndexOf(",", 1)
                    If intEqualsIndex = -1 Then
                        Return Nothing
                    End If
                    'Extraer el nombre del string
                    sbGroupUsers.Append(strUsuarios.Substring((intEqualsIndex + 1), (intCommaIndex - intEqualsIndex) - 1))
                    sbGroupUsers.Append(ControlChars.CrLf)
                Next contador
            Catch ex As Exception
                MessageBox.Show("Error en funcion ObtenerUsuariosGrupo" & vbNewLine & vbNewLine _
                    & ex.Message, "Active Directory Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End With
        Return sbGroupUsers.ToString
    End Function
 
    'Boton que devuelve todos los grupos a los que pertenece un usuario especifico.
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim strUserLogin As String
        Dim strGrupos As String
        strUserLogin = InputBox("Introduzca el login name del usuario :", "INTRODUZCA EL LOGIN NAME DEL USUARIO")
        strGrupos = ObtenerGruposUsuario(strUserLogin)
        MessageBox.Show(strGrupos, "GRUPOS DEL USUARIO: " & strUserLogin, MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub
 
    'Devuelve todos los grupos a los que pertenece un usuario especifico
    Public Function ObtenerGruposUsuario(ByVal strLoginName As String) As String
        Dim dsDirectoryEntry As New DirectoryEntry("LDAP://192.168.1.108/DC=indar,DC=local")
        Dim dsSearcher As New DirectorySearcher(dsDirectoryEntry)
        Dim contador As Integer
        Dim strGrupos As String
        Dim intEqualsIndex As Integer
        Dim intCommaIndex As Integer
        Dim sbUserGroups As New StringBuilder
        dsSearcher.Filter = "saMAccountName=" & strLoginName
        dsSearcher.PropertiesToLoad.Add("memberOf")
        Try
            Dim dsResult As SearchResult = dsSearcher.FindOne
            If dsResult Is Nothing Then
                Return Nothing
            End If
            For contador = 0 To (dsResult.Properties("memberOf").Count - 1)
                strGrupos = CType(dsResult.Properties("memberOf")(contador), String)
                intEqualsIndex = strGrupos.IndexOf("=", 1)
                intCommaIndex = strGrupos.IndexOf(",", 1)
                If intEqualsIndex = -1 Then
                    Return Nothing
                End If
                sbUserGroups.Append(strGrupos.Substring((intEqualsIndex + 1), (intCommaIndex - intEqualsIndex) - 1))
                sbUserGroups.Append(ControlChars.CrLf)
            Next
        Catch ex As Exception
            MessageBox.Show("Error en funcion ObtenerGruposUsuario" & vbNewLine & vbNewLine _
                & ex.Message, "Active Directory Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
        Return sbUserGroups.ToString.Trim
    End Function
 
    'Boton con el que se comprueba si un usuario pertenece a un grupo
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Dim strLogin As String
        Dim strGrupo As String
        Dim blnValidated As Boolean
        Dim strDisplayResults As String
        strLogin = InputBox("Introduce el LOGIN name del usuario: ", "INTRODUZCA LOGIN NAME DEL USUARIO")
        strGrupo = InputBox("Introduce el GRUPO: ", "INTRODUZCA EL GRUPO")
        blnValidated = ValidarGrupoUsuario(strLogin, strGrupo)
        If blnValidated = True Then
            strDisplayResults = "El usuario '" & strLogin & "' SI pertenece al grupo '" & strGrupo & "' ."
        Else
            strDisplayResults = "El usuario '" & strLogin & "' NO pertenece al grupo '" & strGrupo & "' ."
        End If
        MessageBox.Show(strDisplayResults, "Comprobar si un USUARIO pertenece a un GRUPO", _
            MessageBoxButtons.OK, MessageBoxIcon.Information)
    End Sub
 
    'Funcion que devuelve TRUE si el usuario pertenece al grupo y devuelve FALSE si el usuario no pertenece al grupo
    Public Function ValidarGrupoUsuario(ByVal strLoginName As String, ByVal strNombreGrupo As String) As Boolean
        Dim strNombreUsuario As String
        Dim strUsuariosGrupo As String
        Dim blnUserValidated As Boolean = False
        Dim intResult As Integer
        strNombreUsuario = ObtenerNombreUsuario(strLoginName)
        If strNombreUsuario.Trim = "" Then
            Return blnUserValidated
        End If
        strUsuariosGrupo = ObtenerUsuariosGrupo(strNombreGrupo)
        If strUsuariosGrupo = Nothing Then
            Return blnUserValidated
        End If
        intResult = strUsuariosGrupo.IndexOf(strNombreUsuario)
        If intResult > -1 Then
            'User found in group
            blnUserValidated = True
        Else
            'User not found in group
            blnUserValidated = False
        End If
        Return blnUserValidated
    End Function
 
    'Devuelve el nombre completo del directorio activo 
    Public Function ObtenerNombreUsuario(Optional ByVal strLoginName As String = "", Optional ByVal strDomainName As String = "") As String
        Dim dsDirectoryEntry As New DirectoryEntry
        Dim strPath As String
        Dim strDomain As String
        Dim strLogin As String
        Dim strFullName As String
        If strDomainName = "" Then
            strDomain = GetDomainName()
        Else
            strDomain = strDomainName
        End If
        If strLoginName = "" Then
            strLogin = GetLoginName()
        Else
            strLogin = strLoginName
        End If
        'Unknown error when trying to use LADP instead of WinNT
        strPath = "WinNT://" & strDomain & "/" & strLogin
        Try
            dsDirectoryEntry = New DirectoryEntry(strPath)
            strFullName = CType(dsDirectoryEntry.Invoke("Get", "FullName"), String)
        Catch ex As Exception
            strFullName = ""
        Finally
            dsDirectoryEntry.Close()
            dsDirectoryEntry.Dispose()
        End Try
        Return strFullName
    End Function
 
    Public Function GetDomainName() As String
        Dim strDomain As String
        strDomain = System.Security.Principal.WindowsIdentity.GetCurrent.Name
        strDomain = Mid(strDomain, 1, InStr(strDomain, "\") - 1)
        Return strDomain
    End Function
 
    Public Function GetLoginName() As String
        'Returns the users Login name
        Return System.Environment.UserName
    End Function
 
    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        Me.Close()
    End Sub
End Class