El Blog de Gualtrysoft

Windows 2000/2003/2008, Active Directory, VBScript, Hyper-V, PowerShell y todo aquello interesante a la hora de usar, configurar y administrar Windows Server. También tenemos longanizas…

Script VbScript para obtener los grupos a los que pertenecen todos los usuarios de un dominio

Posted by urpiano en Miércoles 17 \17\UTC noviembre \17\UTC 2010

Script que devuelve las membresías, el tipo de las mismas (directa cuando el grupo aparece en la propiedad MemberOf o heredada cuando la pertenencia al grupo es debida a pertenecer a un grupo que pertenece al listado), si tienen permiso de acceso remoto o VPN y la OU a la que pertenecen todos los usuarios del dominio. La salida a pantalla o fichero se produce en formato de valores separados por tabuladores, lo que hace que al abrir el fichero en Excel tengamos los datos perfectamente separados por columnas.

Sintaxis

cscript [//nologo] membresias-usuarios.vbs [/S:fichero] [/D:dominio] [/?]

Siendo

Etiqueta Dato ¿Requerido? Descripción
S fichero No
Nombre y ruta de un fichero de texto en el que se vuelca la información en formato de valores separados por tabuladores, ideal para ser abierto con Excel. Si se omite se vuelca la información por pantalla.
D dominio No
Nombre FQDN del dominio en el que se realizará la consulta.
?   No
Muestra la ayuda en línea.

Ejemplos:

– Se lista por pantalla las membresías, contenedor en el que están y si tienen permiso de acceso remoto o VPN, de los usuarios del dominio al que pertenece el equipo y desde el que se lanza el script:

cscript //nologo membresias-usuarios.vbs

– Se creará el fichero de exportación c:\Listados\membresias-usuarios.vbs, con las membresías, contenedor en el que están y si tienen permiso de acceso remoto o VPN, de los usuarios del dominio al que pertenece el equipo y desde el que se lanza el script:

cscript //nologo membresias-usuarios.vbs /S:c:\Listados\membresias-usuarios.vbs

– Se creará el fichero de exportación c:\Listados\membresias-usuarios.vbs, con las membresías, contenedor en el que están y si tienen permiso de acceso remoto o VPN, de los usuarios del dominio cuyo FQDN es TIA.org:

cscript //nologo membresias-usuarios.vbs /S:c:\Listados\membresias-usuarios.vbs /D:TIA.org

Este es el código del script



'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'* membresias-usuarios.vbs                                             *
'*                                                                     *
'* Script que devuelve las membresías, el tipo de las mismas (directa  *
'* cuando el grupo aparece en la propiedad MemberOf o heredada cuando  *
'* la pertenencia al grupo es debida a pertenecer a un grupo que       *
'* pertenece al listado), si tienen permiso de acceso remoto o VPN y   *
'* la OU a la que pertenecen todos los usuarios del dominio. La salida *
'* a pantalla o fichero se produce en formato de valores separados por *
'* tabuladores, lo que hace que al abrir el fichero en Excel tengamos  *
'* los datos perfectamente separados por columnas.                     *
'*                                                                     *
'* Sintaxis                                                            *
'*                                                                     *
'* cscript [//nologo] membresias-usuarios.vbs [/S:fichero]             *
'* [/D:dominio] [/?]                                                   *
'*                                                                     *
'* Siendo                                                              *
'*                                                                     *
'* - /S: fichero (Opcional):                                           *
'*         Nombre y ruta de un fichero de texto en el que se vuelca la *
'*         información en formato de valores separados por             *
'*         tabuladores, ideal para ser abierto con Excel. Si se omite  *
'*         se vuelca la información por pantalla.                      *
'*                                                                     *
'* - /D: dominio (Opcional):                                           *
'*         Nombre FQDN del dominio en el que se realizará la consulta. *
'*                                                                     *
'* - /?: ayuda (Opcional):                                             *
'*         Muestra la ayuda en línea                                   *
'*                                                                     *
'*                                                                     *
'* Ejemplos:                                                           *
'*                                                                     *
'* - Se lista por pantalla las membresías, contenedor en el que están  *
'* y si tienen permiso de acceso remoto o VPN, de los usuarios del     *
'* dominio al que pertenece el equipo y desde el que se lanza el       *
'* script:                                                             *
'*                                                                     *
'* cscript //nologo membresias-usuarios.vbs                            *
'*                                                                     *
'* - Se creará el fichero de exportación                               *
'* c:\Listados\membresias-usuarios.vbs, con las membresías, contenedor *
'* en el que están y si tienen permiso de acceso remoto o VPN,  de los *
'* usuarios del dominio al que pertenece el equipo y desde el que se   *
'* lanza el script:                                                    *
'*                                                                     *
'* cscript //nologo membresias-usuarios.vbs                            *
'* /S:c:\Listados\membresias-usuarios.vbs                              *
'*                                                                     *
'* - Se creará el fichero de exportación                               *
'* c:\Listados\membresias-usuarios.vbs, con las membresías, contenedor *
'* en el que están y si tienen permiso de acceso remoto o VPN,  de los *
'* usuarios del dominio cuyo FQDN es TIA.org:                          *
'*                                                                     *
'* cscript //nologo membresias-usuarios.vbs                            *
'* /S:c:\Listados\membresias-usuarios.vbs /D:TIA.org                   *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'* © Fernando Reyes                                                    *
'* Noviembre De 2010                                                   *
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*

'Exigimos la declaración de variables
Option Explicit

Dim str_Error 'As String
Dim int_Error 'As String
Dim str_Fichero 'As String
Dim obj_Conexion 'As ADODB.Connection
Dim obj_Comando 'As ADODB.Command
Dim obj_Usuario 'As iADsUser
Dim obj_FSO 'Scripting.FileSystemObject
Dim obj_TS 'As Scripting.TextStream
Dim str_Dominio 'As String
Dim str_Filtro 'As String
Dim str_Consulta 'As String
Dim obj_Recordset 'As ADODB.Recordset
Dim str_DN 'As String
Dim str_Linea 'As String
Dim obj_Grupo 'As iADsGroup
Dim int_ContadorGrupos 'As Integer
Dim bol_VPN 'As Boolean
Dim str_Usuario 'As String
Dim bol_Grupos 'As Boolean
Dim dic_Grupos 'As Dictionary


'Validando los argumentos y almacenando
'sus valores
If f_RevisarArgumentos( _
                       str_Error, _
                       int_Error) Then

    Call s_Ayuda(str_Error)
    WScript.Quit int_Error

End If

'Montamos la línea de encabezados
str_Linea = "Nombre Distinguido" & vbTab & _
            "Nombre Para Mostrar" & vbTab & _
            "Contenedor" & vbTab & _
            "AccesoVPN" & vbTab & _
            "Miembro de" & vbTab & _
            "Tipo"
            
'Creamos el diccionario de grupos
Set dic_Grupos = CreateObject("Scripting.Dictionary")

'Si hay que volcar información en el fichero
'de salida de ruta y nombre str_Fichero
If Len(str_Fichero) > 0 Then

    'Creamos un objeto FileSystemObject
    Set obj_FSO = CreateObject("Scripting.FileSystemObject")

    'Creamos el fichero de salida
    Set obj_TS = obj_FSO.CreateTextFile(str_Fichero)

    'Volcamos el encabezado en el fichero
    obj_TS.WriteLine str_Linea

Else

    'Subrayamos los encabezados
    str_Linea = str_Linea & vbcrLf & _
                "==================" & vbTab & _
                "===================" & vbTab & _
                "==========" & vbTab & _
                "==========" & VbTab & _
                "==========" & vbTab & _
                "===="
    'Mostramos los encabezados por pantalla
    WScript.Echo str_Linea   

End If

'Conectamos con ODBC al Proveedor de Active Directory
Set obj_Conexion = CreateObject("ADODB.Connection")
Set obj_Comando = CreateObject("ADODB.Command")
obj_Conexion.Provider = "ADsDSOObject"
obj_Conexion.Open = "Active Directory Provider"
Set obj_Comando.ActiveConnection = obj_Conexion

'Creamos la cadena de consulta
str_Filtro = "(&(objectCategory=person)(objectClass=user))"
str_Consulta = "<LDAP://" & str_Dominio & ">;" & str_Filtro _
               & ";distinguishedName;subtree"

'Establecemos la consulta y las propiedades de la misma,
'poniendo paginación para poder superar el límite de
'1000 resultados que hay si no se la establece
obj_Comando.CommandText = str_Consulta
obj_Comando.Properties("Page Size") = 100
obj_Comando.Properties("Timeout") = 30
obj_Comando.Properties("Cache Results") = False

'Ejecutamos la consulta
Set obj_Recordset = obj_Comando.Execute

'Recorremos todos los usuarios del dominio
Do Until obj_Recordset.EOF

    'Vaciamos las variables de montaje de línea
    str_Linea = ""
    str_Usuario = ""

    'Obtenemos el nombre distinguido del usuario
    str_DN = obj_Recordset.Fields("distinguishedName")

    'Creamos un objeto usuario con su nombre distinguido
    Set obj_Usuario = GetObject("LDAP://" & str_DN)

    'Montamos su nombre distinguido, su nombre para mostrar
    'sus membresías y la OU a la que pertenece. Controlamos
    'si hemos recibido fichero donde volcar la información:
    'en caso afirmativo lo volcamos en el fichero, en caso
    'negativo lo mostramos en pantalla

    'Montamos el nombre distinguido
    str_Usuario = """" & Replace(obj_Usuario.distinguishedName, _
                               """","'") & """" & vbTab

    'Como no todos los usuarios tienen nombre para mostrar
    'por ejemplo el administrador), controlamos si esta
    'propiedad tiene valor, para omitir el encerrar entre
    'comillas el mismo.
    If Len(obj_Usuario.displayName) > 0 Then

        str_Usuario = str_Usuario & """" & _
                    Replace(obj_Usuario.displayName, _
                            """","'") & """"

    End If

    'Agregamos el contenedor
    str_Usuario = str_Usuario & vbTab & """" & _
                f_DNaCanonico(obj_Usuario.Parent,str_Dominio) & _
                """" & vbTab

    'Obtenemos si tiene acceso VPN. Primero iniciamos la variable
    'que lo guarda a False
    bol_VPN = False
    'Ahora establecemos control de errores, pues si no está establecida
    'esta propiedad, se produce un error
    On Error Resume Next
    'Guardamos el valor de la propiedad
    bol_VPN = obj_Usuario.Get("msNPAllowDialin")
    'Vaciamos el objeto de errores
    Err.Clear
    'Devolvemos el control de errores a CScript
    On Error Goto 0

    'Añadimos si tiene o no acceso a la línea de salida
    str_Usuario = str_Usuario & bol_VPN & vbTab


    'Ponemos a cero el contador de grupos
    int_ContadorGrupos = 0

    'Ponemos a false el indicador de que se han encontrado grupos
    bol_Grupos = False

    'Vaciamos el diccionario de grupos
    dic_Grupos.RemoveAll

    'Recorremos ahora el array de grupos a los que pertenece
    'el usuario
    For Each obj_Grupo In obj_Usuario.Groups

        'Como hemos entrado, asignamos True al indicador
        'de que se han encontrado grupos
        bol_Grupos = True

        'Si este grupo no lo hemos recorrido con anterioridad
        If (dic_Grupos.Exists( _
                          obj_Grupo.sAMAccountName) = False) Then

            'Ponemos el nombre del grupo eliminando el "CN="
            str_Linea = str_Usuario & """" & _
                        Replace(obj_Grupo.Name,"CN=","") & _
                        """" & vbTab & _
                        """Directa"""
    
            'Si no se ha recibido el parámetro de fichero, volcamos
            'la línea en pantalla
            If str_Fichero = "" Then

                WScript.Echo  str_Linea

            'en caso contrario la volcamos en el fichero
            Else

                obj_TS.WriteLine str_Linea    

            End If

            'Agregamos el grupo al diccionario para evitar una
            'segunda llamada sobre él
            dic_Grupos.Add obj_Grupo.sAMAccountName, True

            'Llamamos al método que enumerará los grupos a los que
            'pertenece este grupo
            Call s_EnumeraGrupos(obj_Grupo,str_Usuario,obj_TS)

        End If

    Next

    'Si no se han encontrado grupos hay que mostrar el usuario sin ellos
    If Not bol_Grupos Then

        'Si no se ha recibido el parámetro de fichero, volcamos la línea
        'en pantalla
        If str_Fichero = "" Then

            WScript.Echo  str_Usuario & vbTab & "Sin membresias"

        'en caso contrario la volcamos en el fichero
        Else

            obj_TS.WriteLine str_Usuario & vbTab & "Sin membresias"    

        End If
  
    End If

    'Saltamos al siguiente registro
    obj_Recordset.MoveNext

Loop



'Si estabamos volcando información en el fichero
'de salida
If Len(str_Fichero) > 0 Then

    'Cerramos el fichero de salida
    obj_TS.Close

    'Limpieza de popa :-)
    Set obj_TS = Nothing
    Set obj_FSO = Nothing

End If

Sub s_EnumeraGrupos(pobj_Grupo, str_Usuario, obj_TS)
'***********************************************************************
'* Procedimiento: s_EnumeraMiembros                                    *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 16/03/2010 16:48:01                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este método recibe un objeto de grupo de Active      *
'*                Directory y enumera los usuarios que son miembros    *
'*                de él y los de los grupos que contenga               *
'***********************************************************************

    Dim obj_Miembro    'As Object
    Dim str_NombreNT   'As String
    Dim str_NombreDN   'As String
    Dim str_Nombre     'Às String
    Dim str_Apellidos  'As String
    Dim int_UAC        'As String
    Dim str_Linea      'As String
    Dim str_Habilitada 'As String
    Dim str_CaducaEl   'As String

    'Recorremos los miembros del grupo
    For Each obj_Miembro In pobj_Grupo.Members
    
        'Sólo nos interesan los grupos
        If (LCase(obj_Miembro.Class) = "group") Then
        
            'Evitaremos los grupos que ya se han enumerado, para que
            'no se produzca un bucle infinito
            If (dic_Grupos.Exists( _
                            obj_Miembro.sAMAccountName) = False) Then
            
                'Agregamos el grupo al diccionario para evitar una
                'segunda llamada sobre él
                dic_Grupos.Add obj_Miembro.sAMAccountName, True

                'Montamos la línea a mostrar
                str_Linea = str_Usuario & """" & _
                                 Replace(obj_Miembro.Name,"CN=","") & _
                                      """" & vbTab & """Heredada"""

                'Si hay que enviar la información a un fichero
                If Len(str_Fichero) > 0 Then

                    'Escribimos en el fichero
                    obj_TS.WriteLine str_Linea

                'Como no hay que enviar la información a un fichero
                'será mostrada por pantalla
                Else

                    WScript.Echo str_Linea

                End If
                
                'Realizamos una llamada recursiva para obtener los
                'miembros del grupo
                Call s_EnumeraGrupos(obj_Miembro,str_Usuario,obj_TS)
                
            End If
            
        End If
        
    Next 'obj_Grupo.Members
    
End Sub 's_EnumeraMiembros

Function f_DNaCanonico(str_Contenedor, str_Dominio)
'***********************************************************************
'* Procedimiento: f_DNaCanonico                                        *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 17/11/2010 9:33:36                                   *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe el nombre distinguido de un      *
'*                contendor de AD, el nombre distinguido del dominio   *
'*                y devuelve el nombre del contenedor como nombre      *
'*                canónico. Por ejemplo:                               *
'*                                                                     *
'*                Contendor "OU=OU2,OU=OU1,DC=dominio,DC=local"        *
'*                Dominio "DC=dominio,DC=local"                        *
'*                Devuelve "dominio.local\OU1\OU2                      *
'*                                                                     *
'***********************************************************************
    Dim str_Temporal
    Dim int_Elemento
    Dim arr_Contenedor
    Dim arr_Dominio
    Dim int_Dominio

    'Cargamos en un array el nombre del dominio suprimiendo
    'los "DC=" y considerando como separador la coma.
    'Es decir que primero convertimos "DC=dominio,DC=local" en
    '"dominio,local" y esto lo cargamos en el array, con la coma
    'como separador, lo que nos da los elementos "dominio" y "local"
    arr_Dominio = Split(Replace(str_Dominio,"DC=",""),",")

    'Guardamos en la variable el límite superior del array (el
    'dominio podría haber sido subdominio.dominio.local, por ejemplo
    int_Dominio = UBound(arr_Dominio)

    'Cargamos ahora el nombre distinguido del usuario en la variable
    'temporal. Usamos repetidas llamadas a la función replace para
    'conseguir que "CN=Gimli,OU=Montaña Solitaria,DC=enanos,DC=org"
    'se convierta en "Gimli,Montaña Solitaria,enanos,org" y así poder
    'cargar un array usando como separador la coma
    str_Temporal = _
           Replace( _
               Replace( _
                   Replace( _
                       Replace( _
                           Replace( _
                               Replace( _
                                       obj_Usuario.Parent, _
                                       """", _
                                       "'"), _
                               "LDAP://", _
                               ""), _
                           "DC=", _
                           ""), _
                       ",OU=", _
                       ","), _
                   "OU=", _
                   ""), _
               "CN=", _
               "") 

    'Cargamos el array
    arr_Contenedor = Split(str_Temporal,",")

    'Vaciamos la variable temporal
    str_Temporal = ""

    'Ahora recorreremos el array del último al primer elemento
    For int_Elemento = UBound(arr_Contenedor) To _
        LBound(arr_Contenedor) Step -1

        'Si el límite superior menos el elemento actual es menor o igual
        'que el límite superior del array de dominio, significa que
        'estamos en la parte del nombre correspondiente al dominio. Como
        'queremos que esta parte quede con el nombre FQDN del dominio,
        'debemos encadenar los elementos por delante de lo anterior y
        'separado por un punto (estamos recibiendo antes el "local" que
        'el "dominio")
        If (UBound(arr_Contenedor) - int_Elemento) <= int_Dominio Then

            str_Temporal = arr_Contenedor(int_Elemento) & "." & str_Temporal

        Else

            'Ya no estamos en la parte de dominio, a partir de ahora queremos
            'que se encadenen los elementos detrás de lo anterior. Antes debemos
            'comprobar si estamos en el primer elemento después de los de
            'dominio, en cuyo caso hay que borrar el punto que hay siempre al
            'final después de haber montado el nombre del dominio. Necesitamos
            'además que ese punto final sea un slash inverso ("\")
            If (UBound(arr_Contenedor) - int_Elemento) = (int_Dominio + 1) Then

                'Quitamos el punto final y pegamos un slash inverso
                str_Temporal = Left(str_Temporal,Len(str_Temporal)-1) & "\"

            End If

            'En cualquier caso, concatenamos el elemento y un slash inverso
            'detrás
            str_Temporal = str_Temporal & arr_Contenedor(int_Elemento) & "\"

        End If

    Next

    'Nos sobra un slash inverso al final, lo quitamos
    str_Temporal = Left(str_Temporal,Len(str_Temporal) - 1)

    'Devolvemos la cadena que hemos montado
    f_DNaCanonico = str_Temporal

End Function 'f_DNaCanonico


Function f_RevisarArgumentos( _
                             str_Error, _
                             int_Error _
                             ) 'As Boolean
'***********************************************************************
'* Procedimiento: f_RevisarArgumentos                                  *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 17/11/2010 8:45:23                                   *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función revisa los argumentos recibidos,        *
'*                recogiendo los posibles fallos por falta de          *
'*                argumentos requeridos y almacenando en las           *
'*                variables correspondientes los argumentos            *
'*                recibidos. recibe dos parámetros cuyo fin es ser de  *
'*                salida: una cadena que almacenará los errores        *
'*                detectados y un entero que almacenará el código de   *
'*                los errores detectados. Hay tres tipos de error;     *
'*                error 1 para los argumentos sin nombre requeridos y  *
'*                no encontrados, error 2 para los argumentos con      *
'*                nombre requeridos y no encontrados, por último,      *
'*                error 4 para los combos de argumentos opcionales     *
'*                (un combo de argumentos opcionales es aquel          *
'*                conjunto de argumentos opcionales que es requerido   *
'*                que se pase al menos uno de ellos y que si se pasa   *
'*                más de uno se ignorarán aquellos que estén detrás    *
'*                en la prioridad entre ellos; una característica      *
'*                clara de lo que es un combo de argumentos es cuando  *
'*                dos omás argumentos almacenan su valor en la misma   *
'*                variable). En el caso de producirse más de un tipo   *
'*                de error, el número de error será la suma de ambos   *
'*                de los errores recibidos, es decir 3, 5 o 6          *
'***********************************************************************

    Dim bol_Devolucion 'As Boolean
    Dim bol_Error1 'As Boolean
    Dim bol_Error2 'As Boolean
    Dim bol_Error4 'As Boolean
    Dim obj_RaizDSE 'As RootDSE

    'Iniciamos los indicadores
    bol_Devolucion = False
    bol_Error1 = False
    bol_Error2 = False
    bol_Error4 = False


    'Si hay que mostrar la ayuda, se muestra y
    'termina el script
    If WScript.Arguments.Named.Exists("?") Then

        Call s_Ayuda("******************" & vbCrLf & _
                     "*     AYUDA      *" & vbCrLf & _
                     "******************")

        WScript.Quit 0

    End If

    'Revisamos que esté el argumento
    '/S (fichero)
    If WScript.Arguments.Named.Exists("S") Then

        str_Fichero =  _
               WScript.Arguments.Named("S")

    End If

    'Revisamos que esté el argumento
    '/D (dominio)
    If WScript.Arguments.Named.Exists("D") Then

        'Como el nombre de dominio está en formato FQDN
        '(dominio.com), lo pasamos a nombre distinguido
        '(DC=dominio,DC=com)
        str_Dominio = "DC=" & _
                      Replace( _
                         WScript.Arguments.Named.Item("D"), _
                         ".", _
                         ",DC=")

    Else

        'Como no se ha recibido el nombre de dominio, se usará
        'el del usuario que lanza el script. Para ello obtendremos
        'el nombre distinguido del dominio, creando un objeto
        'RootDSE y obteniendo su propiedad defaultNamingContext
        Set obj_RaizDSE = GetObject("LDAP://RootDSE")
        str_Dominio = obj_RaizDSE.Get("defaultNamingContext")

        'Limpieza de caquitas :oP
        Set obj_RaizDSE = Nothing

    End If

    'Preparamos las variables de devolucion:
    'el entero como suma de los posibles errores 1, 2 y 4
    int_Error = Abs(bol_Error1) + _
                (2 * Abs(bol_Error2)) + _
                (4 * Abs(bol_Error4))
    'La devolucion de la función será True en caso de
    'haber alguno de los errores
    bol_Devolucion = (bol_Error1 Or bol_Error2 Or bol_Error4)

    'Hacemos la devolución de la función
    f_RevisarArgumentos = bol_Devolucion

End Function 'f_RevisarArgumentos

Sub s_Ayuda(str_Error)
'***********************************************************************
'* Procedimiento: s_Ayuda                                              *
'* Tipo         : Sub                                                  *
'* Devolución   :                                                      *
'* Fecha y Hora : 17/11/2010 9:44:00                                   *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este procedimiento muestra la ayuda en línea.        *
'*                Recibe un parámetro de tipo cadena que si viene      *
'*                será mostrado antes de la línea; pensado para que    *
'*                se muestre un error que se haya detectado.           *
'***********************************************************************

    'Si hay que mostrar algún texto previo a la ayuda, lo hacemos
    If Len(str_Error) > 0 Then

        WScript.Echo str_Error & vbCrLf & vbCrLf

    End If

    'A continuación, mostramos la ayuda por pantalla
    WScript.Echo "Script que devuelve las membresías, el tipo de la" & _
                 "s mismas (directa cuando el"
    WScript.Echo "grupo aparece en la propiedad MemberOf o heredada" & _
                 " cuando la pertenencia al"
    WScript.Echo "grupo es debida a pertenecer a un grupo que perte" & _
                 "nece al listado), si tienen"
    WScript.Echo "permiso de acceso remoto o VPN y la OU a la que p" & _
                 "ertenecen todos los usuarios"
    WScript.Echo "del dominio. La salida a pantalla o fichero se pr" & _
                 "oduce en formato de valores"
    WScript.Echo "separados por tabuladores, lo que hace que al abr" & _
                 "ir el fichero en Excel"
    WScript.Echo "tengamos los datos perfectamente separados por co" & _
                 "lumnas."
    WScript.Echo ""
    WScript.Echo "Sintaxis"
    WScript.Echo ""
    WScript.Echo "cscript [//nologo] membresias-usuarios.vbs [/S:fi" & _
                 "chero] [/D:dominio] [/?]"
    WScript.Echo ""
    WScript.Echo "Siendo"
    WScript.Echo ""
    WScript.Echo "- /S: fichero (Opcional):"
    WScript.Echo "Nombre y ruta de un fichero de texto en el que se" & _
                 " vuelca la"
    WScript.Echo "información en formato de valores separados por t" & _
                 "abuladores,"
    WScript.Echo "ideal para ser abierto con Excel. Si se omite se " & _
                 "vuelca la"
    WScript.Echo "información por pantalla."
    WScript.Echo ""
    WScript.Echo "- /D: dominio (Opcional):"
    WScript.Echo "Nombre FQDN del dominio en el que se realizará la" & _
                 " consulta."
    WScript.Echo ""
    WScript.Echo "- /?: ayuda (Opcional):"
    WScript.Echo "Muestra la ayuda en línea"
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo "Ejemplos:"
    WScript.Echo ""
    WScript.Echo "- Se lista por pantalla las membresías, contenedo" & _
                 "r en el que están y si tienen"
    WScript.Echo "permiso de acceso remoto o VPN, de los usuarios d" & _
                 "el dominio al que pertenece el"
    WScript.Echo "equipo y desde el que se lanza el script:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo membresias-usuarios.vbs"
    WScript.Echo ""
    WScript.Echo "- Se creará el fichero de exportación c:\Listados" & _
                 "\membresias-usuarios.vbs, con"
    WScript.Echo "las membresías, contenedor en el que están y si t" & _
                 "ienen permiso de acceso remoto"
    WScript.Echo "o VPN,  de los usuarios del dominio al que perten" & _
                 "ece el equipo y desde el que"
    WScript.Echo "se lanza el script:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo membresias-usuarios.vbs /S:c:\Li" & _
                 "stados\membresias-usuarios.vbs"
    WScript.Echo ""
    WScript.Echo "- Se creará el fichero de exportación c:\Listados" & _
                 "\membresias-usuarios.vbs, con"
    WScript.Echo "las membresías, contenedor en el que están y si t" & _
                 "ienen permiso de acceso remoto"
    WScript.Echo "o VPN,  de los usuarios del dominio cuyo FQDN es " & _
                 "TIA.org:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo membresias-usuarios.vbs /S:c:\Li" & _
                 "stados\membresias-usuarios.vbs"
    WScript.Echo "/D:TIA.org"
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo ""

End Sub 's_Ayuda

5 comentarios to “Script VbScript para obtener los grupos a los que pertenecen todos los usuarios de un dominio”

  1. Enric said

    Hola, necesito un vbs que valide a un usuario de un grupo en concreto del active directory y me devuelva true (pertenece al grupo) o false (no pertenece al grupo). Por ejemplo, al grupo : CN=MENUSW,OU=Groups,OU=TIVOLI,DC=ofidona,DC=net

    Es posible, es un poco urgente?

    Espero su respuesta,

    Un saludo.

    • urpiano said

      Prueba con los scripts de R.L. Mueller para consultar la membresía o no de un usuario:

      Group Membership Test
      http://www.rlmueller.net/freecode1.htm

      • Enric said

        Esa página está muy bién pero yo no tengo ni idea de vbs y no se que parametros tengo que modificar para que funcione.

        Gracias de todas formas.

      • urpiano said

        Enric,

        Yo utilizaría el script IsMember4.vbs. Tienes que editarlo para poner el usuario que quieres. El usuario se pone con su nombre distinguido al principio del script, en la línea que dice:

        Set objADObject = _
        GetObject(“LDAP://cn=TestUser,ou=Sales,dc=MyDomain,dc=com”)

        Tienes que cambiar cn=TestUser,ou=Sales,dc=MyDomain,dc=com por el nombre distinguido del usuario que quieres probar.

        El script testea la pertenencia al los grupos Students, Parish y Domain Users. Basta con que cambies el nombre de los grupos que quieras consultar y con que añadas o quites los bloques correspondientes. Para cambiar el nombre de grupo a consultar tienes que cambiar la asignación:

        strGroup = “Students”

        Cambiando Students por el nombre del grupo que quieres testear. Si sólo quieres consultar un grupo, tienes que borrar los otros bloques de código, es decir, borrar esto:

        strGroup = “Parish”
        If (IsMember(strGroup) = True) Then
        Wscript.Echo “User ” & objADObject.name _
        & ” is a member of group ” & strGroup
        Else
        Wscript.Echo “User ” & objADObject.name _
        & ” is NOT a member of group ” & strGroup
        End If

        strGroup = “Domain Users”
        If (IsMember(strGroup) = True) Then
        Wscript.Echo “User ” & objADObject.name _
        & ” is a member of group ” & strGroup
        Else
        Wscript.Echo “User ” & objADObject.name _
        & ” is NOT a member of group ” & strGroup
        End If

  2. سيو said

    Quite a few people want to pursue this interest for health, others for their self-esteem, while intend make
    an aesthetic significance. In today’s modern “mobile” world of internet savvy travellers, packing for a trip abroad is no longer just
    about suntan lotion and a great book, it is all about the travel gadgets.

    On the one hand, BNP notes – as we have this week –
    that there is a clear divergence between the fortunes of American consumers and other parts of the economy.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: