Script VBScript Para Listar Los Servidores De Cada Sitio De Un Dominio De Active Directory
Publicado por urpiano en Jueves 5 de Junio de 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