Distribución masiva de ficheros mediante VBScript

Vamos a mostrar un script realizado con VBScript que copia ficheros de una ubicación de red a una local.




Me 'solicitaron' que se distribuyera de manera urgente la última versión de una aplicación a todos los equipos de la red. Dicha aplicación no disponía de paquete de instalación ni tampoco de un sistema de actualización propio. 

Opté por la realización de un script mediante VBScript y colocar este en la GPO general para que se lanzará en cada inicio de sesión de los usuarios.

Los requisitos de la aplicación y la creación de un icono de acceso directo en el escritorio ya estaba cubiertos con antelación por lo que no se realizó en el script.

Requisitos previos:
  • Repositorio de la actualización. Debe ser una ubicación accesible para todos los usuarios implicados, al menos de lectura.
  • Herramienta para editar VBScript. Personalmente uso VBSEdit es de pago aunque se pueden encontrar opciones libres.
¿Qué hace el script?

Primero comprobamos si la carpeta local existe, en caso contrario copiamos la carpeta del repositorio en el recurso compartido al equipo local.
En caso que la carpeta exista en el equipo se comprueba si la versión que tiene es la correcta, esto se comprueba mediante un archivo de texto que gestiona la versión a distribuir. Comprobamos que el archivo con extensión .jmb del equipo local es idéntico al del repositorio en caso contrario se borra la carpeta y se copia del repositorio.

Es importante la línea que cambia los permisos sobre la carpeta de aplicación para que el usuario pueda tener acceso a la carpeta de aplicación, se usa el comando de la shell de Windows calcs y se permite control total a todos los usuario.
Para terminar se crea un pequeño registro para controlar el script de actualización. En él  registramos la fecha y hora así como el nombre DNS del equipo y la dirección IP del mismo.



' Definicion de objeto para la ejecución de comandos shell
Set objShell = CreateObject("WScript.Shell")
' Definicion de objeto para uso de sisrtema de archivos
Set objFileSystem = CreateObject("Scripting.FileSystemObject") 

' Definir ubicacion de aplicacion en cliente
Dim rutaAplicacionLocal 
rutaAplicacionLocal = "C:\Aplicacion"
' Definir repositorio de versiones
Dim rutaRepositorioVersiones
rutaRepositorioVersiones = "\\SERVIDOR\RecursoCompartido$\Aplicacion_Actualizacion\"
' Definir la version distribuible
'  Nota: como no tiene correctamente definido el numero de version  
'  en el ejecutable recurro a nombre de carpeta = version
Dim versionDistribuible
versionDistribuible = "99.88.77.66"
' Montar path de ubicacion version distribuible
Dim rutaVersionDistribuible
rutaVersionDistribuible = rutaRepositorioVersiones & versionDistribuible

Sub Update

 If objFileSystem.FolderExists (rutaAplicacionLocal) =  False Then
  objFileSystem.CreateFolder rutaAplicacionLocal
  objFilesystem.CopyFolder rutaVersionDistribuible, rutaAplicacionLocal , Y
  ' Creo archivo con identificativo de version 
  Call createFileVersion
  ' Concecer permisos sobre ruta apl. local para el grupo Todos con Control Total
  objShell.Run "cacls " & rutaAplicacionLocal & " /T /E /G Todos:C" 
 Else
  If objFilesystem.FileExists ("\Aplicacion_version_" & versionDistribuible & ".jmb") = False Then
   ' Concecer permisos sobre ruta apl. local para el grupo Todos con Control Total
   objShell.Run "cacls " & rutaAplicacionLocal & " /T /E /G Todos:C"
   objFilesystem.DeleteFolder rutaAplicacionLocal, Y
   objFileSystem.CreateFolder rutaAplicacionLocal
   objFilesystem.CopyFolder rutaVersionDistribuible, rutaAplicacionLocal , Y
   ' Creo archivo con identificativo de version 
   Call createFileVersion
  End If
 End If
 iLog
End Sub

Sub createFileVersion
 objfilesystem.CreateTextFile rutaAplicacionLocal & "\Aplicacion_version_" & versionDistribuible & ".jmb", Y
End Sub

Sub iLog ()
 Const ForAppending = 8
 ' Define el archivo log
 Dim rutaLog
 rutaLog = "\\SERVIDOR\RecursoCompartido$\aplicacion_Log.txt"
 
 ' Apertura de archivo log en modo Appendig (=>inserta texto en la ultima linea)
 Set objFile = objFileSystem.OpenTextFile (rutaLog, ForAppending)
 
 ' Obtener direccion IP y nombre de la maquina donde se ejecuta el script
 Set colAdapters = GetObject ("winmgmts:" & "!\\.\root\cimv2").ExecQuery _
     ("Select * from Win32_NetworkAdapterConfiguration Where IPEnabled = True")
  
  Dim dirIP 
  For Each objAdapter in colAdapters  
   ' Lista las direcciones IP de la maquina
   For i = LBound(objAdapter.IPAddress) To UBound(objAdapter.IPAddress)
    dirIP =  objAdapter.IPAddress(i)
   Next
  ' Introduce los valores recogidos de la maquina a un archivo de texto 
  objFile.WriteLine Date & "," & Time  & "," & objAdapter.DNSHostName & "," & dirIP
  objFile.Close
 Next
End Sub
 
Update

No hay comentarios:

Publicar un comentario