Script VBScript Para Desinstalar Aplicaciones MSI En Uno O Varios Equipos
Publicado por urpiano en Jueves 30 de Octubre de 2008
Este script permite desinstalar una aplicación instalada con un paquete MSI en uno o más equipos. Utiliza WMI para poder conectarse como otro usuario y así tener los privilegios necesario para poder desinstalar aplicaciones.
Sintaxis
cscript [//nologo] desinstalar-aplicacion.vbs [/E:equipos] [/F:fichero_equipos] [/U:usuario] [/C:contraseña] [/?] aplicación
Siendo
| Etiqueta | Dato | ¿Requerido? | Descripción |
| aplicación | Sí |
Nombre de la aplicación a desinstalar. El nombre se debe corresponder con el que aparece en Agregar o quitar programas. ¡Ojo! Con la clase Win32_Product solo se accede al software instalado con paquetes MSI, por lo que no todos los programas que aparezcan en Agregar o quitar programas se podrán desisntalar con esta script. Se puede pasar más de un nombre de aplicación, separados por comas y encerrados entre comillas si contienen espacios; en este caso se desinstalarán todas las aplicaciones pasadas
|
|
| E | equipos | No |
Lista de equipos, separados por comas, a los que se desinstalará la aplicación. Si se omite y también se omite el parámetro /F, se desinstalará en el equipo desde el que se lanza el script.
|
| F | fichero_equipos | No |
Ruta y nombre de un fichero con los nombres de los equipos, uno por línea, a los que se desinstalará la aplicación. Si se omite y también se omite el parámetro /E, se desinstalará en el equipo desde el que se lanza el script.
|
| U | usuario | No |
Nombre de usuario con el que se conectará a WMI. Ideal para lanzar desde un equipo a varios, siendo el usuario que lanza el script un usuario no administrador, ya que permite realizar la tarea como administrador. En el caso del equipo local, no se puede conectar a WMI con credenciales alternativas, por lo que el script en sí deberá ser lanzado por un usuario con privilegios suficientes como para desinstalar una aplicación.
|
| C | contraseña | No |
Cuando se pasa el argumento /U, se puede pasar este otro argumento con la contraseña del usuario especificado en /U. Si no se pasa este argumento, el script solicitará que se entre la contraseña en una página web que recibirá el dato en una caja de texto de tipo password, a salvo de ojos indiscretos.
|
| ? | No |
Muestra la ayuda en línea.
|
Ejemplos:
- Desinstalamos “Adobe Reader 7.0.0″,”Google Toolbar for Internet Explorer” en el equipo local:
cscript //nologo desinstalar-aplicacion.vbs "Adobe Reader 7.0.0","Google Toolbar for Internet Explorer"
- Desinstalamos “Adobe Reader 7.0.0″,”Google Toolbar for Internet Explorer” en los equipos durin,snaug,bardo:
cscript //nologo desinstalar-aplicacion.vbs /E:durin,snaug,bardo "Adobe Reader 7.0.0","Google Toolbar for Internet Explorer"
- Desinstalamos “Adobe Reader 7.0.0″,”Google Toolbar for Internet Explorer” en los equipos contenidos en el fichero c:mont-solitariaequiposdeisnstalar.txt:
cscript //nologo desinstalar-aplicacion.vbs /F:c:mont-solitariaequiposdeisnstalar.txt "Adobe Reader 7.0.0","Google Toolbar for Internet Explorer"
- Desistalamos “Adobe Reader 7.0.0″,”Google Toolbar for Internet Explorer” en los equipos contenidos en el fichero c:mont-solitariaequiposdeisnstalar.txt, conectando a WMI como el usuario mont-solitariamont-root; el script solicitará la contraseña del usuario mont-solitariamont-root:
cscript //nologo desinstalar-aplicacion.vbs /F:c:mont-solitariaequiposdeisnstalar.txt /U:mont-solitariamont-root "Adobe Reader 7.0.0","Google Toolbar for Internet Explorer"
- Desistalamos “Adobe Reader 7.0.0″,”Google Toolbar for Internet Explorer” en los equipos contenidos en el fichero c:mont-solitariaequiposdeisnstalar.txt, conectando a WMI como el usuario mont-solitariamont-root, pasando “Esta es la contraseña” como contraseña de dicho usuario:
cscript //nologo desinstalar-aplicacion.vbs /F:c:mont-solitariaequiposdeisnstalar.txt /U:mont-solitariamont-root /C:"Esta es la contraseña" "Adobe Reader 7.0.0","Google Toolbar for Internet Explorer"
Este es el código del script
'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'* desinstalar-aplicacion.vbs *
'* *
'* Este script permite desinstalar una aplicación instalada con un *
'* paquete MSI en uno o más equipos. Utiliza WMI para poder conectarse *
'* como otro usuario y así tener los privilegios necesario para poder *
'* desinstalar aplicaciones. *
'* *
'* Sintaxis *
'* *
'* cscript [//nologo] desinstalar-aplicacion.vbs [/E:equipos] *
'* [/F:fichero_equipos] [/U:usuario] [/C:contraseña] [/?] aplicación *
'* *
'* Siendo *
'* *
'* - aplicación (Requerido): *
'* Nombre de la aplicación a desinstalar. El nombre se debe *
'* corresponder con el que aparece en Agregar o quitar *
'* programas. ¡Ojo! Con la clase Win32_Product solo se accede *
'* al software instalado con paquetes MSI, por lo que no todos *
'* los programas que aparezcan en Agregar o quitar programas *
'* se podrán desisntalar con esta script. Se puede pasar más *
'* de un nombre de aplicación, separados por comas y *
'* encerrados entre comillas si contienen espacios; en este *
'* caso se desinstalarán todas las aplicaciones pasadas *
'* *
'* - /E: equipos (Opcional): *
'* Lista de equipos, separados por comas, a los que se *
'* desinstalará la aplicación. Si se omite y también se omite *
'* el parámetro /F, se desinstalará en el equipo desde el que *
'* se lanza el script. *
'* *
'* - /F: fichero_equipos (Opcional): *
'* Ruta y nombre de un fichero con los nombres de los equipos, *
'* uno por línea, a los que se desinstalará la aplicación. Si *
'* se omite y también se omite el parámetro /E, se *
'* desinstalará en el equipo desde el que se lanza el script. *
'* *
'* - /U: usuario (Opcional): *
'* Nombre de usuario con el que se conectará a WMI. Ideal para *
'* lanzar desde un equipo a varios, siendo el usuario que *
'* lanza el script un usuario no administrador, ya que permite *
'* realizar la tarea como administrador. En el caso del equipo *
'* local, no se puede conectar a WMI con credenciales *
'* alternativas, por lo que el script en sí deberá ser lanzado *
'* por un usuario con privilegios suficientes como para *
'* desinstalar una aplicación. *
'* *
'* - /C: contraseña (Opcional): *
'* Cuando se pasa el argumento /U, se puede pasar este otro *
'* argumento con la contraseña del usuario especificado en /U. *
'* Si no se pasa este argumento, el script solicitará que se *
'* entre la contraseña en una página web que recibirá el dato *
'* en una caja de texto de tipo password, a salvo de ojos *
'* indiscretos. *
'* *
'* *
'* Ejemplos: *
'* *
'* - Desinstalamos "Adobe Reader 7.0.0","Google Toolbar for Internet *
'* Explorer" en el equipo local: *
'* *
'* cscript //nologo desinstalar-aplicacion.vbs "Adobe Reader *
'* 7.0.0","Google Toolbar for Internet Explorer" *
'* *
'* - Desinstalamos "Adobe Reader 7.0.0","Google Toolbar for Internet *
'* Explorer" en los equipos durin,snaug,bardo: *
'* *
'* cscript //nologo desinstalar-aplicacion.vbs /E:durin,snaug,bardo *
'* "Adobe Reader 7.0.0","Google Toolbar for Internet Explorer" *
'* *
'* - Desinstalamos "Adobe Reader 7.0.0","Google Toolbar for Internet *
'* Explorer" en los equipos contenidos en el fichero *
'* c:mont-solitariaequiposdeisnstalar.txt: *
'* *
'* cscript //nologo desinstalar-aplicacion.vbs *
'* /F:c:mont-solitariaequiposdeisnstalar.txt "Adobe Reader *
'* 7.0.0","Google Toolbar for Internet Explorer" *
'* *
'* - Desistalamos "Adobe Reader 7.0.0","Google Toolbar for Internet *
'* Explorer" en los equipos contenidos en el fichero *
'* c:mont-solitariaequiposdeisnstalar.txt, conectando a WMI como el *
'* usuario mont-solitariamont-root; el script solicitará la *
'* contraseña del usuario mont-solitariamont-root: *
'* *
'* cscript //nologo desinstalar-aplicacion.vbs *
'* /F:c:mont-solitariaequiposdeisnstalar.txt *
'* /U:mont-solitariamont-root "Adobe Reader 7.0.0","Google Toolbar *
'* for Internet Explorer" *
'* *
'* - Desistalamos "Adobe Reader 7.0.0","Google Toolbar for Internet *
'* Explorer" en los equipos contenidos en el fichero *
'* c:mont-solitariaequiposdeisnstalar.txt, conectando a WMI como el *
'* usuario mont-solitariamont-root, pasando "Esta es la contraseña" *
'* como contraseña de dicho usuario: *
'* *
'* cscript //nologo desinstalar-aplicacion.vbs *
'* /F:c:mont-solitariaequiposdeisnstalar.txt *
'* /U:mont-solitariamont-root /C:"Esta es la contraseña" "Adobe *
'* Reader 7.0.0","Google Toolbar for Internet Explorer" *
'* *
'* *
'* *
'* *
'* © Fernando Reyes *
'* Octubre De 2008 *
'*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
'*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
'Exigimos la declaración de variables
Option Explicit
Dim str_Error 'As String
Dim int_Error 'As String
Dim arr_Aplicaciones 'As String
Dim arr_Equipos 'As String
Dim str_Usuario 'As String
Dim str_Clave 'As String
Dim str_Equipo 'As String
Dim str_Aplicacion 'As String
'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
'Recorremos ahora los equipos a procesar
For Each str_Equipo In arr_Equipos
'Debemos procesar cada una de las aplicaciones a desinstalar
For Each str_Aplicacion In arr_Aplicaciones
Call s_DesinstalarAplicacion(str_Equipo,str_Aplicacion)
Next 'str_Aplicacion
Next 'str_Equipo
Sub s_DesinstalarAplicacion(str_Equipo,str_Aplicacion)
Dim obj_ServicioWMI 'As SWbemServices
Dim bol_EquipoLocal
Dim col_Aplicaciones 'As Win32_Products
Dim obj_Aplicacion 'As Win32_Product
Dim lng_Devolucion 'As Long
bol_EquipoLocal = f_EquipoLocal(str_Equipo)
If Not f_EquipoResponde(str_Equipo) Then
WScript.Echo "No se pudo contactar con " & str_Equipo & _
". El equipo será omitido del proceso"
Exit Sub
End If
If Not f_ServicioWMI(obj_ServicioWMI,str_Usuario, _
str_Clave,str_Equipo,"") Then
WScript.Echo "No se ha podido conectar con el servicio" & _
" WMI del equipo " & str_Equipo & ". El e" & _
"quipo será omitido del proceso"
Exit Sub
End If
Set col_Aplicaciones = obj_ServicioWMI.ExecQuery _
("SELECT * FROM Win32_Product WHERE Name = '" & str_Aplicacion & "'")
For Each obj_Aplicacion in col_Aplicaciones
WScript.Echo str_Equipo & ": Iniciando la desinstalación " & _
"de " & str_Aplicacion
lng_Devolucion = obj_Aplicacion.Uninstall()
If lng_Devolucion = 0 Then
WScript.Echo str_Equipo & ": la aplicación """ & _
str_Aplicacion & """ ha sido desinstalada"
ElseIf lng_Devolucion = 2147549445 Then
WScript.Echo str_Equipo & ": la aplicación """ & _
str_Aplicacion & """ no se ha podido " & _
"desinstalar debido a un error de ser" & _
"vidor RPC."
Else
WScript.Echo str_Equipo & ": la aplicación """ & _
str_Aplicacion & """ no se ha podido " & _
"desinstalar al producirse el error " & _
lng_Devolucion
End If
Next 'obj_Aplicacion
End Sub 's_DesinstalarAplicacion
Function f_RevisarArgumentos( _
str_Error, _
int_Error _
) 'As Boolean
'***********************************************************************
'* Procedimiento: f_RevisarArgumentos *
'* Tipo : Función *
'* Devolución : Booleana *
'* Fecha y Hora : 30/08/2007 10:34:34 *
'* 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 dos tipos de error; *
'* error 1 para los argumentos sin nombre requeridos y *
'* no encontrados y error 2 para los argumentos con *
'* nombre requeridos y no encontrados. 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 *
'***********************************************************************
Dim bol_Devolucion 'As Boolean
Dim bol_Error1 'As Boolean
Dim bol_Error2 'As Boolean
Dim obj_FS 'As Scripting.FileSystemObject
Dim obj_TS 'As Scripting.TextStream
'Iniciamos los indicadores
bol_Devolucion = False
bol_Error1 = False
bol_Error2 = 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 si está el argumento sin nombre requerido
'(aplicacion)
If WScript.Arguments.Unnamed.Count < 1 Then
str_Error = "Error 1, falta/n argumento/s sin " & _
"nombre requerido/s"
bol_Error1 = True
Else
'Guardamos el argumento en la variables
'correspondiente
arr_Aplicaciones = _
Split(WScript.Arguments.Unnamed(0),",")
End If
'Revisamos que esté el argumento
'/U (usuario)
If WScript.Arguments.Named.Exists("U") Then
str_Usuario = _
WScript.Arguments.Named("U")
'Revisamos que esté el argumento
'/C (contraseña)
If WScript.Arguments.Named.Exists("C") Then
str_Clave = _
WScript.Arguments.Named("C")
Else
str_Clave = f_EntrarClave("\fernandor-fco" & _
"mpartidousuario-conexion.htm")
End If
End If
'Revisamos si ha sido pasado el argumento
'/F (fichero_equipos)
If WScript.Arguments.Named.Exists("F") Then
Set obj_FS = CreateObject( _
"Scripting.FileSystemObject")
Set obj_TS = obj_FS.OpenTextFile( _
Wscript.Arguments.Named("F"))
arr_Equipos = Split( _
obj_TS.ReadAll,vbCrLf)
obj_TS.Close
Set obj_TS = Nothing
Set obj_FS = Nothing
'Revisamos si ha sido pasado el argumento
'/E (equipos)
Elseif WScript.Arguments.Named.Exists("E") Then
arr_Equipos = _
Split(WScript.Arguments.Named("E"),",")
Else
arr_Equipos = Array(".")
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))
'La devolucion de la función será True en caso de
'haber alguno de los errores
bol_Devolucion = (bol_Error1 Or bol_Error2)
'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 : 30/08/2007 10:34:34 *
'* 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 desinstalar una aplicación in" & _
"stalada con un paquete MSI en"
WScript.Echo "uno o más equipos. Utiliza WMI para poder conecta" & _
"rse como otro usuario y así"
WScript.Echo "tener los privilegios necesario para poder desins" & _
"talar aplicaciones."
WScript.Echo ""
WScript.Echo "Sintaxis"
WScript.Echo ""
WScript.Echo "cscript [//nologo] desinstalar-aplicacion.vbs [/E" & _
":equipos] [/F:fichero_equipos]"
WScript.Echo "[/U:usuario] [/C:contraseña] [/?] aplicación"
WScript.Echo ""
WScript.Echo "Siendo"
WScript.Echo ""
WScript.Echo "- aplicación (Requerido):"
WScript.Echo "Nombre de la aplicación a desinstalar. El nombre " & _
"se debe"
WScript.Echo "corresponder con el que aparece en Agregar o quit" & _
"ar programas."
WScript.Echo "¡Ojo! Con la clase Win32_Product solo se accede a" & _
"l software"
WScript.Echo "instalado con paquetes MSI, por lo que no todos l" & _
"os programas"
WScript.Echo "que aparezcan en Agregar o quitar programas se podrán"
WScript.Echo "desisntalar con esta script. Se puede pasar más d" & _
"e un nombre de"
WScript.Echo "aplicación, separados por comas y encerrados entr" & _
"e comillas si"
WScript.Echo "contienen espacios; en este caso se desinstalarán" & _
" todas las"
WScript.Echo "aplicaciones pasadas"
WScript.Echo ""
WScript.Echo "- /E: equipos (Opcional):"
WScript.Echo "Lista de equipos, separados por comas, a los que se"
WScript.Echo "desinstalará la aplicación. Si se omite y también" & _
" se omite el"
WScript.Echo "parámetro /F, se desinstalará en el equipo desde " & _
"el que se"
WScript.Echo "lanza el script."
WScript.Echo ""
WScript.Echo "- /F: fichero_equipos (Opcional):"
WScript.Echo "Ruta y nombre de un fichero con los nombres de lo" & _
"s equipos, uno"
WScript.Echo "por línea, a los que se desinstalará la aplicació" & _
"n. Si se omite"
WScript.Echo "y también se omite el parámetro /E, se desinstala" & _
"rá en el"
WScript.Echo "equipo desde el que se lanza el script."
WScript.Echo ""
WScript.Echo "- /U: usuario (Opcional):"
WScript.Echo "Nombre de usuario con el que se conectará a WMI. " & _
"Ideal para"
WScript.Echo "lanzar desde un equipo a varios, siendo el usuari" & _
"o que lanza el"
WScript.Echo "script un usuario no administrador, ya que permit" & _
"e realizar la"
WScript.Echo "tarea como administrador. En el caso del equipo l" & _
"ocal, no se"
WScript.Echo "puede conectar a WMI con credenciales alternativa" & _
"s, por lo que"
WScript.Echo "el script en sí deberá ser lanzado por un usuario con"
WScript.Echo "privilegios suficientes como para desinstalar una" & _
" aplicación."
WScript.Echo ""
WScript.Echo "- /C: contraseña (Opcional):"
WScript.Echo "Cuando se pasa el argumento /U, se puede pasar es" & _
"te otro"
WScript.Echo "argumento con la contraseña del usuario especific" & _
"ado en /U. Si"
WScript.Echo "no se pasa este argumento, el script solicitará q" & _
"ue se entre la"
WScript.Echo "contraseña en una página web que recibirá el dato" & _
" en una caja"
WScript.Echo "de texto de tipo password, a salvo de ojos indisc" & _
"retos."
WScript.Echo ""
WScript.Echo ""
WScript.Echo "Ejemplos:"
WScript.Echo ""
WScript.Echo "- Desinstalamos ""Adobe Reader 7.0.0"",""Google" & _
" Toolbar for Internet Explorer"" "
WScript.Echo "en el equipo local:"
WScript.Echo ""
WScript.Echo "cscript //nologo desinstalar-aplicacion.vbs ""A" & _
"dobe Reader 7.0.0"",""Google"
WScript.Echo "Toolbar for Internet Explorer"""
WScript.Echo ""
WScript.Echo "- Desinstalamos ""Adobe Reader 7.0.0"",""Google" & _
" Toolbar for Internet Explorer"""
WScript.Echo "en los equipos durin,snaug,bardo:"
WScript.Echo ""
WScript.Echo "cscript //nologo desinstalar-aplicacion.vbs /E:du" & _
"rin,snaug,bardo ""Adobe Reader"
WScript.Echo "7.0.0"",""Google Toolbar for Internet Explorer"""
WScript.Echo ""
WScript.Echo "- Desinstalamos ""Adobe Reader 7.0.0"",""Google" & _
" Toolbar for Internet Explorer"""
WScript.Echo "en los equipos contenidos en el fichero"
WScript.Echo "c:mont-solitariaequiposdeisnstalar.txt:"
WScript.Echo ""
WScript.Echo "cscript //nologo desinstalar-aplicacion.vbs"
WScript.Echo "/F:c:mont-solitariaequiposdeisnstalar.txt """ & _
"Adobe Reader 7.0.0"",""Google"
WScript.Echo "Toolbar for Internet Explorer"""
WScript.Echo ""
WScript.Echo "- Desistalamos ""Adobe Reader 7.0.0"",""Google " & _
"Toolbar for Internet Explorer"" "
WScript.Echo "en los equipos contenidos en el fichero"
WScript.Echo "c:mont-solitariaequiposdeisnstalar.txt, conect" & _
"ando a WMI como el usuario"
WScript.Echo "mont-solitariamont-root; el script solicitará la" & _
" contraseña del usuario"
WScript.Echo "mont-solitariamont-root:"
WScript.Echo ""
WScript.Echo "cscript //nologo desinstalar-aplicacion.vbs"
WScript.Echo "/F:c:mont-solitariaequiposdeisnstalar.txt /U:m" & _
"ont-solitariamont-root"
WScript.Echo """Adobe Reader 7.0.0"",""Google Toolbar for Int" & _
"ernet Explorer"""
WScript.Echo ""
WScript.Echo "- Desistalamos ""Adobe Reader 7.0.0"",""Google " & _
"Toolbar for Internet Explorer"" "
WScript.Echo "en los equipos contenidos en el fichero"
WScript.Echo "c:mont-solitariaequiposdeisnstalar.txt, conect" & _
"ando a WMI como el usuario"
WScript.Echo "mont-solitariamont-root, pasando ""Esta es la co" & _
"ntraseña"" como contraseña de"
WScript.Echo "dicho usuario:"
WScript.Echo ""
WScript.Echo "cscript //nologo desinstalar-aplicacion.vbs"
WScript.Echo "/F:c:mont-solitariaequiposdeisnstalar.txt /U:m" & _
"ont-solitariamont-root"
WScript.Echo "/C:""Esta es la contraseña"" ""Adobe Reader 7.0" & _
".0"",""Google Toolbar for Internet"
WScript.Echo "Explorer"""
WScript.Echo ""
WScript.Echo ""
WScript.Echo ""
End Sub 's_Ayuda
Function f_ServicioWMI(obj_ServicioWMI, str_Usuario, _
str_Clave, str_Equipo, _
str_Espacio)
'***********************************************************************
'* Procedimiento: f_ServicioWMI *
'* Tipo : Función *
'* Devolución : Booleana *
'* Fecha y Hora : May 2007 *
'* Autor : Fernando Reyes *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito : Esta función permite conectar con el servicio WMI *
'* de un equipo. La conexión puede ser realizada *
'* directamente por el usuario que ha lanzado el *
'* script o por otro usuario cuyas credenciales son *
'* recibidas como parámetros. La función recibe como *
'* parámetro un objeto que será utilizado como *
'* parámetro de salida, siendo creado por la función *
'* como objeto de servicio WMI del equipo recibido *
'* como parámetro. Si recibe usuario, contraseña y *
'* nombre de equipo a conectar, conectará con ése *
'* equipo con las credenciales pasadas, siempre y *
'* cuando no se trate del equipo local, en cuyo caso *
'* no se conectará con credenciales alternativas si no *
'* con el usuario que lanza el script. Si está vacío *
'* el parámetro str_Espacio, se conectará con el *
'* espacio de nombres rootCIMV2, en caso contrario *
'* con el espacio pasado. *
'***********************************************************************
Dim obj_LocalizadorWMI
Dim lng_Respuesta
If Len(str_Espacio) = 0 Then str_Espacio = "rootCIMV2"
'Si hemos recibido nombre de usuario, debemos conectar
'al servicio WMI del equipo como el usuario
'recibido. en el caso de que se trate del equipo local
'ignoramos las credenciales alternativas
If Len(str_Usuario) > 0 _
And Not f_EquipoLocal(str_Equipo) Then
'Para poder especificar unas credenciales alternativas,
'debemos crear primero un localizador WMI
Set obj_LocalizadorWMI = CreateObject( _
"WbemScripting.SWbemLocator")
'Establecemos control de errores
On Error Resume Next
'Conectamos con el servicio WMI del equipo con las
'credenciales pasadas
Set obj_ServicioWMI = obj_LocalizadorWMI.ConnectServer( _
str_Equipo, str_Espacio, _
str_Usuario, str_Clave)
'Si se ha producido algún error...
If Err.Number <> 0 Then
'Lo primero es vaciar la variable con el localizador WMI
Set obj_LocalizadorWMI = Nothing
'Mostramos el error
WScript.Echo vbCrLf & vbCrLf & _
Err.Number & ": " & Err.Description
'Vaciamos el objeto Err
Err.Clear
'Devolvemos False
f_ServicioWMI = False
'Salimos de la función
Exit Function
End If
Else
'Podemos conectar directamente con el servicio WMI del
'equipo sin necesidad de utilizar el localizador WMI
'ya que no hay que hacerlo con otras credenciales
'distintas a las del usuario que lanza el script
Set obj_ServicioWMI = GetObject("winmgmts:\" & _
str_Equipo & "" & _
str_Espacio)
'si se ha producido algún error...
If Err.Number <> 0 Then
'Mostramos el error
WScript.Echo Err.Number & ": " & Err.Description & _
vbCrLf & vbCrLf
'Vaciamos el objeto Err
Err.Clear
'Devolvemos False
f_ServicioWMI = False
'Salimos de la función
Exit Function
End If
End If
'No se han producido errores, devolvemos True
f_ServicioWMI = True
'Limpieza de culito :-)
Set obj_LocalizadorWMI = Nothing
End Function 'f_ServicioWMI
Function f_EquipoLocal(str_Equipo)
'***********************************************************************
'* Procedimiento: f_EquipoLocal *
'* Tipo : Función *
'* Devolución : Booleana *
'* Fecha y Hora : May 2007 *
'* Autor : Fernando Reyes *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito : Esta función recibe un nombre de equipo y comprueba *
'* si se trata del equipo local o de uno remoto. Si es *
'* el equipo local devuelve True, si es remoto False. *
'* De paso, si como nombre de equipo local recibió "." *
'* cambiará en la variable recibida al nombre *
'* verdadero del equipo *
'***********************************************************************
Dim obj_SH, str_EquipoEntorno
f_EquipoLocal = False
'Creamos un objeto WshShell
Set obj_SH = CreateObject("WScript.Shell")
'Obtenemos el valor de la variable de entorno con
'el nombre de equipo
str_EquipoEntorno = UCase( _
obj_SH.ExpandEnvironmentStrings("%COMPUTERNAME%"))
'Si está vacío el nombre de equipo, o es ".",
'se trata del equipo local; lo asignamos a la
'variable
If Len(str_Equipo) = 0 _
Or str_Equipo = "." Then
str_Equipo = str_EquipoEntorno
f_EquipoLocal = True
'Ahora revisamos no se haya pasado el FQDN del equipo
'local o su nombre NetBios
ElseIf _
( _
Len(str_Equipo) > Len(str_EquipoEntorno) _
And UCase(Left(str_Equipo, Len(str_EquipoEntorno))) = _
UCase(str_EquipoEntorno) _
And Mid(str_Equipo, Len(str_EquipoEntorno) + 1, 1) = _
"." _
) _
Or UCase(str_Equipo) = UCase(str_EquipoEntorno) Then
str_Equipo = str_EquipoEntorno
f_EquipoLocal = True
End If
End Function 'f_EquipoLocal
Function f_EntrarClave(str_HTML)
'***********************************************************************
'* Procedimiento: f_EntrarClave *
'* Tipo : Función *
'* Devolución : Cadena *
'* Fecha y Hora : May 2007 *
'* Autor : Fernando Reyes *
'*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
'* Propósito : El propósito de esta función es el proveer al *
'* usuario de una caja de texto en la que teclear una *
'* contraseña sin revelarla, pues la caja de texto es *
'* de tipo password. Para ello se crea una página web *
'* que es cargada en un Internet Explorer y se recoge *
'* de éste la contraseña tecleada y se convierte en la *
'* devolucion de la función. La ruta y nombre de la *
'* página es recibida como parámetro por la función, *
'* lo que permite reutilizar esta función en más *
'* scripts y personalizar la página para cada script, *
'* lo único que debe ser igual en todas las páginas *
'* que se quieran utilizar es que el botón debe *
'* llamarse Aceptar, el control oculto AceptarPulsado *
'* y la caja de texto Clave. *
'* *
'* Esta función está basada en: *
'*http://www.microsoft.com/technet/scriptcenter/guide/sas_ent_lppm.msp
'*x?mfr=true
'* *
'* En el ejemplo de TechNet se pone una ruta local *
'* (c:carpetafichero.asp) para la ubicación del *
'* fichero. Esto no es correcto cuando estamos de XP *
'* SP2 en adelante, pues la navegación segura *
'* interfiere con el script, ya que contiene un script *
'* VBScript. Para evitar esto, yo lo que hago es *
'* situar el fichero en una carpeta compartida y *
'* acceder a él con su ruta UNC; de esta manera es *
'* tratado como de la zona de intranet y no hay *
'* problemas. También se podría colocar en un servidor *
'* Web que fuese de la intranet o de los sitios de *
'* confianza y referirse a él por su ruta http; la *
'* mejor opción de todas sería situarlo en un servidor *
'* web seguro, y poner su ruta https, de esa manera *
'* eludimos a alguien que esté usando un sniffer *
'* *
'* El código de la página puede ser tan simple como: *
'* <html> *
'* <script language="VBScript"> *
'* <!-- *
'* Sub Aceptar_OnClick() *
'* *
'* AceptarPulsado.Value = "Pulsado" *
'* *
'* End Sub *
'* --> *
'* </script> *
'* <body> *
'* Entre la contraseña del usuario con el que se *
'* conectará al servicioWMI del equipo: *
'* <input type="password" name ="Clave" size="20"> *
'* <p><input name="Aceptar" type="button" *
'* value="Aceptar" ></p> *
'* <p><input type="hidden" name="AceptarPulsado" *
'* size="20"></p> *
'* </body></html> *
'***********************************************************************
'Declaramos variables
Dim obj_IE
'Creamos un objeto Internet Explorer
Set obj_IE = WScript.CreateObject _
("InternetExplorer.Application", "IE_")
'Cargamos el navegador con la página recibida como parámetro
obj_IE.Navigate str_HTML
'Con este bucle esperamos a que la página esté completamente cargada
Do
WScript.Sleep 10
Loop Until obj_IE.ReadyState = 4
'Establecemos propiedades del navegador
obj_IE.Toolbar = 0
obj_IE.StatusBar = 0
obj_IE.Width = 400
obj_IE.Height = 250
obj_IE.Left = 0
obj_IE.Top = 0
obj_IE.Visible = 1
'En este bucle esperamos a que se haya pulsado el botón
'"Aceptar"
Do While (obj_IE.Document.All.AceptarPulsado.Value = "")
WScript.Sleep 250
Loop
'Recogemos la contraseña entrada
str_Clave = obj_IE.Document.All.Clave.Value
'Cerramos el navegador
obj_IE.Quit
'Esperamos a que esté cerrado
WScript.Sleep 250
'Establecemos la contraseña como devolución de la función
f_EntrarClave = str_Clave
'Limpiadita de culito :-)
Set obj_IE = Nothing
End Function 'f_EntrarClave
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
Daniel Nava escribió
y para desinstalar una aplicacióm tradicional (no MSI) como le podriamos hacer??
urpiano escribió
Pues mira, se puede y no se puede, me explico. Para saber las aplicaciones instaladas, ya sea con MSI o con un exe, es necesario mirar en la clave del registro HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall. Dentro de ella hay una serie de claves, con el SID de la aplicación como nombre. Dentro de cada clave tienes un valor “DisplayName” que el nombre con el que aparece en “Agregar o quitar programas”, está también el valor “UninstallString” que es lo que hay que ejecutar para desisntalarla, aunque no siempre está presente este valor (primera dificultad). Existe en el script center un script que te permite listar todo el software que aparece en “Agregar o quitar programas”, basta unos ligeros retoques para localizar la aplicación deseada, usando su “DisplayName” y obtener así su “UninstallString” (si es que existe):
List All Installed Software
Una vez tenemos su “UninstallString” podemos ejecutarla en remoto, por ejemplo usando psexec o este script:
Script VBScript Para Ejecutar Un Comando En Un Equipo Remoto
Parece que ya lo tendríamos, pero la última mala noticia es que esto lo que hace es lanzar el programa de desistalación, que, o tiene una opción para desisntalación desatendida (rara avis), necesitará que de forma interactiva desinstalemos la aplicación. Conclusión:
Documentate primero para ver si hay alguna manera de desinstalar de forma desatendida la aplicación que quieres suprimir o si no te tocará ir equipo por equipo (a no ser que tengas SMS, claro)
David escribió
Hola:
Al ejecutar este script me pasa lo siguiente:
C:\>cscript //nologo desinstalar-aplicacion.vbs /E:equipo /u:dominio\administrador /c:contraseña “Citrix Presentation Server Client”
-2147023174: El servidor RPC no está disponible.
No se ha podido conectar con el servicio WMI del equipo lpt_jona. El equipo será omitido del proceso
Si se lo paso sin nombre de usuario ni contraseña (estoy logado como administrador de dominio en un servidor me pasa lo siguiente:
C:\>cscript //nologo desinstalar-aplicacion.vbs /E:equipo “Citrix Presentation Server Client”
C:\desinstalar-aplicacion.vbs(590, 9) Error de Microsoft VBScript en tiempo de ejecución: El servidor remoto no existe o no está disponible: ‘GetObject’
Si lo ejecuto en local me lo desinstala, pero en la lan o en la vpn nada de nada…
Muchas gracias por adelantado!!!
urpiano escribió
David,
Me da la impresión de que es un problema con un firewall; revisa este artículo:
Connecting to WMI on a Remote Computer
http://msdn2.microsoft.com/en-us/library/aa389290.aspx
Mou escribió
david, seguramente lo estas ejecutando en un Windows 2003 y este para que funcione el Win32_product es necesario que este instalado el módulo de sistema Wmi_installer. Lo puedes instalar desde el CD de W2003
saludos.
SAVM escribió
que tal Urpiano como estas, me parecio muy interesante este script lo estoy ejecutando de manera local y no me funciona:
1. creee un archivo llamado desinstalar-aplicacion.vbs
2. alli coloque el codigo: cscript //nologo desinstalar-aplicacion.vbs “Dell Resource CD”
pero cuando lo ejecuto me dice error de sintaxis en el caracter 9.
La paicacion Dell Resource Cd es un msi y asi aparece en agregar y quitar programas, me podrias indicar por favor en que estoy fallando gracias.
urpiano escribió
SAVM,
No sé si me equivoco, pero me parece entender que lo que pones dentro del archivo es:
cscript //nologo desinstalar-aplicacion.vbs “Dell Resource CD”
De ser así, es erroneo, pues dentro del archivo debes poner todo lo que viene con fondo gris. Una vez guardado el fichero, lo ejecutas con la línea anterior.
SAVM escribió
Urpiano,
Muchisimas gracias por la aclaracion, ya lo ejecute pero se queda sin haer nada, me podrias enviar por favor a mi correo el archivo .vbs. Gracias. cavalerasergio@hotmail.com