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 Copiar Una Carpeta En Uno O Más Equipos

Posted by urpiano en Martes 15 \15\UTC abril \15\UTC 2008

Este script permite copiar en uno o más equipos, de forma remota, una carpeta. La copia se realiza de toda la carpeta y sus subcarpetas, con todose sus ficheros. Debe ser lanzado por un usuario que tenga permiso de lectura en la carpeta a copiar y que sea administrador en el de destino, pues usa los recursos compartidos administrativos para realizar la copia (c$, d$, etc.).

Sintaxis

cscript [//nologo] copiar-carpeta.vbs /O:carpeta_origen /C:copiar_en [/L:equipos] [/D:dominio] [/E:equipos_excluídos] [/S] [/?]

Siendo

Etiqueta Dato ¿Requerido? Descripción
O carpeta_origen
Carpeta origen a copiar.
C copiar_en
Carpeta donde se copiará la carpeta. Se trata de la ruta local en el equipo de destino.
L equipos No
Lista de equipos separados por comas. Forma un combo de argumentos con el argumento /D: en caso de omitirse, y si se omite también el argumento /D, se realizará la copia a todos los equipos a los que se vea con el comando NetView, excepto aquellos que estén en el argumento /E (lista de equipos excluídos). Si están presentes tanto /L como /D, se procesará el argumento /D, siendo ignorado el /L. Si alguno de los equipos está en /E, no se procesará.
D dominio No
Nombre DNS del dominio del cual se realizará la copia a sus equipos. Forma un combo de argumentos con el argumento /D: en caso de omitirse, y si se omite también el argumento /D, se realizará la copia a todos los equipos a los que se vea con el comando NetView, excepto aquellos que estén en el argumento /E (lista de equipos excluídos). Si están presentes tanto /L como /D, se procesará el argumento /D, siendo ignorado el /L. Si alguno de los equipos está en /E, no se procesará.
E equipos_excluídos No
Lista de equipos separados por comas que no serán procesados.
S sobreescribir No
Si se pone este modificador, se reescribirá la carpeta y sus contenidos en caso de ya existir.
?   No
Muestra la ayuda en línea.

Ejemplos:

– Copia la carpeta \cirith-ungolcompartida1carpeta-raizcarpeta en la carpeta c:carpeta-raíz, en los equipos balrog,troll1,reybrujo:

cscript //nologo copiar-carpeta.vbs /O:\cirith-ungolcompartida1carpeta-raizcarpeta /C:c:carpeta-raíz /L:balrog,troll1,reybrujo

– Copia la carpeta \cirith-ungolcompartida1carpeta-raizcarpeta en la carpeta c:carpeta-raíz, en los equipos balrog,troll1,reybrujo, sobreescribiendo la carpeta destino si ya existía:

cscript //nologo copiar-carpeta.vbs /O:\cirith-ungolcompartida1carpeta-raizcarpeta /C:c:carpeta-raíz /L:balrog,troll1,reybrujo

– Copia la carpeta \cirith-ungolcompartida1carpeta-raizcarpeta en la carpeta c:carpeta-raíz, en los equipos del dominio mordor.gov, excluyendo los equipos saruman,ella,gollum:

cscript //nologo copiar-carpeta.vbs /O:\cirith-ungolcompartida1carpeta-raizcarpeta /C:c:carpeta-raíz /D:mordor.gov /E:saruman,ella,gollum

– Copia la carpeta \cirith-ungolcompartida1carpeta-raizcarpeta en la carpeta c:carpeta-raíz, en los equipos que se obtienen al ejecutar NETVIEW, excluyendo los equipos saruman,ella,gollum; se sobreescribirá la carpeta en el caso de existir previamente:

cscript //nologo copiar-carpeta.vbs /O:\cirith-ungolcompartida1carpeta-raizcarpeta /C:c:carpeta-raíz /E:saruman,ella,gollum

Este es el código del script

'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'* copiar-carpeta.vbs                                                  *
'*                                                                     *
'* Este script permite copiar en uno o más equipos, de forma remota,   *
'* una carpeta. La copia se realiza de toda la carpeta y sus           *
'* subcarpetas, con todose sus ficheros. Debe ser lanzado por un       *
'* usuario que tenga permiso de lectura en la carpeta a copiar y que   *
'* sea administrador en el de destino, pues usa los recursos           *
'* compartidos administrativos para realizar la copia (c$, d$, etc.).  *
'*                                                                     *
'* Sintaxis                                                            *
'*                                                                     *
'* cscript [//nologo] copiar-carpeta.vbs /O:carpeta_origen             *
'* /C:copiar_en [/L:equipos] [/D:dominio] [/E:equipos_excluídos] [/S]  *
'* [/?]                                                                *
'*                                                                     *
'* Siendo                                                              *
'*                                                                     *
'* - /O: carpeta_origen (Requerido):                                   *
'*         Carpeta origen a copiar.                                    *
'*                                                                     *
'* - /C: copiar_en (Requerido):                                        *
'*         Carpeta donde se copiará la carpeta. Se trata de la ruta    *
'*         local en el equipo de destino.                              *
'*                                                                     *
'* - /L: equipos (Opcional):                                           *
'*         Lista de equipos separados por comas. Forma un combo de     *
'*         argumentos con el argumento /D: en caso de omitirse, y si   *
'*         se omite también el argumento /D, se realizará la copia a   *
'*         todos los equipos a los que se vea con el comando NetView,  *
'*         excepto aquellos que estén en el argumento /E (lista de     *
'*         equipos excluídos). Si están presentes tanto /L como /D, se *
'*         procesará el argumento /D, siendo ignorado el /L. Si alguno *
'*         de los equipos está en /E, no se procesará.                 *
'*                                                                     *
'* - /D: dominio (Opcional):                                           *
'*         Nombre DNS del dominio del cual se realizará la copia a sus *
'*         equipos. Forma un combo de argumentos con el argumento /D:  *
'*         en caso de omitirse, y si se omite también el argumento /D, *
'*         se realizará la copia a todos los equipos a los que se vea  *
'*         con el comando NetView, excepto aquellos que estén en el    *
'*         argumento /E (lista de equipos excluídos). Si están         *
'*         presentes tanto /L como /D, se procesará el argumento /D,   *
'*         siendo ignorado el /L. Si alguno de los equipos está en /E, *
'*         no se procesará.                                            *
'*                                                                     *
'* - /E: equipos_excluídos (Opcional):                                 *
'*         Lista de equipos separados por comas que no serán           *
'*         procesados.                                                 *
'*                                                                     *
'* - /S: sobreescribir (Opcional):                                     *
'*         Si se pone este modificador, se reescribirá la carpeta y    *
'*         sus contenidos en caso de ya existir.                       *
'*                                                                     *
'*                                                                     *
'* Ejemplos:                                                           *
'*                                                                     *
'* - Copia la carpeta \cirith-ungolcompartida1carpeta-raizcarpeta  *
'* en la carpeta c:carpeta-raíz, en los equipos                       *
'* balrog,troll1,reybrujo:                                             *
'*                                                                     *
'* cscript //nologo copiar-carpeta.vbs                                 *
'* /O:\cirith-ungolcompartida1carpeta-raizcarpeta                  *
'* /C:c:carpeta-raíz /L:balrog,troll1,reybrujo                        *
'*                                                                     *
'* - Copia la carpeta \cirith-ungolcompartida1carpeta-raizcarpeta  *
'* en la carpeta c:carpeta-raíz, en los equipos                       *
'* balrog,troll1,reybrujo, sobreescribiendo la carpeta destino si ya   *
'* existía:                                                            *
'*                                                                     *
'* cscript //nologo copiar-carpeta.vbs                                 *
'* /O:\cirith-ungolcompartida1carpeta-raizcarpeta                  *
'* /C:c:carpeta-raíz /L:balrog,troll1,reybrujo                        *
'*                                                                     *
'* - Copia la carpeta \cirith-ungolcompartida1carpeta-raizcarpeta  *
'* en la carpeta c:carpeta-raíz, en los equipos del dominio           *
'* mordor.gov, excluyendo los equipos saruman,ella,gollum:             *
'*                                                                     *
'* cscript //nologo copiar-carpeta.vbs                                 *
'* /O:\cirith-ungolcompartida1carpeta-raizcarpeta                  *
'* /C:c:carpeta-raíz /D:mordor.gov /E:saruman,ella,gollum             *
'*                                                                     *
'* - Copia la carpeta \cirith-ungolcompartida1carpeta-raizcarpeta  *
'* en la carpeta c:carpeta-raíz, en los equipos que se obtienen al    *
'* ejecutar NETVIEW, excluyendo los equipos saruman,ella,gollum; se    *
'* sobreescribirá la carpeta en el caso de existir previamente:        *
'*                                                                     *
'* cscript //nologo copiar-carpeta.vbs                                 *
'* /O:\cirith-ungolcompartida1carpeta-raizcarpeta                  *
'* /C:c:carpeta-raíz /E:saruman,ella,gollum                           *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'*                                                                     *
'* © Fernando Reyes                                                    *
'* Abril De 2008                                                   *
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*

'Exigimos la declaración de variables
Option Explicit

'Declaración de variables
Dim str_Error          'As String
Dim int_Error          'As String
Dim str_Origen         'As String
Dim str_Destino        'As String
Dim arr_Equipos        'As String
Dim arr_Excluidos      'As String
Dim bol_Sobreescribir  'As Boolean
Dim str_Equipos        'As String
Dim int_Equipo         'As Integer
Dim obj_FS             'As Scripting.FileSystemObject

'Iniciamos el indicador de sobreescritura como falso
bol_Sobreescribir = False


'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

Set obj_FS = CreateObject("Scripting.FileSystemObject")
'Recorremos los equipos contenidos en el array
For int_Equipo = LBound(arr_Equipos) To UBound(arr_Equipos)

    Call s_ProcesarEquipo(arr_Equipos(int_Equipo))

Next 'int_Equipo

Sub s_ProcesarEquipo(str_Equipo)
'***********************************************************************
'* Procedimiento: s_ProcesarEquipo                                     *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 15/11/2007 16:32:01                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este método se encarga de copiar la carpeta          *
'*                referida por str_Origen en la carpeta referida por   *
'*                str_Destino, en caso de existir en el equipo de      *
'*                destino, se sobreescribirá si bol_Sobreescribir es   *
'*                True. Recibe como parámetro el nombre del equipo en  *
'*                el que se copiará.                                   *
'***********************************************************************
    
    If Not f_EquipoResponde(str_Equipo) Then
    
        WScript.Echo str_Equipo & ": No responde"
        Exit Sub
        
    End If
    
    On Error Resume Next
    
    Call obj_FS.CopyFolder(str_Origen, _
                           "\" & str_Equipo & "" & str_Destino, _
                           bol_Sobreescribir)
    If Err.Number =0 Then
       
        WScript.Echo str_Equipo & ": carpeta copiada"                     
        
    Else
    
        WScript.Echo str_Equipo & ": Error " & Err.Number & _
                     " ~ " & Err.Description
                     
    End If

End Sub 's_ProcesarEquipo

Function f_RevisarArgumentos( _
                             str_Error, _
                             int_Error _
                             ) 'As Boolean
'***********************************************************************
'* Procedimiento: f_RevisarArgumentos                                  *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 15/11/2007 16:31:40                                  *
'* 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 str_Dominio 'As String

    '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 que esté el argumento requerido 
    '/O (carpeta_origen)
    If WScript.Arguments.Named.Exists("O") Then

        str_Origen =  _
               WScript.Arguments.Named("O")

    Else

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

    End If

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

        str_Destino =  _
               WScript.Arguments.Named("C")
               
        'Como accederemos por medio de los recursos
        'compartidos administrativos, sustituimos los
        'dos puntos por dolar
        str_Destino = Replace(str_Destino,":","$")

    Else

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

    End If

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

        arr_Excluidos =  _
               Split(WScript.Arguments.Named("E"),",")

    End If

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

        bol_Sobreescribir = True
        
    Else
    
        bol_Sobreescribir = False

    End If

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

        'Definimos variables para poder hacer una consulta
        'que nos devuelva los nombres de los equipos del
        'dominio

        'Constante para consultar el árbol de dominio
        'completo
        Const ADS_SCOPE_SUBTREE = 2

        'Variables para la consulta
        Dim obj_Conexion 'As ADODB.Connection
        Dim obj_Comando 'As ADODB.Command
        Dim rs_Equipos 'As ADODB.Recordset

        'Contador de equipos
        Dim int_Equipo 'As Integer

        'Obtenemos el nombre del dominio en formato
        'LDAP
        str_Dominio = "DC=" & _
               Replace(WScript.Arguments.Named("D"), _
                       ".", _
                       ",DC=")

        'Creamos una conexión ADO
        Set obj_Conexion = CreateObject("ADODB.Connection")

        'Creamos un objeto comando de ADO
        Set obj_Comando =   CreateObject("ADODB.Command")

        'Establecemos el proveedor ADSI
        obj_Conexion.Provider = "ADsDSOObject"

        'Abrimos la conexión
        obj_Conexion.Open "Active Directory Provider"

        'Asignamos al objeto comando la conexión
        Set obj_Comando.ActiveConnection = obj_Conexion

        'Establecemos la consulta
        obj_Comando.CommandText = _
            "Select Name, Location from 'LDAP://" & _
                    str_Dominio & "' " _
                & "Where objectClass='computer'"

        'Establecemos el tamaño de página
        obj_Comando.Properties("Page Size") = 1000

        'Estabecemos que se realice la búsqueda en todo el árbol
        obj_Comando.Properties("Searchscope") = ADS_SCOPE_SUBTREE 

        'Creamos el recordset con la consulta
        Set rs_Equipos = obj_Comando.Execute

        'Nos situamos en el primer registro
        rs_Equipos.MoveFirst

        'Iniciamos la variable donde almacenaremos los nombres
        'de los equipos
        str_Equipos = ""

        'Recorremos el recordset hasta llegar al final
        Do Until rs_Equipos.EOF

            'Si hay lista de equipos excluidos
            If WScript.Arguments.Named.Exists("E") Then
            
                'Si no está excluido, se agrega a la lista de equipos
                If Not f_EquipoExcluido( _
                            rs_Equipos.Fields("Name").Value) Then
                            
                    'Añadimos el equipo al conjunto
                    str_Equipos = str_Equipos & _
                                  rs_Equipos.Fields("Name").Value & _
                                  ","

                End If
                
            Else
    
                'Añadimos el equipo al conjunto
                str_Equipos = str_Equipos & _
                              rs_Equipos.Fields("Name").Value & _
                              ","
                              
            End if
           
            'Vamos al siguiente registro
            rs_Equipos.MoveNext

        Loop

        'Si hemos encontrado algún equipo, str_Equipos no está vacío
        If Len(str_Equipos) > 0 Then

            'Quitamos la coma final de str_Equipos
            str_Equipos = Left(str_Equipos, _
                              Len(str_Equipos) - 1)         

            'Cargamos arr_Equipos haciendo Split a str_Equipos con
            'la coma como separador
            arr_Equipos = Split(str_Equipos,",")

        End If
        
    'Revisamos si ha sido pasado el argumento
    '/L (equipos)
    Elseif WScript.Arguments.Named.Exists("L") Then

        arr_Equipos = _
               Split(WScript.Arguments.Named("L"),",")

    Else

        Call s_NetView(arr_Equipos)

    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 : 15/11/2007 18:51:35                                  *
'* 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 copiar en uno o más equipos, " & _
                 "de forma remota, una carpeta."
    WScript.Echo "La copia se realiza de toda la carpeta y sus subc" & _
                 "arpetas, con todose sus"
    WScript.Echo "ficheros. Debe ser lanzado por un usuario que ten" & _
                 "ga permiso de lectura en la"
    WScript.Echo "carpeta a copiar y que sea administrador en el de" & _
                 " destino, pues usa los"
    WScript.Echo "recursos compartidos administrativos para realiza" & _
                 "r la copia (c$, d$, etc.)."
    WScript.Echo ""
    WScript.Echo "Sintaxis"
    WScript.Echo ""
    WScript.Echo "cscript [//nologo] copiar-carpeta.vbs /O:carpeta_" & _
                 "origen /C:copiar_en"
    WScript.Echo "[/L:equipos] [/D:dominio] [/E:equipos_excluídos] " & _
                 "[/S] [/?]"
    WScript.Echo ""
    WScript.Echo "Siendo"
    WScript.Echo ""
    WScript.Echo "- /O: carpeta_origen (Requerido):"
    WScript.Echo "Carpeta origen a copiar."
    WScript.Echo ""
    WScript.Echo "- /C: copiar_en (Requerido):"
    WScript.Echo "Carpeta donde se copiará la carpeta. Se trata de " & _
                 "la ruta local"
    WScript.Echo "en el equipo de destino."
    WScript.Echo ""
    WScript.Echo "- /L: equipos (Opcional):"
    WScript.Echo "Lista de equipos separados por comas. Forma un co" & _
                 "mbo de"
    WScript.Echo "argumentos con el argumento /D: en caso de omitir" & _
                 "se, y si se"
    WScript.Echo "omite también el argumento /D, se realizará la co" & _
                 "pia a todos"
    WScript.Echo "los equipos a los que se vea con el comando NetVi" & _
                 "ew, excepto"
    WScript.Echo "aquellos que estén en el argumento /E (lista de e" & _
                 "quipos"
    WScript.Echo "excluídos). Si están presentes tanto /L como /D, " & _
                 "se procesará"
    WScript.Echo "el argumento /D, siendo ignorado el /L. Si alguno" & _
                 " de los"
    WScript.Echo "equipos está en /E, no se procesará."
    WScript.Echo ""
    WScript.Echo "- /D: dominio (Opcional):"
    WScript.Echo "Nombre DNS del dominio del cual se realizará la c" & _
                 "opia a sus"
    WScript.Echo "equipos. Forma un combo de argumentos con el argu" & _
                 "mento /D: en"
    WScript.Echo "caso de omitirse, y si se omite también el argume" & _
                 "nto /D, se"
    WScript.Echo "realizará la copia a todos los equipos a los que " & _
                 "se vea con el"
    WScript.Echo "comando NetView, excepto aquellos que estén en el" & _
                 " argumento /E"
    WScript.Echo "(lista de equipos excluídos). Si están presentes " & _
                 "tanto /L como"
    WScript.Echo "/D, se procesará el argumento /D, siendo ignorado" & _
                 " el /L. Si"
    WScript.Echo "alguno de los equipos está en /E, no se procesará."
    WScript.Echo ""
    WScript.Echo "- /E: equipos_excluídos (Opcional):"
    WScript.Echo "Lista de equipos separados por comas que no serán" & _
                 " procesados."
    WScript.Echo ""
    WScript.Echo "- /S: sobreescribir (Opcional):"
    WScript.Echo "Si se pone este modificador, se reescribirá la ca" & _
                 "rpeta y sus"
    WScript.Echo "contenidos en caso de ya existir."
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo "Ejemplos:"
    WScript.Echo ""
    WScript.Echo "- Copia la carpeta \cirith-ungolcompartida1car" & _
                 "peta-raizcarpeta en la"
    WScript.Echo "carpeta c:carpeta-raíz, en los equipos balrog,tr" & _
                 "oll1,reybrujo:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo copiar-carpeta.vbs"
    WScript.Echo "/O:\cirith-ungolcompartida1carpeta-raizcarpet" & _
                 "a /C:c:carpeta-raíz"
    WScript.Echo "/L:balrog,troll1,reybrujo"
    WScript.Echo ""
    WScript.Echo "- Copia la carpeta \cirith-ungolcompartida1car" & _
                 "peta-raizcarpeta en la"
    WScript.Echo "carpeta c:carpeta-raíz, en los equipos balrog,tr" & _
                 "oll1,reybrujo,"
    WScript.Echo "sobreescribiendo la carpeta destino si ya existía:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo copiar-carpeta.vbs"
    WScript.Echo "/O:\cirith-ungolcompartida1carpeta-raizcarpet" & _
                 "a /C:c:carpeta-raíz"
    WScript.Echo "/L:balrog,troll1,reybrujo"
    WScript.Echo ""
    WScript.Echo "- Copia la carpeta \cirith-ungolcompartida1car" & _
                 "peta-raizcarpeta en la"
    WScript.Echo "carpeta c:carpeta-raíz, en los equipos del domin" & _
                 "io mordor.gov, excluyendo los"
    WScript.Echo "equipos saruman,ella,gollum:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo copiar-carpeta.vbs"
    WScript.Echo "/O:\cirith-ungolcompartida1carpeta-raizcarpet" & _
                 "a /C:c:carpeta-raíz"
    WScript.Echo "/D:mordor.gov /E:saruman,ella,gollum"
    WScript.Echo ""
    WScript.Echo "- Copia la carpeta \cirith-ungolcompartida1car" & _
                 "peta-raizcarpeta en la"
    WScript.Echo "carpeta c:carpeta-raíz, en los equipos que se ob" & _
                 "tienen al ejecutar NETVIEW,"
    WScript.Echo "excluyendo los equipos saruman,ella,gollum; se so" & _
                 "breescribirá la carpeta en el"
    WScript.Echo "caso de existir previamente:"
    WScript.Echo ""
    WScript.Echo "cscript //nologo copiar-carpeta.vbs"
    WScript.Echo "/O:\cirith-ungolcompartida1carpeta-raizcarpet" & _
                 "a /C:c:carpeta-raíz"
    WScript.Echo "/E:saruman,ella,gollum"
    WScript.Echo ""
    WScript.Echo ""
    WScript.Echo ""

End Sub 's_Ayuda

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

Sub s_NetView(arr_Equipos)
'***********************************************************************
'* Procedimiento: s_NetView                                            *
'* Tipo         : Método                                               *
'* Devolución   :                                                      *
'* Fecha y Hora : May 2007                                             *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Este procedimiento recibe un array que cargará con   *
'*                los nombres de los equipos que se obtienen al hacer  *
'*                NET VIEW.                                            *
'***********************************************************************

    Dim str_Comando, obj_FS, obj_TS
    Dim str_Texto, obj_SH
    Dim arr_Temporal
    Dim int_Equipo

    'Creamos iun objeto wshShell que nos permitirá
    'usar las variables de entorno
    Set obj_SH = CreateObject("WScript.Shell")

    'Establecemos el comando con el obtendremos un listado
    'de los equipos (usando NET VIEW) y volcando el listado
    'a un fichero temporal. El uso de FOR nos permite
    'obtener sólo los equipos, quitando lo que nos sobra de
    'la salida de NET VIEW
    str_Comando = obj_SH.ExpandEnvironmentStrings( _
                  "@for /f ""Tokens=1"" %c in ('@net view ^" & _
                  "|@Findstr /L /C:""\""') do (@echo %c>>""%" & _
                  "TEMP%NetView.txt"")")

    'Ejecutamos el comando
    Call s_Cmd(str_Comando)

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

    'Abrimos el fichero temporal como objeto TextStream
    Set obj_TS = obj_FS.OpenTextFile( _
                 obj_SH.ExpandEnvironmentStrings( _
                                   "%TEMP%NetView.txt"))

    'Volcamos el contenido del fichero en la variable str_Texto
    str_Texto = obj_TS.ReadAll

    'Cerramos el fichero temporal
    obj_TS.Close

    'Vaciamos el objeto TextStream
    Set obj_TS = Nothing

    'Borramos el fichero temporal
    obj_FS.DeleteFile (obj_SH.ExpandEnvironmentStrings( _
                                   "%TEMP%NetView.txt"))

    'Limpiadita de culete :-)
    Set obj_SH = Nothing
    Set obj_FS = Nothing

    'Como los nombres de los equipos empiezan por \, lo
    'quitamos
    str_Texto = Replace(str_Texto, "\", "")
    
    'Cargamos el array temporal con los equipos pasados
    arr_Temporal = Split(str_Texto, vbCrLf)

    'Como el último elemento es una línea en blanco, lo suprimimos
    ReDim Preserve arr_Temporal(UBound(arr_Temporal) - 1)
    
    'Recorremos el array
    For int_Equipo = LBound(arr_Temporal) To UBound(arr_Temporal)
    
        'Si hay lista de equipos excluidos
        If WScript.Arguments.Named.Exists("E") Then
        
            'Si no está excluido, se agrega a la lista de equipos
            If Not f_EquipoExcluido( _
                        arr_Temporal(int_Equipo)) Then
                        
                'Añadimos el equipo al conjunto
                str_Equipos = str_Equipos & _
                              arr_Temporal(int_Equipo) & _
                              ","
                          
            End If
            
        Else
    
            'Añadimos el equipo al conjunto
            str_Equipos = str_Equipos & _
                          arr_Temporal(int_Equipo) & _
                          ","
                          
        End if
    
    Next 'int_Equipo
           
WScript.Echo str_Equipos

    'Borramos el array temporal
    Erase arr_Temporal

    'Si hemos encontrado algún equipo, str_Equipos no está vacío
    If Len(str_Equipos) > 0 Then

        'Quitamos la coma final de str_Equipos
        str_Equipos = Left(str_Equipos, _
                          Len(str_Equipos) - 1)         

        'Cargamos arr_Equipos haciendo Split a str_Equipos con
        'la coma como separador
        arr_Equipos = Split(str_Equipos,",")
        
    Else
    
        'Si no se han encontrado erquipo, terminamos el script mostrando
        'el error 16
        WScript.Echo "Error 16: No hay equipos a " & _
                     "los que copiar la carpeta"
        WScript.Quit 16

    End If

End Sub 's_NetView


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_EquipoExcluido(str_Equipo)' As Boolean
'***********************************************************************
'* Procedimiento: f_EquipoExcluido                                     *
'* Tipo         : Función                                              *
'* Devolución   : Booleana                                             *
'* Fecha y Hora : 15/11/2007 16:50:49                                  *
'* Autor        : Fernando Reyes                                       *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito    : Esta función recibe un nombre de equipo y mira si    *
'*                está en el array de equipos excluidos; devuelve      *
'*                True si está y False si no.                          *
'***********************************************************************

    Dim int_Equipo 'As Integer
    
    For int_Equipo = LBound(arr_Excluidos) To UBound(arr_Excluidos)
    
        If LCase(arr_Excluidos(int_Equipo)) = _
                                Replace(LCase(str_equipo),"$","") Then
                                
            f_EquipoExcluido = True
            Exit Function
            
        End If
    
    Next 'int_Equipo

    f_EquipoExcluido = False

End Function 'f_EquipoExcluido

 

 

20 comentarios to “Script VBScript Para Copiar Una Carpeta En Uno O Más Equipos”

  1. Mav said

    Buenos días, tengo un pequeño reto y he visto que eres un crack en cuestion de LDAP, te cuento: Necesitamso cambiar el campo PhycaldeliveryOfficeName en 280 usuarios, el problema viene en que no encuentro la forma de realizar el script para que se aplique a todos, cosa que de uno en uno si que se, pero claro no es plan de ir a pedalete uno a uno, eso es mu facil!!!!!!, lo bonito seria saber como hacerlo para todos los usuarios de golpe, ¿¿¿¿¿¿¿es posible????????

    Gracias por anticipado,

    Si quieres contestame solo al mail, con que me orientes un poco me bastaria, GRACIAS!!!!!!!!!!!!!!!!

  2. urpiano said

    May:

    ¿Seguro que necesitas un script para eso? Lo puedes hacer “a manubrio” desde “Usuarios y equipos de Active Directory”, seleccionando a todos los usuarios de una misma localización, click derecho, “Propiedades” y estableces la ubicación en la propiedad “Oficina” de la pestaña “General”.

  3. Mav said

    Hombre para eso especificamente no, ya que como bien indicas se pueden modificar todas las propiedades a “manubrio”, es mas, así lo hicimos. La idea del script es saber como se obtiene mediante LDAP toda una lista de usuarios de una OU especifica y sobre todo como cambiarles a todos del tiron las propiedades que queremos, es decir, igual que hacemos a “manubrio” pero sin tener que seleccionar todos de golpe, botón derecho y “tacatá”, sino que fuera algo un poco mas elaborado.

    Un saludo.

  4. urpiano said

    Mav,

    Eso que pides es tan simple como esto:


    Dim obj_OU, obj_Usuario

    Set obj_OU = _
    GetObject("LDAP://OU=SubOU,OU=OU,DC=dominio,DC=local")

    obj_OU.Filter = Array("user")

    For Each obj_Usuario In obj_OU

        obj_Usuario.Put "physicalDeliveryOfficeName","Brown Dispatching"
        obj_Usuario.SetInfo

    Next

  5. Mav said

    Bueno simple simple… Para uno que esta empezando ya es un mundo Urpiano, no en redes pero si en LDAP, y la verdad que estabamos muy cerca del código, pero de todas formas…. MUCHAS GRACIAS, te aseguro que es de gran utilidad tu blog y este script tan simple también lo es.

    de nuevo MUCHAS GRACIAS, ahora a probar!!!!

  6. Valentino said

    Hola vi este script y esta muy interesantes.
    Yo estoy buscando algo que cada 24 hs. chequee el contenido de una ruta y tome los nombres de todo lo que contenga (archivos y carpetas) que se ha pusieron ese dia y el resultado lo ponga en una planilla de excel junto con la fecha de creacion.
    Esto se puede hacer?

    Gracias

  7. urpiano said

    Valentino,

    Mira si te pueden valer alguno de estos scripts:

    Script VBSCript Que Sirve Para Listar Los Ficheros Y Carpetas En Una Fecha (versión FSO)

    Script VBSCript Que Sirve Para Listar Los Ficheros Y Carpetas En Una Fecha (versión WMI)

  8. Manuel said

    Urpiano, parece ser que sabes bastante de scripts, a que te dedicas? tenes algún manual o algo sobre cuestiones LDAP trabajos de usuario y grupos etc.
    muchas gracias.

  9. urpiano said

    Manuel,

    La propia Web de Microsoft, rezarle a San Google, San R.L. Mueller y pelearse.

  10. Pilar said

    Urpiano, necesito ayuda urgente.
    Debo copiar unos archivos desde una ruta del servidor a cada maquina, en caso de ser dll, tambien debo registrarlo. Todo ello desde visual basic
    Basandome en el script que presentas Hice una funcion que me permite copiar

    Public Function Copia_Registra(ByVal carpeta_origen As String, ByVal unidad_origen As String, ByVal unidad_destino As String, ByRef MsgError As String) As Boolean
    Copia_Registra = True
    On Error Resume Next
    Err.Clear
    MsgError = “”

    Set ofs = CreateObject(“scripting.filesystemobject”)
    If (Err.Number 0) Then
    MsgError = “Error al crear el FileSystemObject” & Chr(13) & Err.Description
    Copia_Registra = False
    Exit Function
    End If

    Dim carpeta As Object ‘Folder
    Dim archivos As Object ‘Files
    Dim archivo As Object ‘File
    Dim exeCorrectPatch As String

    ‘recorre la crpeta pa saca los archivos
    Set carpeta = ofs.GetFolder(unidad_origen & “\\” & carpeta_origen)
    Set archivos = carpeta.Files
    For Each archivo In archivos
    exeCorrectPatch = archivo.Name
    If Right(UCase(exeCorrectPatch), 3) = “EXE” Or Right(UCase(exeCorrectPatch), 3) = “INI” Then
    Call ofs.CopyFile(unidad_origen & “\\” & carpeta_origen & “\” & exeCorrectPatch, unidad_destino & “\\” & “SIMACT ” & exeCorrectPatch, True)

    End If
    next
    end function

    Necesito q

  11. Pilar said

    La funcion que copia archivos me funciona correctamente. Ahora requiero una funcion que me permita registrar las dll en las maquinas donde se copiaron estos archivos. Debo correr desde vb 6.0 y no se como hacer para registrar dll remotaamente.
    Agradeciendo tu ayuda.

  12. urpiano said

    Pilar,

    Mira si mi script de ejecución en remoto te puede valer para registrar la DLL con regsvr32.exe

  13. xxx said

    hola , me presento soy nuevo en estas cosas la verdad yo baje el Winautomation, para hacer cosas simples como copiar una carpeta a otro directorio, pero no c como hacerle para que me renombre la carpeta poniendole la fecha del equipo, es decir que la carpeta que copie tome el nombre de la fecha au se hizo el movimiento.

    por su apoyo y colaboracion gracias

  14. […] Script para copia de seguridad Mira a ver si te sirve: https://urpiano.wordpress.com/2007/11…o-mas-equipos/ — Saludos, Enrique Corts Microsoft MVP – Windows – Internet Explorer http://www.ekort.blogspot.com […]

  15. Xavi said

    Buenos dias urpiano,

    He mirado tu script y me es muy util para poder copiar los ficheros, a otro servidor, lo tengo a traves de una tarea programada, se podria implementar alguna opción para hacerlo cada cierto tiempo como por ejemplo cada hora.

  16. Buenos dias… Intento implementar tu script pero no me funciona… Resulta que cuando lo ejecuto, este me crea una carpeta local con el parametro establecido en /L:… Sabrias el porque pasa esto?

    • urpiano said

      ¡¡¡Maldita textualización de WordPress!!! Resulta que se ha comido todos llos slash inversos que tiene el script, de ahí que lo haga fallar. Me toca revisarlo entero para volver a publicarlo de manera que no me haga eso ¡¡¡Pierdo la cuenta de cuántas veces me ha tocado hacer esto!!! La puñetera textualización cambia de vez en cuando y lo que estaba bien publicado pasa a estar mal. Ha habido veces que me ha tocado reparar todos los scripts:o(

  17. Jordi said

    Buenas tardes urpiano,

    Tengo un script que no consigo que realice correctamente la instalación de un .msi

    Primero desinstala una aplicación y luego realiza la instalación de dos .msi generando un archivo de log. Lo que sucede, es que me descomprime todo el .msi en c:\, pero no instala nada! Podrías indicarme cual es el problema y como puedo solucionarlo?

    Gracias

    Dim lng_Devolucion1 ‘As Long
    Dim strComputer ‘As String
    Dim colSoftware ‘As Win32_Products
    Dim f1, ts, s
    Dim str_log ‘As String
    Dim objShell
    Dim objFSO
    Dim str_origin
    Dim delay
    Dim rc

    strComputer = “.”
    delay = 2000 ‘1 segundo

    Set objFSO = CreateObject(“Scripting.FileSystemObject”)
    Set wshShell = WScript.CreateObject (“WSCript.shell”)
    Set objShell = CreateObject(“wscript.shell”)
    Set objWMIService = GetObject(“winmgmts:” _
    & “{impersonationLevel=impersonate}!\\” & strComputer & “\root\cimv2”)

    str_log = “c:\carpetaLOG\” & objShell.ExpandEnvironmentStrings( “%COMPUTERNAME%” ) & “_archivo_log.txt”
    str_origin1 = “Package.msi”
    str_origin2 = ” Package.msi ”

    ‘comprovamos que se deba ejecutar el script
    If Not objFSO.FileExists(str_log) Then

    Set f1 = objFSO.CreateTextFile(str_log, True)

    ‘ Set colSoftware = objWMIService.ExecQuery _
    ‘ (“Select * from Win32_Product Where Name = ‘Aplicación a desinstalar'”)

    ‘ For Each objSoftware In colSoftware
    ‘ lng_Devolucion1 = objSoftware.Uninstall()
    ‘ Next

    ‘ If(err.Number = 0) then
    ‘ f1.WriteLine (“1.- desinstalado correctamente.”)
    ‘ f1.WriteBlankLines (1)
    ‘ Else
    ‘ f1.WriteLine(“1.- Ha ocurrido el siguiente error al desinstalar: ” & err.Number & vbcrlf & err.Description)
    ‘ f1.WriteBlankLines (1)
    ‘ End If

    ‘Esperamos un rato antes de continuar para asegurar que le ha dado tiempo suficiente
    WScript.Sleep delay

    ‘Empezamos la actualización
    Set Installer = CreateObject(“WindowsInstaller.Installer”)
    err.Clear
    Installer.UILevel = 5
    Installer.EnableLog “voicewarmup”, “C:\archivo_log.log”
    Installer.InstallProduct str_origin1,””

    If(err.Number = 0) then
    f1.WriteLine (“2.- instalado correctamente.”)
    f1.WriteBlankLines (1)
    Else
    f1.WriteLine(“2.- Ha ocurrido el siguiente error al instalar la Actualización: ” & err.Number & vbcrlf & err.Description)
    f1.WriteBlankLines (1)
    End If

    ‘Esperamos un rato antes de continuar para asegurar que le ha dado tiempo suficiente
    WScript.Sleep delay

    Installer.EnableLog “voicewarmup”, “C:\ archivo_log.log ”
    Installer.InstallProduct str_origin2,””

    If(err.Number = 0) then
    f1.WriteLine (“3.- instalado correctamente.”)
    f1.WriteBlankLines (1)
    Else
    f1.WriteLine(“3.- Ha ocurrido el siguiente error al instalar la Actualización: ” & err.Number & vbcrlf & err.Description)
    f1.WriteBlankLines (1)
    End If

    ‘cerramos el fichero de log de desinstalación y actualización
    f1.Close

    End If ‘Final de If Not objFSO.FileExists(str_log)

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: