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 Servidores De Cada Sitio De Un Dominio De Active Directory

Posted by urpiano en Jueves 5 \05\UTC junio \05\UTC 2008

Este script permite listar los sitios de Active Directory y los servidores que están en cada sitio.

Sintaxis

cscript [//nologo] listar-srvs-en-sitios.vbs [/F:fichero] [/?]

Siendo

Etiqueta Dato ¿Requerido? Descripción
F fichero No
Ruta y nombre del fichero de valores separados por comas (ideal para abrir con Excel) en el que se volcarán los resultados; si o se pasa este parámetro los resultados son mostrados por pantalla
?   No
Muestra la ayuda en línea.

Ejemplos:

– Lista los sitios y servidores de cada sitio del dominio desde el que se lanza el script; los resultados se muestran por pantalla:

cscript //nologo listar-srvs-en-sitios.vbs

– Lista los sitios y servidores de cada sitio del dominio desde el que se lanza el script; los resultados se guardan en el fichero \listadosadsitios-y-dcs.tsv:

cscript //nologo listar-srvs-en-sitios.vbs /F:\listadosadsitios-y-dcs.tsv

Este es el código del script

'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'* listar-srvs-en-sitios.vbs                                           *
'*                                                                     *
'* Este script permite listar los sitios de Active Directory y los     *
'* servidores que están en cada sitio.                                 *
'*                                                                     *
'* Sintaxis                                                            *
'*                                                                     *
'* cscript [//nologo] listar-srvs-en-sitios.vbs [/F:fichero] [/?]      *
'*                                                                     *
'* Siendo                                                              *
'*                                                                     *
'* - /F: fichero (Opcional):                                           *
'*         Ruta y nombre del fichero de valores separados por comas    *
'*         (ideal para abrir con Excel) en el que se volcarán los      *
'*         resultados; si o se pasa este parámetro los resultados son  *
'*         mostrados por pantalla                                      *
'*                                                                     *
'* - /?: ayuda (Opcional):                                             *
'*         Muestra la ayuda en línea                                   *
'*                                                                     *
'*                                                                     *
'* Ejemplos:                                                           *
'*                                                                     *
'* - Lista los sitios y servidores de cada sitio del dominio desde el  *
'* que se lanza el script; los resultados se muestran por pantalla:    *
'*                                                                     *
'* cscript //nologo listar-srvs-en-sitios.vbs                          *
'*                                                                     *
'* - Lista los sitios y servidores de cada sitio del dominio desde el  *
'* que se lanza el script; los resultados se guardan en el fichero     *
'* \listadosadsitios-y-dcs.tsv:                                     *
'*                                                                     *
'* cscript //nologo listar-srvs-en-sitios.vbs                          *
'* /F:\listadosadsitios-y-dcs.tsv                                   *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'* © Fernando Reyes                                                    *
'* Junio 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_DominioNT 'As String
Dim str_Fichero 'As String
Dim str_Salida 'As String

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

Dim obj_Dominio 'As Object
Dim str_ConfiguracionNC 'As String
Dim str_ContenedorSitios 'As String
Dim col_Sitios 'As Object
Dim str_Sitio 'As String
Dim obj_Sitio 'As Object
Dim str_ContenedorSRVs 'As String
Dim col_SVRs 'As Object
Dim obj_SVR 'As Object

'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

'Preparamos los encabezados de salida 
str_Salida = "Sitio" & vbTab & _
             "NombreDC" & vbTab & _
             "RutaDN" & vbTab & _
             "RutaNC" & vbTab & _
             "FQDN"

'Si no hay que volcar los resultados en un fichero...
If Len(str_Fichero) = 0 Then

    'Mostramos los encabezados
    WScript.Echo str_Salida
    
    'Subrayamos
    WScript.Echo "=====" & vbTab & _
                 "========" & vbTab & _
                 "======" & vbTab & _
                 "======" & vbTab & _
                 "===="
    
    'Vaciamos la variable de salida
    str_Salida = ""
    
Else
    
    'Como hay que volcar los resultados a un fichero,
    'necesitamos un salto de línea después de los
    'encabezados
    str_Salida = str_Salida & vbCrLf

End If

'Cargamos el objeto iADS del dominio
Set obj_Dominio = GetObject(str_Dominio)

'Obtenemos la ruta de configuración
str_ConfiguracionNC = obj_Dominio.Get("configurationNamingContext")
 
'Obtenemos la ruta LDAP del contenedor de sitios
str_ContenedorSitios = "LDAP://cn=Sites," & str_ConfiguracionNC

'Cargamos el objeto iADS del contenedor de sitios
Set col_Sitios = GetObject(str_ContenedorSitios)

'Filtramos por sitios
col_Sitios.Filter = Array("site")

'Recorremos la colección de sitios
For Each obj_Sitio In col_Sitios    
    
    'Obtenemos el nombre del sitio
    str_Sitio = obj_Sitio.Name
      
    'Obtenemos la ruta LDAP del contenedor de servidores
    'del sitio
    str_ContenedorSRVs = "LDAP://cn=Servers," & str_Sitio & _
                                            ",cn=Sites," & _
                                        str_ConfiguracionNC
        
    'Cargamos el objeto con el contenedor de servidores
    Set col_SVRs = GetObject(str_ContenedorSRVs)
     
    'Recorremos los servidores
    For Each obj_SVR In col_SVRs
    
        'Montamos en la salida el nombre del sitio y del
        'servidor
        str_Salida = str_Salida & _
                     Replace(obj_Sitio.Name & _
                            vbTab & obj_SVR.Name,"CN=","") & _
                     vbTab & _
                     f_NTaDN(str_DominioNT & "" & Replace(obj_SVR.Name,"CN=","") & "$","") & _
                     vbTab & obj_SVR.Get("distinguishedName") & vbTab & obj_SVR.Get("DNSHostName")

        'Si se vuelca la información en un fichero...             
        If Len(str_Fichero) > 0 Then
        
            'Necesitamos un salto de línea para preparar la
            'salida del siguiente servidor
            str_Salida = str_Salida & vbCrLf
            
        Else
        
            'Como no se vuelca a fichero, mostramos la salida
            'y la vaciamos
            WScript.Echo str_Salida
            str_Salida = ""
        
        End If          
    
    Next 'obj_SVR
    
Next 'obj_Sitio

'Ahora nos limpiamos la zurraspas :-)
Set obj_SVR = Nothing
Set col_SVRs = Nothing
Set obj_Sitio = Nothing
Set col_Sitios = Nothing
Set obj_Dominio = Nothing

'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

Function f_RevisarArgumentos( _
                             str_Error, _
                             int_Error _
                             ) 'As Boolean
'***********************************************************************
'* Procedimiento: f_RevisarArgumentos                                  *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 05/06/2008 20:49:38                                  *
'* 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_NW 'As WScript.Network

    '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

    'Establecemos la raíz DSE como ruta del dominio
    str_Dominio = "LDAP://RootDSE"
    
    'Creaos un objeto Network y con él obtenemos el
    'nombre NetBios del dominio; después destruímos el
    'objeto Network
    Set obj_NW = CreateObject("WScript.Network")
    str_DominioNT = obj_NW.UserDomain
    Set obj_NW = Nothing
    
    '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 : 05/06/2008 22:03:37                                  *
'* 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 permite listar los sitios de Active D" & _
                 "irectory y los servidores que"
    WScript.Echo "están en cada sitio."
    WScript.Echo ""
    WScript.Echo "Sintaxis"
    WScript.Echo ""
    WScript.Echo "cscript [//nologo] listar-srvs-en-sitios.vbs [/F:" & _
                 "fichero] [/?]"
    WScript.Echo ""
    WScript.Echo "Siendo"
    WScript.Echo ""
    WScript.Echo "- /F: fichero (Opcional):"
    WScript.Echo "Ruta y nombre del fichero de valores separados po" & _
                 "r comas (ideal"
    WScript.Echo "para abrir con Excel) en el que se volcarán los r" & _
                 "esultados; si"
    WScript.Echo "o se pasa este parámetro los resultados son mostr" & _
                 "ados por"
    WScript.Echo "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 los sitios y servidores de cada sitio del" & _
                 " dominio desde el que se lanza"
    WScript.Echo "el script; los resultados se muestran por pantalla:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-srvs-en-sitios.vbs"
    WScript.Echo ""
    WScript.Echo "- Lista los sitios y servidores de cada sitio del" & _
                 " dominio desde el que se lanza"
    WScript.Echo "el script; los resultados se guardan en el fichero"
    WScript.Echo "\listadosadsitios-y-dcs.tsv:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo listar-srvs-en-sitios.vbs /F:\l" & _
                 "istadosadsitios-y-dcs.tsv"
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo ""

End Sub 's_Ayuda

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              *
'*                ("dominionombre"), 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: