Comment désinstaller avec msiexec en utilisant le Produit ID guid sans.fichier msi présent
j'essaie d'automatiser la désinstallation des paquets créés en utilisant WiX dans le but de changer la pile et la configuration du logiciel installé sans reprovisioner tout un système D'exploitation. Finalement, j'utiliserai powershell scripting pour le faire, mais pour le moment, je n'arrive pas à faire désinstaller mon paquet 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 obtenir:
" le paquet d'installation ne pouvait pas être ouvert. Vérifier que le paquet existe et que vous pouvez accéder, ou contactez le fournisseur de l'application pour vérifier qu'il s'agit d'un paquet installateur Windows valide."
si je cours:
msiexec /x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}
, j'obtiens:
"cette action n'est valable que pour les produits qui sont actuellement installés"
j'ai regardé le windows installer guide , le WiX documentation , msiexec documentation et utilisé orca pour passer en revue le .MSI moi-même, mais je n'ai pas vraiment trouvé quoi que ce soit qui donne une image claire de la façon dont une désinstallation est traitée. Est le .MSI fichier requis et si non, alors pourquoi windows installer semble-t-il penser qu'il est une fois donné une directive?
le code WiX pour le .l'installateur msi est:
<?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 AUTHORITYLocalService'
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>
7 réponses
la commande que vous spécifiez est correcte: msiexec /x {a4bff20c-A21E-4720-88E5-79D5A5AEB2E8}
si vous obtenez " cette action n'est valable que pour les produits qui sont actuellement installés " vous avez utilisé un produit non reconnu ou un code d'emballage, et vous devez trouver le bon. Souvent, cela peut être dû à l'utilisation d'un code de colis au lieu d'un code de produit pour désinstaller - un code paquet change avec chaque reconstruction d'un fichier MSI, et est la seule guid que vous voyez lorsque vous consultez la page de propriété d'un fichier MSI. Il doit travailler pour désinstaller, à condition que vous utilisez la bonne. Pas de place pour l'erreur. Si vous voulez trouver le code produit à la place, vous devez ouvrir le MSI. Le code de produit se trouve dans le tableau de propriétés.
mise à jour, Jan 2018 :
avec tous les redirection du registre en cours, Je ne suis pas sûr que l'approche basée sur le Registre ci-dessous soit encore une option viable. Je n'ai pas vérifié correctement parce que je me fie maintenant à L'approche suivante en utilisant PowerShell: Comment puis-je trouver le guide produit d'une configuration MSI installée?
vérifiez également cette réponse de style de référence décrivant différentes façons de désinstaller un paquet MSI et des façons de déterminer quelle version du produit vous avez installé: Désinstaller un MSI fichier de la ligne de commande sans utiliser msiexec
Legacy, option d'enregistrement :
vous pouvez aussi trouver le code de produit en parcourant le registre à partir de cette clé de base: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall . Appuyez sur F3 et recherchez le nom de votre produit. (Si c'est un installateur 32 bits sur une machine 64-bit, il pourrait être sous HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall à la place).
Legacy, PowerShell option : (largement similaire à la nouvelle réponse liée ci-dessus)
enfin, vous pouvez trouver le code du produit en utilisant PowerShell:
get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name
poste Similaire: WiX - Faire un grand mise à jour sur une installation multi instance (capture d'écran de la façon de trouver le code du produit dans le MSI).
il n'y a aucune raison pour que l'ordre ne fonctionne pas. Les questions semi-évidentes sont:
-
vous êtes sûr que le produit est effectivement installé! Il y a quelque chose dans ARP/Programs&Features.
-
l'installation originale est en fait visible dans le contexte actuel. Il semble que cela pourrait avoir été une installation par utilisateur, et si vous êtes connecté comme quelqu'un d'autre maintenant alors il ne sera pas au courant de cela - vous besoin de vous connecter sous le même compte que l'installation d'origine.
-
si le répertoire \windows\installer était endommagé, le fichier caché serait manquant, et c'est utilisé pour faire la désinstallation.
la bonne chose est, celui-ci est vraiment facile et déterministe à analyser: Soit le paquet msi n'est pas installé sur le système, soit vous faites quelque chose de mal. Bien sûr, l'appel correct est:
msiexec /x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}
(Droits D'administrateur nécessaires bien sûr - avec accolades bouclées sans guillemets ici - les guillemets ne sont nécessaires, si les chemins ou les valeurs avec blanc sont spécifiés dans la ligne de commande.)
Si le message est: "Cette action est uniquement valable pour les produits qui sont actuellement installés", puis, c'est vrai. Soit le paquet avec CE Code produit n'est pas installé, soit il y a une faute de frappe.
Pour vérifier où est la faute:
-
essayez D'abord de cliquer avec le bouton droit de la souris sur le (probablement) installé .msi fichier lui-même. Vous verrez (en plus de "Install" et" Repair") une entrée de désinstallation. Cliquez sur ce.
a) si cette désinstallation fonctionne, votre msi a un autre ProductCode que vous vous attendez (peut-être que vous avez la mauvaise source WiX ou que votre construction a un logig dynamique où le code produit change).
b) si cette désinstallation donne le même "...seulement valable pour les produits déjà installés" le paquet n'est pas installé (ce qui est évidemment une condition préalable pour pouvoir le désinstaller). -
Si 1.a) dans ce cas, vous pouvez rechercher le bon Code produit de votre paquet, si vous ouvrez votre fichier msi avec Orca, Insted ou un autre éditeur ou de l'outil. Juste google. Regardez là dans la table avec le nom "Propriété" et recherchez la chaîne "ProductCode" dans la première colonne. Dans la deuxième colonne, il est la valeur correcte.
Il n'y a pas d'autres possibilités.
juste une suggestion pour la ligne de commande utilisée: Je voudrais ajouter au moins le" /qb "pour une barre de progression simple ou" / qn " paramètre (ce dernier pour complète Silent uninstall, mais ne fait que sens si tu es sûr, ça marche).
msiexec.exe / x "{588A9A11-1E20-4B91-8817-2D36ACBBBF9F} "/ q
Merci à tous pour l'aide - s'avère qu'il était un WiX question.
lorsque le Produit ID guide a été laissé explicite et codé comme dans la question, le résultat .msi n'avait pas de propriété ProductCode mais une propriété Product ID lors de l'inspection avec orca.
une fois que j'ai changé le GUID en '*' pour auto-generate, le ProductCode est apparu et tous les travaux bien avec la syntaxe confirmée par les autres réponses.
vous avez besoin /q à la fin
MsiExec.exe /x {2F808931-D235-4FC7-90CD-F8A890C97B2F} /q