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 Desinstalar Aplicaciones MSI En Uno O Varios Equipos

Posted by urpiano en Jueves 30 \30\UTC octubre \30\UTC 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
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

 

 

13 comentarios to “Script VBScript Para Desinstalar Aplicaciones MSI En Uno O Varios Equipos”

  1. Daniel Nava said

    y para desinstalar una aplicacióm tradicional (no MSI) como le podriamos hacer??

  2. urpiano said

    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)

  3. David said

    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!!!

  4. urpiano said

    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

  5. Mou said

    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.

  6. SAVM said

    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.

  7. urpiano said

    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.

  8. SAVM said

    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

  9. Carlos said

    Primero agradecerte el compartir este script, en otro orden al utilizarlo con la sintaxis para desinstalar en un equipo remoto me da como resultado el siguiente erro:

    C:\desinstalar-aplicacion.vbs(588, 9) (null): 0x8004100E

    Espero puedas ayudarme a decifrar el porque de este error, desde ya muchas Gracias.

    Saludos.

  10. Javier said

    Hola,

    a mi me da el mismo error que a Carlos, el C:\desinstalar-aplicacion.vbs(588, 9) (null): 0x8004100E

    he mirado el link de microsoft y tengo bien la configuracion del registro. Alguna idea mas ?.. muchisimas gracias por todo.

  11. Jorge said

    Hola.

    antes que nada agradecerte por el codigo, y da gusto que personas como tu compartan su conocimiento.

    probando tu codigo a mi me da el mismo error que carlos y javier.

    extraje de tu codigo (cambien rootCIMV2 por \root\CIMV2) la parte donde se conecta al equipo local, y listar los productos instalados, solo me lista uno, y si lo hago a una pc remota si me lista todos…?? alguna sugerencia.

    gracias

  12. Antonio said

    Hola saludos!
    ya tengo UninstallString que es
    “C:\Program Files\Common Files\Microsoft Shared\OFFICE14\Office Setup Controller\setup.exe” /uninstall PROPLUS /dll OSETUP.DLL
    en que parte del codigo lo ejecuto y como ejecutarlo?
    Gracias!

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: