web-dev-qa-db-fra.com

Comment désinstaller avec msiexec en utilisant product id guid sans fichier .msi présent

J'essaie d'automatiser la désinstallation des packages créés à l'aide de WiX afin de modifier la pile et la configuration de logiciels installés sans réapprovisionner un système d'exploitation complet. Finalement, j'utiliserai un script PowerShell pour le faire, mais pour le moment, je n'arrive pas à faire désinstaller mon package de test de manière interactive avec cmd.

Si je cours:

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

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

Je reçois:

"Impossible d'ouvrir le package d'installation. Vérifiez qu'il existe et que vous pouvez y accéder, ou contactez le fournisseur de l'application pour vérifier qu'il s'agit d'un package Windows Installer valide."

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

Je reçois:

"Cette action n'est valide que pour les produits actuellement installés"

J'ai consulté le guide d'installation de Windows , le documentation WiX , la documentation msiexec et utilisé orca pour passer en revue le .msi moi-même, mais je n'ai rien trouvé qui donne une image claire de la manière dont une désinstallation est traitée. Le fichier .msi est-il requis et si ce n’est pas le cas, pourquoi le programme d’installation de Windows semble-t-il penser que c’est quand on lui donne un GUID?

Le code WiX pour le programme d'installation .msi est le suivant:

<?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>
25
snoweagle

Merci à tous pour l'aide - il s'avère que c'était un problème WiX.

Lorsque l'ID de produit GUID était laissé explicite et codé en dur comme dans la question, le fichier .msi résultant ne comportait pas de propriété ProductCode mais une propriété d'ID de produit lorsqu'il était inspecté avec orca.

Une fois que j'ai changé le GUID en '*' pour générer automatiquement, le code de produit est apparu et tout fonctionne correctement avec une syntaxe confirmée par les autres réponses.

0
snoweagle

Réponse "Style de référence": Ceci est une réponse alternative à celle ci-dessous avec plusieurs options différentes affichées. Désinstallation d'un fichier MSI à partir de la ligne de commande sans utiliser msiexec.


La commande que vous spécifiez est correcte: msiexec/x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}

Si vous obtenez "Cette action n'est valide que pour les produits en cours d'installation]" vous avez utilisé un code de produit ou de package non reconnu et vous devez trouver le code qui convient. Cela peut souvent être provoqué par l'utilisation d'un code de package à la place d'un code de produit à désinstaller - un code de package change à chaque reconstruction. d’un fichier MSI, et est le seul guide que vous voyez lorsque vous affichez la page de propriétés d’un fichier msi. Cela devrait fonctionner pour la désinstallation, à condition que vous utilisiez le bon. Pas de place à l'erreur. Si vous souhaitez rechercher le code produit à la place, vous devez ouvrir le fichier MSI. Le code produit se trouve dans la table des propriétés.


UPDATE, janvier 2018 :

Avec toutes les redirections de registre en cours, je ne suis pas sûr que l'approche ci-dessous basée sur le registre soit une option viable. Je n'ai pas vérifié correctement, car je m'appuie maintenant sur l'approche suivante avec PowerShell: Comment puis-je trouver le produit GUID d'une configuration MSI installée?

Vérifiez également cette réponse de style référence décrivant différentes façons de désinstaller un package MSI et de déterminer la version du produit que vous avez installée: Désinstallation d'un fichier MSI à partir de la ligne de commande sans utiliser msiexec


Legacy, option de registre :

Vous pouvez également trouver le code produit en parcourant le registry à partir de cette clé de base: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall . Appuyez sur F3 et recherchez le nom de votre produit. (S'il s'agit d'un programme d'installation 32 bits sur un ordinateur 64 bits, il se peut qu'il se trouve sous HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall à la place).

Legacy, option PowerShell : (largement similaire à la nouvelle réponse liée ci-dessus)

Enfin, vous pouvez trouver le code produit à l’aide de PowerShell:

get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name

enter image description here

Post similaire: WiX - Effectuer une mise à niveau majeure lors d’une installation multi-instance (capture d’écran de la recherche du code produit dans le fichier MSI).

33
Stein Åsmul

Le point positif est que celui-ci est vraiment facile à analyser et déterministe: Soit le paquetage msi n’est vraiment pas installé sur le système, soit vous faites quelque chose de mal. Bien sûr, le bon appel est:

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

(Droits d'administrateur nécessaires bien sûr: avec des accolades sans guillemets ici, les guillemets ne sont nécessaires que si des chemins ou des valeurs avec des blancs sont spécifiés dans la ligne de commande.)
Si le message est: "Cette action n’est valable que pour les produits actuellement installés", c’est vrai. Soit le package contenant ce code de produit n'est pas installé, soit il y a une faute de frappe.

Pour vérifier où est la faute:

  1. Essayez d’abord de faire un clic droit sur le fichier .msi (probablement) installé. Vous verrez (en plus de "Installer" et "Réparer") une entrée Désinstaller. Cliquez dessus.
    a) Si cette désinstallation fonctionne, votre msi a un autre code de produit que prévu (peut-être avez-vous la mauvaise source WiX ou votre version possède-t-elle une journalisation dynamique dans laquelle le code de produit change).
    b) Si cette désinstallation donne le même résultat "... uniquement valable pour les produits déjà installés", le package n'est pas installé (ce qui est évidemment une condition préalable pour pouvoir le désinstaller).

  2. Si 1.a) était le cas, vous pouvez rechercher le code de produit correct de votre package si vous ouvrez votre fichier msi avec Orca, Insted ou un autre éditeur/outil. Il suffit de google pour eux. Regardez dans la table avec le nom "Property" et recherchez la chaîne "ProductCode" dans la première colonne. La deuxième colonne contient la valeur correcte.

Il n'y a pas d'autres possibilités.

Juste une suggestion pour la ligne de commande utilisée: j'ajouterais au moins le "/ qb" pour une simple barre de progression ou le paramètre "/ qn" (ce dernier pour une désinstallation complète en mode silencieux, mais n'a de sens que si vous êtes sûr que cela fonctionne).

3
Philm

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

3
suhail sayyad

Il n'y a aucune raison pour que la commande {} ne fonctionne pas. Les questions semi-évidentes sont:

  1. Vous êtes sûr que le produit est réellement installé! Il y a quelque chose dans ARP/Programmes & Features.

  2. L'installation d'origine est en fait visible dans le contexte actuel. Il semble que cela ait été une installation par utilisateur, et si vous êtes connecté comme quelqu'un d'autre maintenant, il ne le saura pas - vous devrez vous connecter sous le même compte que l'installation d'origine.

  3. Si le répertoire\windows\installer était endommagé, le fichier en cache serait manquant, ce qui permet de procéder à la désinstallation.

2
PhilDW

Essayez cette commande msiexec/x {product-id}/qr

0
Sushant Saurabh

vous avez besoin/q à la fin

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