wix windows-installer uninstall msiexec

wix - Cómo desinstalar con msiexec usando el ID de producto sin archivo.msi presente



windows-installer uninstall (7)

El comando que especifique es correcto: msiexec / x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}

Si obtiene " Esta acción solo es válida para los productos que están instalados actualmente ", ha utilizado un código de paquete o producto no reconocido, y debe encontrar el correcto. A menudo, esto puede deberse al uso de un código de paquete erróneo en lugar de un código de producto para desinstalar: un código de paquete cambia con cada reconstrucción de un archivo MSI, y es la única guía que ve cuando ve la página de propiedades de un archivo msi. Debería funcionar para la desinstalación, siempre que uses la correcta. No hay lugar para el error. Si desea buscar el código del producto, necesita abrir el MSI. El código del producto se encuentra en la tabla de propiedades.

ACTUALIZACIÓN, enero 2018 :

Con todos los redireccionamientos del registro en marcha, no estoy seguro de que el siguiente enfoque basado en el registro sea una opción viable. No lo he comprobado correctamente porque ahora confío en el siguiente método con PowerShell: ¿Cómo puedo encontrar el GUID del producto de una configuración MSI instalada?

También revise esta respuesta de estilo de referencia que describe diferentes maneras de desinstalar un paquete MSI y maneras de determinar qué versión de producto ha instalado: Desinstalar un archivo MSI de la línea de comandos sin usar msiexec

Legado, opción de registro :

También puede encontrar el código del producto consultando el registro desde esta clave base: HKEY_LOCAL_MACHINE / SOFTWARE / Microsoft / Windows / CurrentVersion / Uninstall . Presiona F3 y busca el nombre de tu producto. (Si se trata de un instalador de 32 bits en una máquina de 64 bits, podría estar en HKEY_LOCAL_MACHINE / SOFTWARE / Wow6432Node / Microsoft / Windows / CurrentVersion / Uninstall en su lugar).

Legado, opción de PowerShell : (en gran parte similar a la nueva respuesta enlazada arriba)

Finalmente, puede encontrar el código del producto utilizando PowerShell:

get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name

Publicación similar: WiX: realizar una actualización importante en una instalación de varias instancias (captura de pantalla de cómo encontrar el código del producto en el MSI).

Estoy tratando de automatizar la desinstalación de paquetes creados con WiX con el propósito de cambiar la pila y la configuración del software instalado sin reprovisionar un sistema operativo completo. Eventualmente usaré el script de powershell para hacer esto, pero en este momento parece que no consigo que mi paquete de prueba se desinstale interactivamente con cmd.

Si corro:

msiexec /x ''{A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}''

msiexec /x A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8

Yo obtengo:

"No se pudo abrir el paquete de instalación. Verifique que el paquete exista y que pueda acceder a él, o comuníquese con el proveedor de la aplicación para verificar que se trata de un paquete válido de Windows Installer".

Si ejecuto: msiexec /x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}

Yo obtengo:

"Esta acción solo es válida para productos que están instalados actualmente"

He consultado la guía del instalador de Windows , la documentación de WiX , la documentación de msiexec y el uso de orca para revisar el .msi, pero no he encontrado nada que proporcione una imagen clara de cómo se procesa una desinstalación. ¿Se requiere el archivo .msi y, de no ser así, por qué el instalador de Windows parece pensar que es cuando se le da un GUID?

El código de WiX para el instalador .msi es:

<?xml version=''1.0'' encoding=''windows-1252''?> <Wix xmlns=''htp://schemas.microsoft.com/wix/2006/wi'' > <!--DO NOT COPY / PASTE THE PRODUCT ID GUID BELOW TO YOUR OWN WIX SOURCE --> <Product Id=''A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8'' Language=''2057'' Manufacturer=''COMPANYNAME IT-Operations'' Name=''COMPANYNAMEServerListener'' Version=''1.0.0'' UpgradeCode=''PUT-GUID-HERE''> <Package Id=''*'' Manufacturer=''COMPANYNAME IT-Operations'' Compressed=''yes'' /> <Media Id=''1'' Cabinet=''COMPANYNAMEServerListener.cab'' EmbedCab=''yes'' /> <Directory Id=''TARGETDIR'' Name=''SourceDir''> <Directory Id=''ProgramFilesFolder'' Name=''PFiles''> <Directory Id=''COMPANYNAME'' Name=''COMPANYNAME''> <Directory Id=''INSTALLDIR'' Name=''COMPANYNAMEServerListener''> <Component Id=''MainExecutable'' Guid=''*'' > <File Id=''COMPANYNAMEServerListener.exe'' Source=''COMPANYNAMEServerListener.exe'' Vital=''yes'' KeyPath=''yes'' /> <ServiceInstall Id=''COMPANYNAMEServerListenerInstall'' DisplayName=''COMPANYNAMEServerListener'' Description=''Accepts and discards TCP connections on port 28028 to indicate that this server is alive and ready to be controlled'' Name=''COMPANYNAMEServerListener'' Account=''NT AUTHORITY/LocalService'' ErrorControl=''normal'' Start=''auto'' Type=''ownProcess'' Vital=''yes'' > <ServiceDependency Id=''tcpip''/> </ServiceInstall> <ServiceControl Id="StartService" Start="install" Stop="both" Remove="uninstall" Name="COMPANYNAMEServerListener" Wait="yes" /> </Component> </Directory> </Directory> </Directory> </Directory> <Feature Id=''Complete'' Level=''1'' > <ComponentRef Id=''MainExecutable'' /> </Feature> <CustomTable Id ="COMPANYNAMEMetadata"> <Column Id="Property" Type="string" Category="Identifier" PrimaryKey="yes"/> <Column Id="Value" Type="string"/> <Row> <Data Column="Property">InstallString</Data> <Data Column="Value">/qn</Data> </Row> </CustomTable> </Product> </Wix>


Gracias a todos por la ayuda, resulta que fue un problema de WiX.

Cuando el ID de producto GUID se dejó explícito y codificado como en la pregunta, el .msi resultante no tenía propiedad de Código de producto sino una propiedad de ID de producto cuando se inspeccionaba con orca.

Una vez que cambié el GUID a ''*'' para generarse automáticamente, apareció el Código de Producto y todo funciona bien con la sintaxis confirmada por las otras respuestas.


Lo bueno es que este es realmente fácil y determinista de analizar: O bien, el paquete msi realmente no está instalado en el sistema o está haciendo algo mal. Por supuesto que la llamada correcta es:

msiexec /x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}

(Por supuesto, se necesitan derechos de administrador. Con llaves que no contengan comillas aquí, solo se necesitan comillas, si se especifican rutas o valores con espacios en blanco en la línea de comandos).
Si el mensaje es: "Esta acción solo es válida para los productos que están instalados actualmente", es verdad. O el paquete con este ProductCode no está instalado o hay un error tipográfico.

Para verificar dónde está la falla:

  1. Primero intente hacer clic derecho en el (probablemente) archivo .msi instalado. Verá (además de "Instalar" y "Reparar") una entrada de desinstalación. Haga clic en eso.
    a) Si esa desinstalación funciona, su msi tiene otro Código de Producto que usted espera (tal vez tenga una fuente de WiX incorrecta o su compilación tenga un registro dinámico donde cambia el Código de Producto).
    b) Si la desinstalación proporciona el mismo paquete "no válido para productos ya instalados", el paquete no está instalado (lo que obviamente es una condición previa para poder desinstalarlo).

  2. Si 1.a) fue el caso, puede buscar el Código de producto correcto de su paquete, si abre su archivo msi con Orca, Insted u otro editor / herramienta. Sólo google para ellos. Busque en la tabla el nombre "Propiedad" y busque la cadena "ProductCode" en la primera columna. En la segunda columna está el valor correcto.

No hay otras posibilidades.

Solo una sugerencia para la línea de comando utilizada: agregaría al menos el "/ qb" para una barra de progreso simple o el parámetro "/ qn" (el último para la desinstalación silenciosa completa, pero tiene sentido si está seguro, funciona).


No hay razón para que el comando {} no funcione. Las preguntas semi-obvias son:

  1. ¡Está seguro de que el producto está realmente instalado! Hay algo en ARP / Programas y características.

  2. La instalación original es de hecho visible en el contexto actual. Parece como si hubiera sido una instalación por usuario, y si ha iniciado sesión como otra persona ahora, no lo sabrá, tendrá que iniciar sesión con la misma cuenta que la instalación original.

  3. Si el directorio / windows / installer estuviera dañado, faltaría el archivo almacenado en la memoria caché y se usará para realizar la desinstalación.


Pruebe este comando msiexec / x {product-id} / qr


msiexec.exe / x "{588A9A11-1E20-4B91-8817-2D36ACBBBF9F}" / q


necesitas / q al final

MsiExec.exe /x {2F808931-D235-4FC7-90CD-F8A890C97B2F} /q