J'ai besoin de trouver le GUID du produit pour un fichier MSI installé dans l'ordre. pour effectuer une maintenance telle que patching
, uninstall
( comment désinstaller ) et aussi pour auditing purposes
.
Pourcode de mise à niveaurécupération:Comment puis-je trouver le code de mise à niveau pour un fichier MSI installé?
Les informations ci-dessous se sont considérablement développées avec le temps et sont peut-être devenues un peu trop élaborées.Comment obtenir rapidement les codes de produits?(Quatre approches):
Use the Powershell "one-liner"
_ Faites défiler l'écran vers le bas pour la capture d'écran et étape par étape . Clause de non-responsabilité également ci-dessous - Risques mineurs ou modérés, en fonction de votre demande. Fonctionne bien pour moi. Toutauto-réparationdéclenché par cette option devrait généralement pouvoir être annulé. Les vérifications d'intégrité depackagetriggered ajoutent cependant un journal d'événements "parasite".Remarque! IdentifyingNumber
estle ProductCode
(particularité WMI).
_get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize
_
Démarrage rapide de Powershell: en attente Windows key, robinet R, tapez "powershell" et appuyez sur Enter
Use VBScript
_Décrit ci-dessous sous "Outils alternatifs" (section 3). Cette option peut êtresaferque Powershell pour des raisons expliquées en détail ci-dessous. En substance, il est (beaucoup)plus rapideet n'est pas capable de déclencher la réparation automatique de MSI car il ne passe pas par WMI (il accède à l'API MSI COM directement - à une vitesse fulgurante). Cependant, il est plus impliqué que l'option Powershell (plusieurs lignes de code).
Registry Lookup
_Certains ne jurent que par des recherches dans le registre. Ce n’est pas l’approche recommandée - j’aime bien passer par les API appropriées (ou en d’autres termes: appels de fonction du système d’exploitation). Il y a toujours des exceptions étranges prises en compte uniquement par les éléments internes de l'implémentation de l'API:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
_HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
_HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall
_Original MSI File / WiX Source
_Vous pouvez trouver le Product Code
dans le Property table
de tout fichier MSI (et de toute autre propriété). Cependant, le GUID pourrait éventuellement (rarement) être remplacé par une transformation appliquée au moment de l'installation et ne correspondrait donc pas au GUID sous lequel le produit est enregistré (les approches 1 et 2 ci-dessus indiqueront le code de produit réel - qui est enregistré avec Windows - dans de tels scénarios rares).
Vous avez besoin d'un outil pour afficher les fichiers MSI. Voir au bas de la réponse suivante la liste des outils gratuits que vous pouvez télécharger (ou voir l'option rapide ci-dessous): Comment puis-je comparer le contenu de deux fichiers (ou plus) MSI?
UPDATE: Pour plus de commodité etbesoin de vitesse:-), téléchargez SuperOrca sans délai et sans soucis à partir de ce lien direct de téléchargement - l'outil est assez bon pour faire le travail - installez, ouvrez MSI et allez directement à la table Propriété et trouvez le ProductCode
row (s'il vous plaît, vérifiez toujours les virus au moyen d'un lien direct de téléchargement - évidemment- vous pouvez utiliser virustotal.com pour le faire - analyse en ligne utiliser des dizaines de suites antivirus et malveillants pour analyser ce que vous téléchargez).
Orcaest le propre outil de Microsoft, il est installé avecVisual Studioet leWindows SDK. Essayez de rechercher
Orca-x86_en-us.msi
- sousProgram Files (x86)
et installez le MSI, le cas échéant.
Et ci-dessous, vous trouverez la réponse originale qui "s'est développée organiquement" dans beaucoup de détails.
Peut-être voyez-vous la section "Uninstall MSI Packages" ci-dessous s'il s'agit de la tâche que vous devez effectuer.
UPDATE: Si vous avez également besoin du codeupgrade, cochez cette réponse:Comment puis-je trouver le code de mise à niveau pour un fichier MSI installé?(récupère les codes de produit, les codes de mise à niveau et les noms de produit associés dans une sortie de table - similaire à celle ci-dessous).
- Impossible d'utiliser PowerShell?Voir la section "Autres outils" ci-dessous.
- Vous souhaitez désinstaller?Voir la section "Désinstallation des packages MSI" ci-dessous.
LancezPowershell( maintenez la touche Windows enfoncée, appuyez sur R, relâchez la touche Windows, tapez "powershell" et appuyez sur OK ) et exécutez la commande ci-dessous pour obtenir la liste des packages MSI installéscodes produitainsi que le chemin du package de cachelocalet du nomproduct/(agrandissez la fenêtre PowerShell pour éviter les noms tronqués).
Avant d’exécuter cette ligne de commande, veuillez lire l’avertissement ci-dessous (rien de dangereux, juste quelques nuisances potentielles). La section 3 sous "Outils alternatifs" montre une méthode alternative non-WMI pour obtenir les mêmes informations à l'aide de VBScript. Si vous essayez de désinstaller un paquet, une section ci-dessous contient des exemples de lignes de commande msiexec.exe:
_get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize
_
Leoutputdevrait ressembler à ceci:
Remarque! Pour une raison étrange, le"CodeProduit"est désigné par"IdentifyingNumber"dans WMI . En d'autres termes, dans l'image ci-dessus, IdentifyingNumberestle code produit.
Si vous avez besoin deexécuter cette requête à distance contre de nombreux ordinateurs distants, reportez-vous à la section " Récupérer les codes de produit à partir d'un ordinateur distant " ci-dessous.
DISCLAIMER(important, veuillez lire avant d'exécuter la commande!): En raison de la conception étrange de Microsoft, tout appel WMI à _
Win32_Product
_ (comme la commande PowerShell ci-dessous) déclenchera unvalidation du package. En plus d'êtreassez lent, cela peut dans de rares cas déclencher une auto-réparation MSI. Cela peut être un petit paquet ou quelque chose d’énorme - comme Visual Studio. Dans la plupart des cas, cela ne se produit pas, mais il existe un risque. N'exécutez pas cette commande juste avant une réunion importante - ce n'est pas toujours dangereux (c'est en lecture seule), mais cela peut entraîner une longue réparation dans de très rares cas ( Je pense que vous pouvez également annuler l’autoréparation - à moins que le package en question ne l’empêche activement, mais elle redémarrera si vous appelez à nouveau Win32_Product et elle persistera jusqu’à ce que vous laissiez l’autoréparation s’achever - parfois elle peut continuer même si vous le souhaitez. laissez-le finir: Comment puis-je déterminer les causes d'une réparation automatique répétée de Windows Installer? ).Et juste pour mémoire: , certaines personnes signalent que leurs journaux des événements sont remplis avec 1013 entrées MsiInstaller EventID (voir la réponse du chef du code) - apparemment causé par des requêtes WMI adressées à la classe Win32_Product (personnellement, je n'ai jamais vu ca). Ceci estnotdirectement lié à la commande Powershell suggérée ci-dessus, il s’agit d’un contexte d’utilisation générale de la classe WIM Win32_Product.
Vous pouvez également obtenir le résultat sous forme de liste (au lieu de tableau):
_get-wmiobject -class Win32_Product
_
Dans ce cas, le résultat est similaire à ceci:
En théorie, vous devriez pouvoir spécifier un nom d'ordinateur distant dans la commande elle-même. Voici la même commande que ci-dessus, configurée pour s'exécuter sur la machine "RemoteMachine" (section _-ComputerName RemoteMachine
_ ajoutée):
_get-wmiobject Win32_Product -ComputerName RemoteMachine | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize
_
Cela pourrait fonctionner si vous utilisez des droits d'administrateur de domaine sur un domaine approprié. Dans un environnement de groupe de travail (réseau domestique/de petite entreprise), vous devez probablement ajouter les informations d'identification de l'utilisateur directement aux appels WMI pour que cela fonctionne.
En outre, les connexions distantes dans WMI sont affectées par (au moins) lePare-feu Windows,Paramètres DCOMetContrôle de compte d'utilisateur(plus tous les facteurs non Microsoft supplémentaires - par exemplevrais pare-feu,pare-feu logiciels tiers,logiciels de sécurité de divers types, etc ...). Que cela fonctionne ou non dépend de votre configuration exacte.
UPDATE: Vous trouverez une section complète sur l'exécution de WMI à distance dans la réponse suivante: Comment puis-je trouver le code de mise à niveau pour un fichier MSI installé? . Il semble qu’une règle de pare-feu et la suppression de l’invitation UAC via un registre Tweak permettent de faire fonctionner les choses dans un environnement réseau de groupe de travail. Des changements non recommandés en termes de sécurité, mais cela a fonctionné pour moi.
PowerShellrequiert l'installation du .NET Framework(il semble que la version 3.5.1 soit? Octobre 2017). L’application PowerShell proprement ditepeut également ne pas figurersur la machine, même si .NET est installé. Enfin, je pense que PowerShell peut êtredésactivé ou verrouillépar diverses règles et privilèges système.
Si tel est le cas, vous pouvez essayer d'autres méthodes pour récupérer les codes de produit. Mon alternative préférée estVBScript- il est rapide et flexible (mais peut également être verrouillé sur certaines machines et les scripts sont toujours un peu plus compliqués que d’utiliser des outils).
Commençons avec unoutil WMI Windows intégré: _wbemtest.exe
_.
wbemtest.exe
_ ( Maintenez la touche Windows enfoncée, appuyez sur R, relâchez la touche Windows, tapez "wbemtest.exe" et appuyez sur OK ).SELECT IdentifyingNumber,Name,Version FROM Win32_Product
_ et cliquez sur "Utiliser" (ou équivalent - l'outil va être localisée).Ensuite, vous pouvez essayer un outil WMI personnalisé, plus complet, tel que _WMIExplorer.exe
_
SELECT IdentifyingNumber,Name,Version FROM Win32_Product
_ et appuyez sur Exécuter.Enfin, vous pouvez essayer unVBScriptpour accéder aux informations vial’interface d’automatisation MSI(fonctionnalité essentielle de Windows - il s’agit dunon liée à WMI).
msiinfo.csv
_._' Retrieve all ProductCodes (with ProductName and ProductVersion)
Set fso = CreateObject("Scripting.FileSystemObject")
Set output = fso.CreateTextFile("msiinfo.csv", True, True)
Set installer = CreateObject("WindowsInstaller.Installer")
On Error Resume Next ' we ignore all errors
For Each product In installer.ProductsEx("", "", 7)
productcode = product.ProductCode
name = product.InstallProperty("ProductName")
version=product.InstallProperty("VersionString")
output.writeline (productcode & ", " & name & ", " & version)
Next
output.Close
_
Je ne vois aucune autre option d'usage général permettant de récupérer les codes de produits pour le moment, veuillez en ajouter si vous en connaissez.Il suffit d’éditer inlineplutôt que d’ajouter trop de commentaires, s'il vous plaît.
Vous pouvez certainement accéder à ces informations depuis votre application en appelant l'interface d'automatisation MSI (basée sur COM) OR les fonctions du programme d'installation de CSI M ++ (API Win32). Vous pouvez même utiliser des requêtes WMI depuis votre application, comme dans les exemples ci-dessus, avec
PowerShell
, _wbemtest.exe
_ ou _WMIExplorer.exe
_.
Si vous voulezdésinstaller le package MSIpour lequel vous avez trouvé le code produit, procédez comme suit comme suit: La commandeelevated invite Prompt(search pour cmd.exe, cliquez avec le bouton droit de la souris suret exécutez-le en tant qu'administrateur):
Option 1: Désinstallation interactive de base sans journalisation (rapide et facile):
_msiexec.exe /x {00000000-0000-0000-0000-00000000000C}
_
Explication rapide du paramètre:
_/X = run uninstall sequence
{00000000-0000-0000-0000-00000000000C} = product code for product to uninstall
_
Vous pouvez également activer la journalisation (détaillée) et exécuter en mode silencieux si vous le souhaitez, ce qui nous amène à l'option 2:
Option 2: Désinstallation silencieuse avec journalisation détaillée (préférable pour les fichiers de traitement par lots):
_msiexec.exe /x {00000000-0000-0000-0000-00000000000C} /QN /L*V "C:\My.log" REBOOT=ReallySuppress
_
Explication rapide du paramètre:
_/X = run uninstall sequence
{00000000-0000-0000-0000-00000000000C} = product code for product to uninstall
/QN = run completely silently
/L*V "C:\My.log"= verbose logging at specified path
REBOOT=ReallySuppress = avoid unexpected, sudden reboot
_
Il existe une référencecomplète pour la désinstallation de MSIici (différentes façons de désinstaller les packages MSI): Désinstallation d'un fichier MSI à partir de la ligne de commande sans utiliser msiexec . Il existe une multitude de façons différentes de désinstaller.
Si vous écrivez un fichier de commandes, veuillez consulter la section 3 ci-dessus, réponse liée pour quelques variantes de ligne de commande de désinstallation communes et standard.
Et un lien rapide vers msiexec.exe (options de ligne de commande) (présentation de la ligne de commande pour msiexec.exe à partir de MSDN). Et la version de Technet également.
UPDATE: veuillez trouver une nouvelle réponse sur la manière de trouver le code de mise à niveau pour les packages installés au lieu de manuellement rechercher le code dans les fichiers MSI. Ceci est beaucoup plus fiable pour les paquets installés. Si le package n'est pas installé, vous devez toujours rechercher dans le fichier MSI (ou le fichier source utilisé pour compiler le fichier MSI) le code de mise à niveau. Laissant dans la section plus ancienne ci-dessous:
Si vous souhaitez obtenir leUpgradeCodeoules autres propriétés MSI, vous pouvez ouvrir le fichier MSI d'installation en cache pour le produit à partir de l'emplacement spécifié par "LocalPackage"dans l'image ci-dessus (quelque chose comme: _C:\WINDOWS\Installer\50c080ae.msi
_ - il s'agit d'un nom de fichier hexadécimal unique sur chaque système). Ensuite, vous recherchez dans UpgradeCode "Property table" (il est possible de redéfinir le UpgradeCode dans une transformation - pour être sûr d'obtenir la bonne valeur, vous devez extraire le code par programme de le système - je fournirai un script à ce sujet prochainement, cependant,le code de mise à niveau trouvé dans le fichier MSI mis en cache est généralement correct).
Pour ouvrir les fichiers MSI en cache, utilisezOrcaou un autre outil de packaging. Voici une discussion sur différents outils (certains d’entre eux conviendront): Quel produit d’installation utiliser? InstallShield, WiX, Wise, programme d'installation avancé, etc. . Si vous ne possédez pas un tel outil, votre meilleur pari serait peut-être d’essayer Super Orca (il est simple à utiliser, mais n’a pas été testé de manière approfondie).
UPDATE: voici une nouvelle réponse contenant des informations sur divers produits gratuits que vous pouvez utiliser pour afficher les fichiers MSI: Comment puis-je comparer le contenu de deux (ou plus) MSI? fichiers?
Si Visual Studio est installé, essayez de rechercher _Orca-x86_en-us.msi
_ - sous Program Files (x86)
- et installez-le (il s'agit du propre visualiseur et éditeur MSI officiel de Microsoft). Ensuite, trouvez Orca dans le menu de démarrage. Allez le temps en peu de temps :-). Techniquement, Orca est installé dans le cadre du SDK Windows (et non de Visual Studio), mais ce dernier est fourni avec l’installation de Visual Studio.Si Visual Studio n'est pas installé, peut-être connaissez-vous quelqu'un qui en a? Demandez-leur simplement de rechercher ce fichier MSI et de vous envoyer (il s’agit d’un petit fichier de moitié), qui devrait leur prendre quelques secondes.UPDATE: vous avez besoin de plusieurs fichiers CAB ainsi que du fichier MSI - ceux-ci se trouvent dans le même dossier que le fichier MSI. Sinon, vous pouvez toujours télécharger le Kit de développement logiciel (===) Windows (gratuit, mais il est volumineux - et tout ce que vous installez ralentira votre PC). Je ne sais pas quelle partie du SDK installe le MSI Orca. Si vous le faites, modifiez et ajoutez des détails ici.
Sujets similaires (pour référence et accès facile - je devrais nettoyer cette liste):
Si vous avez trop d’installateurs pour trouver facilement ce que vous cherchez, voici quelques exemples de PowerShell permettant de filtrer et d’affiner un peu le nom de l’affichage.
$filter = "*core*sdk*"; (Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall).Name | % { $path = "Registry::$_"; Get-ItemProperty $path } | Where-Object { $_.DisplayName -like $filter } | Select-Object -Property DisplayName, PsChildName