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 Cambiar La Localización De Uno O Más Equipos En Active Directory

Posted by urpiano en Martes 10 \10\UTC junio \10\UTC 2008

Este script permite cambiar la propiedad localización de los equipos de Active Directory. Recibe una ruta más nombre de libro de Excel en el que tiene los datos del dominio al que pertenece el equipo, el nombre del equipo y la localización que se le debe establecer.

Permite cambiar la localización a equipos de distintos dominios, por lo que se debe tener en cuenta que para lanzar el script es necesario que el usuario tenga derechos suficientes para realizar estos cambios en todos los dominio en los que se haya de operar (digamos que debe ser administrador de empresa); es decir, el script debería ser lanzado desde una ventana de comandos que hubiera sido abierta con RunAs y la cuenta de un administrador de empresa. El script da la posibilidad de mostrar los resultados por pantalla o volcarlos a un fichero de valores separados por tabuladores.

Sintaxis

cscript [//nologo] localizacion-equipos.vbs /F:fichero [/E] [/L:fichero] [/?]

Siendo

Etiqueta Dato ¿Requerido? Descripción
F fichero
Libro Excel con la primera hoja en la que están los datos distribuidos, según columna, así:
A – Nombre NetBios al que pertenece el equipo.
B – Nombre NetBios del equipo.
C – Localización que se quiere establecer para ese equipo.
E encabezados No
Modificador que si se pasa, considera que la hoja con los datos tiene encabezados, y por tanto no procesará la primera línea; en caso de no pasarse se procesará esta primera línea.
L fichero No
Nombre de fichero de valores separados por tabuladores en el que se guardará el log del proceso.
?   No
Muestra la ayuda en línea.

Ejemplos:

– Cambia la localización de los equipos listados en el libro de Excel c:morialocalizacion-equipos.xls, empezando desde la línea 1 de la primera hoja:

cscript //nologo localizacion-equipos.vbs /F:c:morialocalizacion-equipos.xls

– Cambia la localización de los equipos listados en el libro de Excel c:morialocalizacion-equipos.xls, empezando desde la línea 2 de la primera hoja (pues la primera contiene encabezados) :

cscript //nologo localizacion-equipos.vbs /F:c:morialocalizacion-equipos.xls /E

– Cambia la localización de los equipos listados en el libro de Excel c:morialocalizacion-equipos.xls, empezando desde la línea 2 de la primera hoja (pues la primera contiene encabezados) . Los resultados del proceso se guardarán en el fichero de valores separado por tabuladores c:morialocalizacion-equipos.tsv:

cscript //nologo localizacion-equipos.vbs /F:c:morialocalizacion-equipos.xls /E /L:c:morialocalizacion-equipos.tsv

Este es el código del script

'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'* localizacion-equipos.vbs                                            *
'*                                                                     *
'* Este script permite cambiar la propiedad localización de los        *
'* equipos de Active Directory. Recibe una ruta más nombre de libro de *
'* Excel en el que tiene los datos del dominio al que pertenece el     *
'* equipo, el nombre del equipo y la localización que se le debe       *
'* establecer.                                                         *
'* Permite cambiar la localización a equipos de distintos dominios,    *
'* por lo que se debe tener en cuenta que para lanzar el script es     *
'* necesario que el usuario tenga derechos suficientes para realizar   *
'* estos cambios en todos los dominio en los que se haya de operar     *
'* (digamos que debe ser administrador de empresa); es decir, el       *
'* script debería ser lanzado desde una ventana de comandos que        *
'* hubiera sido abierta con RunAs y la cuenta de un administrador de   *
'* empresa. El script da la posibilidad de mostrar los resultados por  *
'* pantalla o volcarlos a un fichero de valores separados por          *
'* tabuladores.                                                        *
'*                                                                     *
'* Sintaxis                                                            *
'*                                                                     *
'* cscript [//nologo] localizacion-equipos.vbs /F:fichero [/E]         *
'* [/L:fichero] [/?]                                                   *
'*                                                                     *
'* Siendo                                                              *
'*                                                                     *
'* - /F: fichero (Requerido):                                          *
'*         Libro Excel con la primera hoja en la que están los datos   *
'*         distribuidos, según columna, así:                           *
'*                      A - Nombre NetBios al que pertenece el equipo. *
'*                      B - Nombre NetBios del equipo.                 *
'*                      C - Localización que se quiere establecer para *
'*                          ese equipo.                                *
'*                                                                     *
'* - /E: encabezados (Opcional):                                       *
'*         Modificador que si se pasa, considera que la hoja con los   *
'*         datos tiene encabezados, y por tanto no procesará la        *
'*         primera línea; en caso de no pasarse se procesará esta      *
'*         primera línea.                                              *
'*                                                                     *
'* - /L: fichero (Opcional):                                           *
'*         Nombre de fichero de valores separados por tabuladores en   *
'*         el que se guardará el log del proceso.                      *
'*                                                                     *
'*                                                                     *
'* Ejemplos:                                                           *
'*                                                                     *
'* - Cambia la localización de los equipos listados en el libro de     *
'* Excel c:morialocalizacion-equipos.xls, empezando desde la línea 1 *
'* de la primera hoja:                                                 *
'*                                                                     *
'* cscript //nologo localizacion-equipos.vbs                           *
'* /F:c:morialocalizacion-equipos.xls                                *
'*                                                                     *
'* - Cambia la localización de los equipos listados en el libro de     *
'* Excel c:morialocalizacion-equipos.xls, empezando desde la línea 2 *
'* de la primera hoja (pues la primera contiene encabezados) :         *
'*                                                                     *
'* cscript //nologo localizacion-equipos.vbs                           *
'* /F:c:morialocalizacion-equipos.xls /E                             *
'*                                                                     *
'* - Cambia la localización de los equipos listados en el libro de     *
'* Excel c:morialocalizacion-equipos.xls, empezando desde la línea 2 *
'* de la primera hoja (pues la primera contiene encabezados) . Los     *
'* resultados del proceso se guardarán en el fichero de valores        *
'* separado por tabuladores c:morialocalizacion-equipos.tsv:         *
'*                                                                     *
'* cscript //nologo localizacion-equipos.vbs                           *
'* /F:c:morialocalizacion-equipos.xls /E                             *
'* /L:c:morialocalizacion-equipos.tsv                                *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'* © Fernando Reyes                                                    *
'* Mayo De 2008                                                        *
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*

'Exigimos la declaración de variables
Option Explicit


Dim str_Error       'As String
Dim int_Error       'As Integer
Dim str_Libro       'As String
Dim bol_Encabezados 'As Boolean
Dim str_FicheroTSV  'As String
Dim str_Resultados  'As String
Dim str_Echo        'As String

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

bol_Encabezados = False


'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

'Ponemos los encabezados al log
str_Resultados = "Dominio" & vbTab & _
                 "Equipo" & vbTab & _
                 "Resultado" & vbTab & _
                 "Localización Anterior" & vbTab & _
                 "Nueva Localización"
                 
'Los mostramos por pantalla y subrayamos
WScript.Echo str_Resultados
WScript.Echo "=======" & vbTab & _
             "======" & vbTab & _
             "=========" & vbTab & _
             "=====================" & vbTab & _
             "=================="

'Añadimos un salto de línea a la salida a fichero
str_Resultados = str_Resultados & vbCrLf

Call s_ProcesaLibro

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

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

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

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

    'Cerramos el fichero de salida
    obj_TS.Close

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

End If

Sub s_ProcesaLibro()
'***********************************************************************
'* Procedimiento: s_ProcesaLibro                                       *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 03/10/2007 11:31:46                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este método recibe la ruta más nombre de un Libro    *
'*                de Excel con los datos de los equipos a cambiar la   *
'*                localización. Abre el libro, lo recorre y procesa    *
'*                cada equipo.                                         *
'***********************************************************************

    Dim app_Excel  'As Excel.Application
    Dim wb_Libro   'As Excel.Workbook
    Dim ws_Hoja    'As Excel.Worksheet
    Dim lng_Linea  'As Long
    Dim lng_Inicio 'As Long
    
    'Creamos un objeto aplicación Excel
    Set app_Excel = CreateObject("Excel.Application")
    
    'Abrimos el libro con los datos
    Set wb_Libro = app_Excel.Workbooks.Open(str_Libro)
    
    'Cargamos la primera hoja en la variable
    Set ws_Hoja = wb_Libro.Worksheets(1)
    
    'Empezaremos por la línea 1
    lng_Inicio = 1
    
    'Si hay encabezados lo haremos por la dos
    If bol_Encabezados Then lng_Inicio = 2
    
    'Recorremos las filas escritas
    For lng_Linea = lng_Inicio To ws_Hoja.UsedRange.Rows.Count
    
        'Llamamos al método que procesa cada equipo, pasando
        'el nombre de dominio, el nombre de equipo y la nueva
        'localización
        Call s_ProcesaEquipo(ws_Hoja.Range("A" & lng_Linea).Value, _
                             ws_Hoja.Range("B" & lng_Linea).Value, _
                             ws_Hoja.Range("C" & lng_Linea).Value)
            
    Next 'lng_Linea
    
    'Cerramos y vaciamos variables
    Set ws_Hoja = Nothing
    wb_Libro.Close
    Set wb_Libro = Nothing
    app_Excel.Quit
    Set app_Excel=Nothing
    
End Sub 's_ProcesaLibro

Sub s_ProcesaEquipo(str_Dominio, str_Equipo, str_Localizacion)
'***********************************************************************
'* Procedimiento: s_ProcesaEquipo                                      *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 03/10/2007 18:48:18                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este método recibe un nombre NetBios de dominio, un  *
'*                nombre NettBios de equipo y una cadena con la        *
'*                localización que el método establecerá para la       *
'*                cuenta del equipo en el dominio.                     *
'***********************************************************************

    Dim obj_Equipo                 'As IADsComputer
    Dim str_AnteriorLocalizacion   'As String

    'Ponemos en la salida por pantalla el nombre de dominio y de equipo
    str_Echo = str_Dominio & vbTab & str_Equipo & vbTab
    
    If f_EquipoResponde(str_Equipo) Then
        
        'Establecemos control de errores
        On Error Resume Next
        'Obtenemos el objeto IADsComputer con el proveeror LDAP,
        'para lo cual traducimos su nombre NetBios en el nombre 
        'LDAP; además, tenemos que añadir $ al final del nombre
        'del equipo, pues así son los nombres NT de los equipos
        'en Active Directory
        Set obj_Equipo = GetObject("LDAP://" & _
                                   f_NTaDN(str_Dominio & "" & _
                                           str_Equipo & "$",""))
    
        If Err.Number = 0 Then
            
            'Todo a ido bien; guardamos la localización actual del
            'equipo
            str_AnteriorLocalizacion = obj_Equipo.Location
            
            'Establecemos la nueva localización
            obj_Equipo.Location = str_Localizacion
            
            'Guardamos la nueva localización
            obj_Equipo.SetInfo
            
            If Err.Number = 0 Then
        
                'Todo ha ido bien, guardamos los resultados para
                'mostrar por pantalla
                str_Echo = str_Echo & _
                           "Fue procesado con éxito" & vbTab & _
                           str_AnteriorLocalizacion & vbTab & _
                           str_Localizacion
                                 
            Else
            
                'Falló el cambio de localización, lo reflejamos en
                'los resultados
                str_Echo = str_Echo & _
                           "Falló al cambiar la localización" & _
                           ": Error " & Err.Number & ", " & _
                           Err.Description
                          
            End If
            
        Else
        
            'Hubo un fallo al intentar optener el obeto IADsComputer
            'del equipo, mostramos el fallo en los resultados
            str_Echo = str_Echo & _
                       "Falló al tratar de obtener acceso a " & _
                       "la cuenta: Error " & Err.Number & _
                       ", " & Err.Description
                        
        End If
        
        'Devolvemos el control de los errores a CScript
        On Error Goto 0
            
    Else

        'El equipo no respondía al Ping, lo mostramos en los
        'resultados
        str_Echo = str_Echo & "No se procesó, no responde al PING"    
    
    End If
    
    'Añadimos los resultados de este equipo a la salida por fichero
    str_Resultados = str_Resultados & str_Echo & vbCrLf
    
    'Mostramos por pantalla los resultados de este equipo
    WScript.Echo str_Echo

End Sub 's_ProcesaEquipo


Function f_RevisarArgumentos( _
                             str_Error, _
                             int_Error _
                             ) 'As Boolean
'***********************************************************************
'* Procedimiento: f_RevisarArgumentos                                  *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 03/10/2007 11:23:55                                  *
'* 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 cinco 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), 8 en el caso de que el fichero entrado    *
'*                como parámetro /F no exista y 16 en el caso de que   *
'*                no exista la ruta especificada para el fichero de    *
'*                valores separados por tabuladores. En el caso de     *
'*                producirse más de un tipode error, el número de      *
'*                error será la suma de de los errores recibidos, es   *
'*                decir 3, 5, 6, etc.                                  *
'***********************************************************************

    Dim bol_Devolucion 'As Boolean
    Dim bol_Error1     'As Boolean
    Dim bol_Error2     'As Boolean
    Dim bol_Error4     'As Boolean
    Dim bol_Error8     'As Boolean
    Dim bol_Error16    'As Boolean
    Dim obj_FS         'As FileSystemObject

    'Iniciamos los indicadores
    bol_Devolucion = False
    bol_Error1 = False
    bol_Error2 = False
    bol_Error4 = False
    bol_Error8 = False
    bol_Error16 = 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 requerido 
    '/F (fichero)
    If WScript.Arguments.Named.Exists("F") Then
               
        Set obj_FS = _
               CreateObject("Scripting.FileSystemObject")
        WScript.Echo "¿Existe?: " & obj_FS.FileExists(str_Libro)
        If Not obj_FS.FileExists( _
                            WScript.Arguments.Named("F")) Then
        
            str_Error = str_Error & vbCrLf & _
                        "Error 8, el libro de Excel " & _
                        "recibido como argumento /F " & _
                        "no existe en la ruta especi" & _
                        "ficada." & vbCrLf
            bol_Error8 = True
            
        Else
        
            str_Libro =  _
                   WScript.Arguments.Named("F")        
        
        End If
        
        Set obj_FS = Nothing

    Else

        str_Error = str_Error & vbcrlf & _
                    "Error 2, falta argumento " & _
                    "requerido con nombre: " & _
                    "/F (fichero)" & vbCrLf
        bol_Error2 = True

    End If

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

        bol_Encabezados = True
        
    Else
    
        bol_Encabezados = False

    End If

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

        Set obj_FS = _
               CreateObject("Scripting.FileSystemObject")
                 
        If Not obj_FS.FolderExists( _
                    obj_FS.GetParentFolderName( _
                      WScript.Arguments.Named("L"))) Then
                      
            str_Error = str_Error & vbCrLf & _
                        "Error 16, la carpeta donde se" & _
                        " ubica el fichero de valores " & _
                        "separados por tabuladores de " & _
                        "salida no existe."
                        
            bol_Error16 = True

        Else
        
            str_FicheroTSV =  _
                   WScript.Arguments.Named("L")
                   
        End If
        
        Set obj_FS = Nothing

    End If

    'Preparamos las variables de devolucion:
    'el entero como suma de los posibles errores 1, 2, 4, 8 y 16
    int_Error = Abs(bol_Error1) + _
                (2 * Abs(bol_Error2)) + _
                (4 * Abs(bol_Error4)) + _
                (8 * Abs(bol_Error8)) + _
                (16 * Abs(bol_Error16)) 
    '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 Or _
                      bol_Error8 Or _
                      bol_Error16)

    '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 : 03/10/2007 11:23:55                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este procedimiento muestra la ayuda en línea.        *
'*                Recibe un parámetro de tipo cadena que si no 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 cambiar la propiedad localiza" & _
                 "ción de los equipos de Active"
    WScript.Echo "Directory. Recibe una ruta más nombre de libro de" & _
                 " Excel en el que tiene los"
    WScript.Echo "datos del dominio al que pertenece el equipo, el " & _
                 "nombre del equipo y la"
    WScript.Echo "localización que se le debe establecer."
    WScript.Echo "Permite cambiar la localización a equipos de dist" & _
                 "intos dominios, por lo que se"
    WScript.Echo "debe tener en cuenta que para lanzar el script es" & _
                 " necesario que el usuario"
    WScript.Echo "tenga derechos suficientes para realizar estos ca" & _
                 "mbios en todos los dominio en"
    WScript.Echo "los que se haya de operar (digamos que debe ser a" & _
                 "dministrador de empresa); es"
    WScript.Echo "decir, el script debería ser lanzado desde una ve" & _
                 "ntana de comandos que hubiera"
    WScript.Echo "sido abierta con RunAs y la cuenta de un administ" & _
                 "rador de empresa. El script da"
    WScript.Echo "la posibilidad de mostrar los resultados por pant" & _
                 "alla o volcarlos a un fichero"
    WScript.Echo "de valores separados por tabuladores."
    WScript.Echo ""
    WScript.Echo "Sintaxis"
    WScript.Echo ""
    WScript.Echo "cscript [//nologo] localizacion-equipos.vbs /F:fi" & _
                 "chero [/E] [/L:fichero] [/?]"
    WScript.Echo ""
    WScript.Echo "Siendo"
    WScript.Echo ""
    WScript.Echo "- /F: fichero (Requerido):"
    WScript.Echo "Libro Excel con la primera hoja en la que están l" & _
                 "os datos"
    WScript.Echo "distribuidos, según columna, así:"
    WScript.Echo "                    A - Nombre NetBios al que per" & _
                 "tenece el"
    WScript.Echo "                        equipo."
    WScript.Echo "                    B - Nombre NetBios del equipo."
    WScript.Echo "                    C - Localización que se quiere" & _
                 " establecer"
    WScript.Echo "                        para ese equipo."
    WScript.Echo ""
    WScript.Echo "- /E: encabezados (Opcional):"
    WScript.Echo "Modificador que si se pasa, considera que la hoja" & _
                 " con los datos"
    WScript.Echo "tiene encabezados, y por tanto no procesará la pr" & _
                 "imera línea;"
    WScript.Echo "en caso de no pasarse se procesará esta primera l" & _
                 "ínea."
    WScript.Echo ""
    WScript.Echo "- /L: fichero (Opcional):"
    WScript.Echo "Nombre de fichero de valores separados por tabula" & _
                 "dores en el"
    WScript.Echo "que se guardará el log del proceso."
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo "Ejemplos:"
    WScript.Echo ""
    WScript.Echo "- Cambia la localización de los equipos listados " & _
                 "en el libro de Excel"
    WScript.Echo "c:morialocalizacion-equipos.xls, empezando desd" & _
                 "e la línea 1 de la primera"
    WScript.Echo "hoja:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo localizacion-equipos.vbs /F:c:m" & _
                 "orialocalizacion-equipos.xls"
    WScript.Echo ""
    WScript.Echo "- Cambia la localización de los equipos listados " & _
                 "en el libro de Excel"
    WScript.Echo "c:morialocalizacion-equipos.xls, empezando desd" & _
                 "e la línea 2 de la primera"
    WScript.Echo "hoja (pues la primera contiene encabezados) :"
    WScript.Echo ""
    WScript.Echo "cscript //nologo localizacion-equipos.vbs /F:c:m" & _
                 "orialocalizacion-equipos.xls"
    WScript.Echo "/E"
    WScript.Echo ""
    WScript.Echo "- Cambia la localización de los equipos listados " & _
                 "en el libro de Excel"
    WScript.Echo "c:morialocalizacion-equipos.xls, empezando desd" & _
                 "e la línea 2 de la primera"
    WScript.Echo "hoja (pues la primera contiene encabezados) . Los" & _
                 " resultados del proceso se"
    WScript.Echo "guardarán en el fichero de valores separado por t" & _
                 "abuladores"
    WScript.Echo "c:morialocalizacion-equipos.tsv:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo localizacion-equipos.vbs /F:c:m" & _
                 "orialocalizacion-equipos.xls"
    WScript.Echo "/E /L:c:morialocalizacion-equipos.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


Function f_EquipoResponde(str_Equipo) 'As Boolean
'***********************************************************************
'* Procedimiento: f_EquipoResponde                                     *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : May 2007                                             *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe un nombre de equipo (ya sea      *
'*                nombre en sí o IP) y, por medio de PING, revisa si   *
'*                el equipo responde o no                              *
'***********************************************************************

    'Objeto shell para ejecutar ping y
    'enviar la salida a un fichero temporal
    Dim obj_Shell 'As Object
    'Objeto FileSystem para abrir y borrar
    'el fichero temporal
    Dim obj_FileSystem 'As Object
    'Objeto TextStream para leer el fichero
    'temporal
    Dim obj_Fichero 'As Object
    'Se volcará en esta variable el
    'contenido del fichero temporal
    Dim str_ContenidoFichero 'As String
    'Sirve para establecer la ruta y
    'nombre del fichero temporal
    Dim str_FicheroTemporal 'As String

    'Creamos los objetos FileSystem y Shell
    Set obj_Shell = CreateObject("WScript.Shell")
    Set obj_FileSystem = CreateObject("Scripting.FileSystemObject")

    'Establecemos el fichero temporal en la ruta
    'de este libro de Excel y con el nombre
    '"temp.txt"
    str_FicheroTemporal = _
             obj_Shell.ExpandEnvironmentStrings( _
                                 "%TEMP%temp.txt")

    'Ejecutamos el ping volcando la salida en el
    'fichero temporal. Sólo esperaremos un eco ("-n 1")
    obj_Shell.Run "cmd /c ping -n 1 " & str_Equipo & " > """ & _
                  str_FicheroTemporal & """", 0, True

    'Abrimos el fichero temporal sobre el objeto fichero
    Set obj_Fichero = obj_FileSystem.OpenTextFile( _
                              str_FicheroTemporal, 1, False)

    'Volcamos el contenido del fichero temporal
    'en str_ContenidoFichero
    str_ContenidoFichero = obj_Fichero.ReadAll

    'Cerramos el fichero temporal y vaciamos su variable
    obj_Fichero.Close
    Set obj_Fichero = Nothing

    'Borramos el fichero temporal y vaciamos
    'los objetos Shell y FileSystem
    obj_FileSystem.DeleteFile (str_FicheroTemporal)
    Set obj_FileSystem = Nothing
    Set obj_Shell = Nothing

    'Si encontramos la cadena "TTL=" significa
    'que el equipo respondió y por tanto la función
    'devuelve True, en caso contrario significa que
    'no respondió el equipo y por tanto devuelve
    'False
    If InStr(str_ContenidoFichero, "TTL=") > 0 Then
        f_EquipoResponde = True
    Else
        f_EquipoResponde = False
    End If

End Function 'f_EquipoResponde


Function f_IIf(bol_Expresion, _
               var_Verdadero, _
               var_Falso)
'***********************************************************************
'* Procedimiento: f_IIf                                                *
'* Tipo         : Función                                              *
'* Devolución   : Variant                                              *
'* Fecha y Hora : Julio de 2007                                        *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función emula la función Iif de VBA.Recibe una  *
'*                booleana, que será el resultado de una expresión     *
'*                que se ponga como parámetro al llamar la función,    *
'*                tal y como se hace en la función IIf de VBA, y       *
'*                devolverá lo que se pase como parámetro              *
'*                var_Verdadero, si la booleana es verdadera o lo que  *
'*                se pase como parámetro var_Falso si la booleana es   *
'*                falsa.                                               *
'***********************************************************************

    if bol_Expresion Then

        f_IIF = var_Verdadero

    Else

        f_IIf = var_Falso

    End If

End Function 'f_IIf

Sub s_Cmd(str_Comando)
'***********************************************************************
'* Procedimiento: s_Cmd                                                *
'* Tipo         : Método                                               *
'* Devolución   :                                                      *
'* Fecha y Hora : May 2007                                             *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este método lanza el comando recibido como           *
'*                parámetro como si desde una ventana de comandos      *
'*                fuese lanzado                                        *
'***********************************************************************

    Dim str_Shell  'Alberga la cadena que permite lanzar
                   'la ventana de comandos predeterminada
                   '(COMSPEC)

'    Dim obj_Shell  'Contiene un objeto Shell

    'Creamos un objeto Shell
    Set obj_Shell = CreateObject("Wscript.Shell")

    'Obtenemos la cadena que lanza la ventana de comandos
    'predeterminada
    str_Shell = obj_Shell.Environment("Process").Item("COMSPEC")

    'Lanzamos el comando por medio de una llamada al método Run
    'del objeto Shell
    obj_Shell.Run str_Shell & " /c """ & str_Comando & """", 0, True

    'Limpiadita de popa :-)
    Set obj_Shell = Nothing

End Sub 's_Cmd

 

 

2 comentarios to “Script VBScript Para Cambiar La Localización De Uno O Más Equipos En Active Directory”

  1. Jose Ramon Pernia Reyes said

    Buenas este Script funcionara para cambiar usuarios pregunto

  2. urpiano said

    Jose Ramon Pernia Reyes,

    No, este script hace lo que dice hacer, cambiar la localización de los equipos (su atributo Location en Active Directory)

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: