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 Las OUs De Un Dominio

Posted by urpiano en Jueves 28 \28\UTC febrero \28\UTC 2008

Este script lista las OUs que existen en el dominio que recibe como parámetro. El resultado lo muestra indentado con tabuladores, de forma que se vea en forma de árbol la estructura de OU. La primera columna es el nombre distinguido de la OU y su nombre aparece en la columna que corresponda según la indentación. Los resultados los muestra por pantalla o los vuelca a un fichero de valores separados por tabulador, ideal para ser abierto con Excel

Sintaxis

cscript [//nologo] listar-ous-en-dominio.vbs [/F:fichero] [/?] dominio

Siendo

Etiqueta Dato ¿Requerido? Descripción
  dominio
Nombre DNS del dominio a revisar
F fichero No
Ruta y nombre del fichero en el que se guardará el resulado como fichero de valores separados por comas. Si se omite, los resultados se muestran por pantalla
?   No
Muestra la ayuda en línea.

Ejemplos:

– Lista las OUs del dominio “tia.org”, mostrando el resultado por pantalla.:

cscript //nologo listar-ous-en-dominio.vbs "tia.org"

– Lista las OUs del dominio “tia.org”, guardando los resultados en el fichero d:listadosOUsTIA.tsv:

cscript //nologo listar-ous-en-dominio.vbs /F:d:listadosOUsTIA.tsv "tia.org"

Este es el código del script

'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'* listar-ous-en-dominio.vbs                                           *
'*                                                                     *
'* Este script lista las OUs que existen en el dominio que recibe como *
'* parámetro. El resultado lo muestra indentado con tabuladores, de    *
'* forma que se vea en forma de árbol la estructura de OU. La primera  *
'* columna es el nombre distinguido de la OU y su nombre aparece en la *
'* columna que corresponda según la indentación. Los resultados los    *
'* muestra por pantalla o los vuelca a un fichero de valores separados *
'* por tabulador, ideal para ser abierto con Excel                     *
'*                                                                     *
'* Sintaxis                                                            *
'*                                                                     *
'* cscript [//nologo] listar-ous-en-dominio.vbs [/F:fichero] [/?]      *
'* dominio                                                             *
'*                                                                     *
'* Siendo                                                              *
'*                                                                     *
'* - dominio (Requerido):                                              *
'*         Nombre DNS del dominio a revisar                            *
'*                                                                     *
'* - /F: fichero (Opcional):                                           *
'*         Ruta y nombre del fichero en el que se guardará el resulado *
'*         como fichero de valores separados por comas. Si se omite,   *
'*         los resultados se muestran por pantalla                     *
'*                                                                     *
'* - /?: ayuda (Opcional):                                             *
'*         Muestra la ayuda en línea                                   *
'*                                                                     *
'*                                                                     *
'* Ejemplos:                                                           *
'*                                                                     *
'* - Lista las OUs del dominio "tia.org", mostrando el resultado por   *
'* pantalla.:                                                          *
'*                                                                     *
'* cscript //nologo listar-ous-en-dominio.vbs "tia.org"                *
'*                                                                     *
'* - Lista las OUs del dominio "tia.org", guardando los resultados en  *
'* el fichero d:listadosOUsTIA.tsv:                                  *
'*                                                                     *
'* cscript //nologo listar-ous-en-dominio.vbs                          *
'* /F:d:listadosOUsTIA.tsv "tia.org"                                 *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'* © Fernando Reyes                                                    *
'* Febrero De 2008                                                     *
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*

'Exigimos la declaración de variables
Option Explicit


Dim str_Error 'As String
Dim int_Error 'As String
Dim str_Dominio 'As String
Dim str_Fichero 'As String
Dim str_Salida 'As String
Dim str_Linea 'As String
Dim obj_Dominio
Dim obj_OU

Dim obj_FS 'As Scripting.FileSystemObject
Dim obj_TS 'As Scripting.TextStream

'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

'Pasamos a formato LDAP el nombre DNS del dominio
str_Dominio = "dc=" & Replace(str_Dominio,".",",dc=",1,-1,1)

'Obtenemos el objeto con el dominio
Set obj_Dominio = GetObject("LDAP://" & str_Dominio)

'Filtramos el dominio para que nos de las OUs
obj_Dominio.Filter = Array("organizationalUnit") 

'Recorremos las OUs cuelgan de la raíz del dominio
For Each obj_OU In obj_Dominio

    'Montamos la línea a mostrar
    str_Linea = obj_OU.distinguishedName & vbTab & _
                Replace(obj_OU.Name,"ou=","",1,-1,1)
    
    'Si hay fichero de salida            
    If Len(str_Fichero) > 0 Then
    
        'Añadimos la línea a la salida
        str_Salida = str_Salida & str_linea & vbCrLf
        
    Else
    
        'Mostramos la línea por pantalla
        WScript.Echo str_Linea
        
    End If
    
    'Vaciamos la variable con la línea
    str_Linea = ""
    
    'Llamamos al método que lista las OUs de la OU cuyo
    'nombre distinguido recibe como parámetro, y ponemos que
    'está en el nivel 1
    Call s_ListaOUs(obj_OU.Name & "," & str_Dominio,1)
    
Next

'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_FS = CreateObject("Scripting.FileSystemObject")

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

    'Volcamos la información de salida en el fichero
    obj_TS.Write str_Salida

    'Cerramos el fichero de salida
    obj_TS.Close

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

End If

Sub s_ListaOUs(str_OU, int_Nivel)
'***********************************************************************
'* Procedimiento: s_ListaOUs                                           *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 28/02/2008 18:38:42                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Lista las OUs de contenidas en la OU cuyo nombre     *
'*                distinguido se recibe como parámetro. Tiene una      *
'*                llamada recursiva para poder desarrollar todo el     *
'*                árbol. recibe un segundo parámetro que se usa para   *
'*                poder intentar los resultados.                       *
'***********************************************************************

    Dim obj_OUPadre
    Dim obj_OU
    
    'Obtenemos el objeto OU cuyo nombre distinguido es recibido como
    'parámetro
    Set obj_OUPadre = GetObject("LDAP://" & str_OU)
    
    'Lo filtramos para que devuelva sus OUs
    obj_OUPadre.Filter = Array("organizationalUnit")
    
    'Recorremos las OUs
    For Each obj_OU In obj_OUPadre
    
        'Montamos la línea a mostrar
        str_Linea =  obj_OU.distinguishedName & _
                     String(int_Nivel,vbtab) & _
                     Replace(obj_OU.Name,"ou=","",1,-1,1)
    
        'Si hay fichero de salida            
        If Len(str_Fichero) > 0 Then
        
            'Añadimos la línea a la salida
            str_Salida = str_Salida & str_linea & vbCrLf
            
        Else
        
            'Mostramos la línea por pantalla
            WScript.Echo str_Linea
            
        End If
        
        'Vaciamos la variable con la línea
        str_Linea = ""
    
        'Realizamos una llamada recursiva incrementando en uno el
        'nivel
        Call s_ListaOUs(obj_OU.Name & "," & str_OU,int_Nivel + 1)
                    
    Next

End Sub 's_ListaOUs

Function f_RevisarArgumentos( _
                             str_Error, _
                             int_Error _
                             ) 'As Boolean
'***********************************************************************
'* Procedimiento: f_RevisarArgumentos                                  *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 28/02/2008 18:32:21                                  *
'* 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

    '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 si están todos los argumentos
    'sin nombre requeridos
    If WScript.Arguments.Unnamed.Count < 1 Then

        str_Error = "Error 1, falta/n argumento/s sin " & _
                    "nombre requerido/s"
        bol_Error1 = True

    Else

        'Guardamos los argumentos en las variables
        'correspondientes
        str_Dominio = WScript.Arguments.Unnamed(0)

    End If

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

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

    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 : 28/02/2008 18:32:21                                  *
'* 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 lista las OUs que existen en el domin" & _
                 "io que recibe como parámetro."
    WScript.Echo "El resultado lo muestra indentado con tabuladores" & _
                 ", de forma que se vea en forma"
    WScript.Echo "de árbol la estructura de OU. La primera columna " & _
                 "es el nombre distinguido de la"
    WScript.Echo "OU y su nombre aparece en la columna que correspo" & _
                 "nda según la indentación. Los"
    WScript.Echo "resultados los muestra por pantalla o los vuelca " & _
                 "a un fichero de valores"
    WScript.Echo "separados por tabulador, ideal para ser abierto c" & _
                 "on Excel"
    WScript.Echo ""
    WScript.Echo "Sintaxis"
    WScript.Echo ""
    WScript.Echo "cscript [//nologo] listar-ous-en-dominio.vbs [/F:" & _
                 "fichero] [/?] dominio"
    WScript.Echo ""
    WScript.Echo "Siendo"
    WScript.Echo ""
    WScript.Echo "- dominio (Requerido):"
    WScript.Echo "Nombre DNS del dominio a revisar"
    WScript.Echo ""
    WScript.Echo "- /F: fichero (Opcional):"
    WScript.Echo "Ruta y nombre del fichero en el que se guardará e" & _
                 "l resulado"
    WScript.Echo "como fichero de valores separados por comas. Si s" & _
                 "e omite, los"
    WScript.Echo "resultados se muestran por pantalla"
    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 "- Lista las OUs del dominio ""tia.org"", mostrand" & _
                 "o el resultado por pantalla.:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-ous-en-dominio.vbs ""tia." & _
                 "org"""
    WScript.Echo ""
    WScript.Echo "- Lista las OUs del dominio ""tia.org"", guardand" & _
                 "o los resultados en el fichero"
    WScript.Echo "d:listadosOUsTIA.tsv:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-ous-en-dominio.vbs /F:d:" & _
                 "listadosOUsTIA.tsv ""tia.org"""
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo ""

End Sub 's_Ayuda

 

 

6 comentarios to “Script VBScript Para Listar Las OUs De Un Dominio”

  1. el_karibou said

    Muchas gracias por todos estos scripts con los que nos “regalas”.

    Nos ayudan mucho a aprender cada día más y a facilitarnos nuestro trabajo diario en la mayoría de ocasiones.

    Un saludo

  2. urpiano said

    El_karibou,

    Muchas gracias por tu comentario. Me alegra el poder ser de ayuda a alguien.

  3. keimer said

    hola necesito ayuda para obtener informacion de los contactos en un a OU determinada, si pueden ayudarme de antemano muchas gracias

  4. urpiano said

    Kelmer,

    Con este script puedes obtener todos los contactos del dominio al que pertenece el equipo desde el que lo lanzas:

    Set objRootDSE = GetObject("LDAP://rootDSE") 
    str_Dominio = objRootDSE.Get("defaultNamingContext")
    Set objRootDSE = Nothing

    Set objConnection = CreateObject("ADODB.Connection")
    objConnection.Open "Provider=ADsDSOObject;"
     
    Set objCommand = CreateObject("ADODB.Command")
    objCommand.ActiveConnection = objConnection
     
    objCommand.CommandText = _
                "<LDAP://" & str_Dominio & ">;" & _
                "(&(objectCategory=contact)(objectClass=contact))" & _
                ";distinguishedName,displayName,mail;subtree"
                
    objCommand.Properties("Page Size") = 100
    objCommand.Properties("Timeout") = 30
    objCommand.Properties("Cache Results") = False

    WScript.Echo objCommand.CommandText

    Set objRecordSet = objCommand.Execute
     
    Do Until objRecordset.EOF

       WScript.Echo objRecordSet.Fields("distinguishedName").Value & vbTab & _
                    objRecordSet.Fields("DisplayName").Value & vbTab & _
                    objRecordSet.Fields("mail").Value
        objRecordSet.MoveNext
    Loop
     
    objConnection.Close

  5. Alexei said

    Hola, ante todo gracias por los script, me parecen excelentes, me gustaria saber como obtener la OU de un usuario, en particular del usuario que esta logueado en ese momento.

    Gracias de antemano.

    • urpiano said

      Alexei,

      Lo puedes saber con un script como este:

      Dim obj_NW
      Dim obj_Usuario

      Set obj_NW = CreateObject("WScript.Network")
      Set obj_Usuario = GetObject("LDAP://" & f_NTaDN(obj_NW.UserDomain & "\" & obj_NW.UserName,""))
      WScript.Echo obj_Usuario.Get("distinguishedName")
      WScript.Echo Right(obj_Usuario.Get("distinguishedName"),Len(obj_Usuario.Get("distinguishedName")) - (Len(obj_Usuario.Name)+1))

      Function f_NTaDN(str_RutaNT, str_DN)
      '***********************************************************************
      '* 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)

      'Limpieza de kks :-)
      Set obj_TraductorDeNombres = Nothing

      On Error GoTo 0

      End Function 'f_NTaDN

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: