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 Listar Los Usuarios Miembros De Un Grupo

Posted by urpiano en Jueves 18 \18\UTC marzo \18\UTC 2010

Este script nos permite listar los usuarios que peretenecen a un grupo que se recibe como parámetro, ya sea en su nombre NT como en su nombre distinguido. Recibe también un nombre de carpeta en la que creará un fichero de valores separados por tabuladores con la lista de usuarios

Sintaxis

cscript [//nologo] Listar-MiembrosDeGrupo.vbs [/C:carpeta_salida] [/NT:nombre_nt] [/DN:nombre_distinguido] [/?]

Siendo

Etiqueta Dato ¿Requerido? Descripción
C carpeta_salida No
Nombre de la carpeta en la que se guardará el fichero con los resultados. Si no existe será creada. Si se omite, los resultados se muestran por pantalla. El nombre del fichero generado será la fecha y hora en formato YYYYMMDD_HHMM seguido del nombre NetBios del grupo recibido como parámetro, con extensión tab (por ejemplo: 20100318_1233_AccesoCPD.tab).
NT nombre_nt No
Nombre NetBios del grupo (dominio\grupo). En caso de contener espacios, debera ser encerrado entre comillas. Si se omite se esperará el nombre distinguido, si este tampoco es pasado el script terminará mostrando un error.
DN nombre_distinguido No
Nombre distinguido del grupo (cn=grupo,ou=ou,dc=dominio,dc=local). En caso de contener espacios, debera ser encerrado entre comillas. Si se omite se esperará el nombre NetBios, si este tampoco es pasado el script terminará mostrando un error.
?   No
Muestra la ayuda en línea.

Ejemplos:

– Se creará un fichero de exportación de los usuarios del grupo TIA\Agentes en la carpeta d:\DatosAcceso:

cscript //nologo Listar-MiembrosDeGrupo.vbs /C:d:\DatosAcceso /NT:TIA\Agentes

– Se creará un fichero de exportación de los usuarios del grupo cn=Agentes,OU=usuarios,DC=tia,DC=org en la carpeta d:\DatosAcceso:

cscript //nologo Listar-MiembrosDeGrupo.vbs /C:d:\DatosAcceso /DN:cn=Agentes,OU=usuarios,DC=tia,DC=org

Este es el código del script



'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'* listar-MiembrosDeGrupo.vbs                                          *
'*                                                                     *
'* Este script nos permite listar los usuarios que pertenecen a un     *
'* grupo que se recibe como parámetro, ya sea en su nombre NT como en  *
'* su nombre distinguido. Recibe también un nombre de carpeta en la    *
'* que creará un fichero de valores separados por tabuladores con la   *
'* lista de usuarios                                                   *
'*                                                                     *
'* Sintaxis                                                            *
'*                                                                     *
'* cscript [//nologo] listar-caducidad-password-ad.vbs                 *
'* [/C:carpeta_salida] [/NT:nombre_nt | /DN:nombre_distinguido] [/?]   *
'*                                                                     *
'* Siendo                                                              *
'*                                                                     *
'* - /C: carpeta_salida (Opcional):                                    *
'*         Nombre de la carpeta en la que se guardará el fichero con   *
'*         los resultados. Si no existe será creada. Si se omite, los  *
'*         resultados se muestran por pantalla. El nombre del fichero  *
'*         generado será la fecha y hora en formato YYYYMMDD_HHMM      *
'*         seguido del nombre NetBios del grupo recibido como          *
'*         parámetro, con extensión tab (por ejemplo:                  *
'*         20100318_1233_AccesoCPD.tab).                               *
'*                                                                     *
'* - /NT: nombre_nt (Opcional):                                        *
'*         Nombre NetBios del grupo (dominio\grupo). En caso de        *
'*         contener espacios, debera ser encerrado entre comillas. Si  *
'*         se omite se esperará el nombre distinguido, si este tampoco *
'*         es pasado el script terminará mostrando un error.           *
'*                                                                     *
'* - /DN: nombre_distinguido (Opcional):                               *
'*         Nombre distinguido del grupo                                *
'*         (cn=grupo,ou=ou,dc=dominio,dc=local). En caso de contener   *
'*         espacios, debera ser encerrado entre comillas. Si se omite  *
'*         se esperará el nombre NetBios, si este tampoco es pasado el *
'*         script terminará mostrando un error.                        *
'*                                                                     *
'* - /?: ayuda (Opcional):                                             *
'*         Muestra la ayuda en línea                                   *
'*                                                                     *
'*                                                                     *
'* Ejemplos:                                                           *
'*                                                                     *
'* - Se creará un fichero de exportación de los usuarios del grupo     *
'* TIA\Agentes en la carpeta d:\DatosAcceso:                           *
'*                                                                     *
'* cscript //nologo listar-miembrosdegrupo.vbs /C:d:\DatosAcceso       *
'* /NT:TIA\Agentes                                                     *
'*                                                                     *
'* - Se creará un fichero de exportación de los usuarios del grupo     *
'* cn=Agentes,OU=usuarios,DC=tia,DC=org en la carpeta d:\DatosAcceso:  *
'*                                                                     *
'* cscript //nologo listar-miembrosdegrupo.vbs /C:d:\DatosAcceso       *
'* /DN:cn=Agentes,OU=usuarios,DC=tia,DC=org                            *
'*                                                                     *
'*                                                                     *
'* © Fernando Reyes                                                    *
'* Marzo De 2010                                                       *
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*

'Exigimos la declaración de variables
Option Explicit


Dim str_Error    'As String
Dim int_Error    'As String
Dim str_Carpeta  'As String
Dim str_Grupo    'As String
Dim str_GrupoNT  'As String
Dim obj_FS       'As FileSystemObject
Dim obj_TS       'As TextStream
Dim str_Fichero  'As String
Dim dic_Grupos   'As Dictionary
Dim dic_Usuarios 'As Dictionary
Dim obj_Grupo    'As Object

'Validamos los argumentos y almacenamos sus valores
If f_RevisarArgumentos( _
                       str_Error, _
                       int_Error) Then

    Call s_Ayuda(str_Error)
    WScript.Quit int_Error

End If

'Creamos los diccionarios de grupos y usuarios
Set dic_Grupos = CreateObject("Scripting.Dictionary")
Set dic_Usuarios = CreateObject("Scripting.Dictionary")

'Establecemos que las comparaciones de los diccionarios no sean
'sensibles al caso
dic_Grupos.CompareMode = vbTextCompare
dic_Usuarios.CompareMode = vbTextCompare

'Obtenemos el grupo recibido como parámetro con el proveedor LDAP
Set obj_Grupo = GetObject("LDAP://" & str_Grupo)

'Agregamos el nombre de NT del grupo al diccionario. Usaremos éste
'como clave del elemento del diccionario, al ser único en el dominio
dic_Grupos.Add obj_Grupo.sAMAccountName, True

'Si la salida no es a fichero, mostramos los encabezados
If Len(str_Fichero) = 0 Then _
    WScript.Echo "sAMAccountName" & vbTab & _
                 "DN" & vbTab & _
                 "Apellidos" & vbTab & _
                 "Nombre" & vbTab & _
                 "UAC" & vbTab & _
                 "Grupo" & vbTab & _
                 "SubGrupo"

'Llamamos al método que realiza la enumeración
Call s_EnumeraMiembros(obj_Grupo)

Sub s_EnumeraMiembros(pobj_Grupo)
'***********************************************************************
'* 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 aquellos miembros que sean usuarios y no
        'hayan sido ya enumerados
        If LCase(obj_Miembro.Class) = "user" _
        And (dic_Usuarios.Exists( _
                               obj_Miembro.sAMAccountName) = False) Then
        
            'Vaciamos las variables en las que iremos almacenando los
            'atributos del usuario. Esto lo hacemos para evitar que 
            'al recoger los atributos que no tengan contenido (dan error
            'al intentar leerlos) el usuario presente los atributos del
            'usuario anterior a él que sí los tenía (lo provoca el 
            'On error Resume Next).
            str_NombreNT = ""
            str_NombreDN = ""
            str_Nombre = ""
            str_Apellidos = ""
            int_UAC = 0
            str_Habilitada = "True"
            str_CaducaEl = ""
            
            'Necesitamos saltarnos los errores al leer atributos vacíos
            On Error Resume Next

            'Almacenamos en las variables los atributos
            str_NombreNT = obj_Miembro.sAMAccountName
            str_NombreDN = obj_Miembro.distinguishedName
            str_Nombre = obj_Miembro.FirstName
            str_Apellidos = obj_Miembro.sn
            int_UAC = obj_Miembro.UserAccountControl
            If obj_Miembro.AccountDisabled Then str_Habilitada = "False"
            str_CaducaEl = Year(obj_Miembro.AccountExpirationDate) & _
                           Right("00" & _
                                Month( _
                                  obj_Miembro.AccountExpirationDate),2) & _
                           Right("00" & _
                                Day( _
                                  obj_Miembro.AccountExpirationDate),2)
            If Year(obj_Miembro.AccountExpirationDate) <= 1970 Then _
                                                        str_CaducaEl = ""

            'Limpiamos el objeto Err por si se habían producido errores
            Err.Clear
            
            'Devolvemos el control de errores a CScript
            On Error Goto 0
            
            'Montamos la linea de salida
            str_Linea = str_NombreNT & vbTab & _
                        str_NombreDN & vbTab & _
                        str_Nombre & vbTab & _
                        str_Apellidos & vbTab & _
                        int_UAC & vbTab & _
                        str_Habilitada & vbTab & _
                        str_CaducaEl & vbTab & _
                        str_GrupoNT & vbTab & _
                        f_NTaDN("",pobj_Grupo.distinguishedName)

            'Se produce la salida, por pantalla o por fichero, según fue
            'la llamada al script. Si el nombre de fichero no está vacío
            'hay que escribir en él, en caso contrario mostrar por pantalla
            If Len(str_Fichero) > 0 Then
            
                obj_TS.WriteLine str_Linea
            
            Else
            
                WScript.Echo str_Linea
                
            End If    
                         
            'Agregamos al usuario al diccionario de usuarios
            dic_Usuarios.Add obj_Miembro.sAMAccountName, True             
                         
        'Si el objeto es un grupo, deberemos realizar una llamada
        'recursiva
        ElseIf (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
                
                'Realizamos una llamada recursiva para obtener los
                'miembros del grupo
                Call s_EnumeraMiembros(obj_Miembro)
                
            End If
            
        End If
        
    Next 'pobj_Grupo.Members
    
End Sub 's_EnumeraMiembros    

Function f_RevisarArgumentos( _
                             str_Error, _
                             int_Error _
                             ) 'As Boolean
'***********************************************************************
'* Procedimiento: f_RevisarArgumentos                                  *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 16/03/2010 14:19:36                                  *
'* 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 dt_Ahora 'As DateTime

    '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

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

    'Revisamos si ha sido pasado el argumento
    '/NT (nombre_nt)
    If WScript.Arguments.Named.Exists("NT") Then

        'Almacenamos el nombre NT
        str_GrupoNT = WScript.Arguments.Named("NT")
        
        'Obtenemos el nombre distinguido
        str_Grupo = f_NTaDN(str_GrupoNT,"")

        'Quitamos el nombre de dominio al nombre NT
        str_GrupoNT = obj_FS.GetFileName(str_GrupoNT)

    'Revisamos si ha sido pasado el argumento
    '/DN (nombre_distinguido)
    Elseif WScript.Arguments.Named.Exists("DN") Then

        'Almacenamos el nombre distinguido
        str_Grupo = WScript.Arguments.Named("DN")
        
        'Obtenemos el nombre NT
        str_GrupoNT = f_NTaDN("",str_Grupo)

    Else

        str_Error = str_Error & _
                    "Error 4: No se ha pasado " & _
                    "ninguno de los argumentos" & _
                    " integrantes de un combo " & _
                    "de argumentos. En un comb" & _
                    "o de argumentos todos los" & _
                    " argumentos son opcionale" & _
                    "s, sin embargo debe ser p" & _
                    "asado uno al menos; si se" & _
                    " pasa más de uno, sólo se" & _
                    " tendrá en cuenta uno, el" & _
                    " primero en el orden de a" & _
                    "rgumentos del combo. En e" & _
                    "ste caso los argumentos q" & _
                    "ue integran el combo son " & _
                    "(en orden de prioridad): "
        str_Error = str_Error & _
                    """/NT""" & _
                    " y ""/DN""" & vbCrLf
        bol_Error4 = True

    End If

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

        'Almacenamos la carpeta recibida en la variable
        str_Carpeta =  WScript.Arguments.Named("C")
        
        'Nos aseguramos de que termine en slash inverso
        If Right(str_Carpeta, 1) <> "\" Then _
                       str_Carpeta = str_Carpeta & "\"
                      
        'Obtenemos la fecha y hora
        dt_Ahora = Now
        
        'Montamos el nombre del equipo de la siguiente forma:
        'fecha y hora en formato YYYYMMDD_HHMM_ y nombre NT
        'del grupo que se consultará, con extensión TAB; por ejemplo
        '20100318_0905_Operadores.tab
        str_Fichero = Year(dt_Ahora) & _
                      Right("00" & Month(dt_ahora),2) & _
                      Right("00" & Day(dt_ahora),2) & _
                      "_" & _
                      Right("00" & Hour(dt_ahora),2) & _
                      Right("00" & Minute(dt_ahora),2) & _
                      "_" & _
                      Replace(str_GrupoNT,"\","¬") & _
                      ".tab"        
        'Establecemos control de errores
        On Error Resume Next
        
        'Creamos la carpeta
        obj_FS.CreateFolder(str_Carpeta)
        
        'Si la carpeta ya existía, se produjo un error; limpiamos el objeto
        'Err
        Err.Clear
        
        'Devolvemos el control de errores a CScript
        On Error Goto 0
        
        'Creamos el fichero de salida
        Set obj_TS = obj_FS.CreateTextFile(str_Carpeta & str_Fichero, True)
        
        'Le ponemos los encabezados de campos
        obj_TS.WriteLine "sAMAccountName" & vbTab & _
                         "DN" & vbTab & _
                         "Apellidos" & vbTab & _
                         "Nombre" & vbTab & _
                         "UAC" & vbTab & _
                         "Habilitada" & vbTab & _
                         "CaducaEl" & vbTab & _
                         "Grupo" & vbTab & _
                         "SubGrupo"                        
        
    Else
    
        str_Carpeta = ""
        str_Fichero = ""

    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 : 16/03/2010 14:19:36                                  *
'* 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 "Este script nos permite listar los usuarios que p" & _
                 "ertenecen a un grupo que se"
    WScript.Echo "recibe como parámetro, ya sea en su nombre NT com" & _
                 "o en su nombre distinguido."
    WScript.Echo "Recibe también un nombre de carpeta en la que cre" & _
                 "ará un fichero de valores"
    WScript.Echo "separados por tabuladores con la lista de usuarios"
    WScript.Echo ""
    WScript.Echo "Sintaxis"
    WScript.Echo ""
    WScript.Echo "cscript [//nologo] listar-miembrosdegrupo.v" & _
                 "bs [/C:carpeta_salida]"
    WScript.Echo "[/NT:nombre_nt | /DN:nombre_distinguido] [/?]"
    WScript.Echo ""
    WScript.Echo "Siendo"
    WScript.Echo ""
    WScript.Echo "- /C: carpeta_salida (Opcional):"
    WScript.Echo "Nombre de la carpeta en la que se guardará el fic" & _
                 "hero con los"
    WScript.Echo "resultados. Si no existe será creada. Si se omite" & _
                 ", los"
    WScript.Echo "resultados se muestran por pantalla. El nombre de" & _
                 "l fichero"
    WScript.Echo "generado será la fecha y hora en formato YYYYMMDD" & _
                 "_HHMM seguido"
    WScript.Echo "del nombre NetBios del grupo recibido como paráme" & _
                 "tro, con"
    WScript.Echo "extensión tab (por ejemplo: 20100318_1233_AccesoC" & _
                 "PD.tab)."
    WScript.Echo ""
    WScript.Echo "- /NT: nombre_nt (Opcional):"
    WScript.Echo "Nombre NetBios del grupo (dominio\grupo). En caso" & _
                 " de contener"
    WScript.Echo "espacios, debera ser encerrado entre comillas. Si" & _
                 " se omite se"
    WScript.Echo "esperará el nombre distinguido, si este tampoco e" & _
                 "s pasado el"
    WScript.Echo "script terminará mostrando un error."
    WScript.Echo ""
    WScript.Echo "- /DN: nombre_distinguido (Opcional):"
    WScript.Echo "Nombre distinguido del grupo"
    WScript.Echo "(cn=grupo,ou=ou,dc=dominio,dc=local). En caso de " & _
                 "contener"
    WScript.Echo "espacios, debera ser encerrado entre comillas. Si" & _
                 " se omite se"
    WScript.Echo "esperará el nombre NetBios, si este tampoco es pa" & _
                 "sado el script"
    WScript.Echo "terminará mostrando un error."
    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 creará un fichero de exportación de los usua" & _
                 "rios del grupo TIA\Agentes en"
    WScript.Echo "la carpeta d:\DatosAcceso:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-miembrosdegrupo.vbs" & _
                 " /C:d:\DatosAcceso"
    WScript.Echo "/NT:TIA\Agentes"
    WScript.Echo ""
    WScript.Echo "- Se creará un fichero de exportación de los usua" & _
                 "rios del grupo"
    WScript.Echo "cn=Agentes,OU=usuarios,DC=tia,DC=org en la carpet" & _
                 "a d:\DatosAcceso:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-miembrosdegrupo.vbs" & _
                 " /C:d:\DatosAcceso"
    WScript.Echo "/DN:cn=Agentes,OU=usuarios,DC=tia,DC=org"
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo ""

End Sub 's_Ayuda

Function f_NTaDN(str_RutaNT, str_DN) 'As String
'***********************************************************************
'* Procedimiento: f_NTaDN                                              *
'* Tipo         : Función                                              *
'* Devolución   : Cadena                                               *
'* Fecha y Hora : May 2007                                             *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe o bien el nombre NT              *
'*                ("dominio\nombre"), como primer parámetro, de un     *
'*                objeto de dominio y devuelve el nombre distinguido   *
'*                de ese objeto, o bien el nombre distinguido de un    *
'*                objeto, como segundo parámetro, y devuelve el        *
'*                nombre NT.                                           *
'*                Basada en el código de Richard Mueller, MVP de       *
'*                Scripting y ADSI (http://www.rlmueller.net)          *
'***********************************************************************

    'Constantes para el objeto NameTranslate
    Const ADS_NAME_INITTYPE_GC = 3
    Const ADS_NAME_TYPE_NT4 = 3
    Const ADS_NAME_TYPE_1779 = 1

    Dim obj_TraductorDeNombres
    Dim int_De, int_A,str_Nombre

    If  Len(str_RutaNT) > 0 Then

        int_De = ADS_NAME_TYPE_NT4
        int_A = ADS_NAME_TYPE_1779
        str_Nombre = str_RutaNT

    ElseIf Len(str_DN) > 0 Then

        int_De = ADS_NAME_TYPE_1779
        int_A = ADS_NAME_TYPE_NT4
        str_Nombre = str_DN

    Else

        WScript.Echo "Error 1 en f_NTaDN: No se ha pasado " & _
                     "ningún nombre para traducir."
        Exit Function
    End If
    'Creamos el objeto NameTranslate.
    Set obj_TraductorDeNombres = CreateObject("NameTranslate")

    On Error Resume Next

    'Lo iniciamos localizando el catálogo global
    obj_TraductorDeNombres.Init ADS_NAME_INITTYPE_GC, ""

    'Establecemos el parámetro de nombre en el traductor de nombres
    obj_TraductorDeNombres.Set int_De, str_Nombre

    'Usamos el método Get del traductor de nombres para obtener el
    'nombre traducido
    f_NTaDN = obj_TraductorDeNombres.Get(int_A)

    On Error GoTo 0
    'Limpieza de kks :-)
    Set obj_TraductorDeNombres = Nothing

End Function 'f_NTaDN

4 comentarios to “Script VbScript Para Listar Los Usuarios Miembros De Un Grupo”

  1. Aldo said

    Sr :urpiano

    Tengo un gran problema que no lo puedo solucionar quiero resolver este grupo BUILTIN\Usuarios ,NT AUTHORITY\SYSTEM, BUILTIN\Administradores,y no consigo convertir a un nombre distinguido con tu funcion f_NTaDN(str_RutaNT, str_DN) para poder asi tener los miemnros que pertenecen a este grupo y use su script para poder sacar los miembros que pertenecen a un grupo y tambien me da error …..

    • urpiano said

      Aldo,

      No vas a poder obtener el nombre distinguido de esos usuarios, pues no son usuarios de active directory, si no principios de autoridad. Esa función está pensada para partir de, por ejemplo TIA\mortadelo y obtener CN=Mortadelo,OU=Agentes,DC=tia,DC=org

  2. no me regresa los datos de usuarios de dominios foraneos!!….por todo lo demas funciona de maravilla.

  3. César said

    Buenos días.

    He visto un problema que pasa en todos los script, que he visto, de extracción de miembros de grupos. Se da el caso que no se sacan todos los miembros del grupo. Los usuarios en los que este especificado como grupo primario, el grupo del que extraes, los miembros no sale en el listado de ese grupo.
    http://blogs.technet.com/b/plataformas/archive/2008/09/17/el-caso-del-grupo-de-domain-admins-incompleto.aspx

    Ejemplo:
    Grupo –> Domain Admins (Grupo que he usado para las pruebas)
    Usuarios (Miembros grupo “Domain Admins”):
    User1 –> Grupo primario: Domain Users
    User2 –> Grupo primario: Domain Users
    User3 –> Grupo primario: Domain Admins
    User4 –> Grupo primario: Domain Admins
    User5 –> Grupo primario: Domain Users

    Resultado del script: (Usuarios Miembros del grupo “Domain Admins”)
    User1
    User2
    User5

    Saludos.

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: