web-dev-qa-db-fra.com

Comment trouver le produit GUID d'une configuration MSI installée?

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.

57
Stein Åsmul

Pourcode de mise à niveaurécupération:Comment puis-je trouver le code de mise à niveau pour un fichier MSI installé?


Version courte

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):

1. _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! IdentifyingNumberestle 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

2. _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).

3. _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_

4. _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 rechercherOrca-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.


Récupérer les codes de produits

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:

enter image description here

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:

enter image description here


Récupérer les codes de produit à partir d'un ordinateur distant

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.


Outils alternatifs

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).

  1. Commençons avec unoutil WMI Windows intégré: _wbemtest.exe_.

    • Lancer _wbemtest.exe_ ( Maintenez la touche Windows enfoncée, appuyez sur R, relâchez la touche Windows, tapez "wbemtest.exe" et appuyez sur OK ).
    • Cliquez surconnectpuis surOK(l'espace de nom par défaut est root\cimv2), puis cliquez à nouveau sur "connect".
    • Cliquez sur "Query" et tapez cette commandeWQL(type SQL): _SELECT IdentifyingNumber,Name,Version FROM Win32_Product_ et cliquez sur "Utiliser" (ou équivalent - l'outil va être localisée).
    • Exemple de capture d'écran de sortie (tronquée). Pas le meilleur formatage, mais vous pouvez obtenir les données dont vous avez besoin.IdentifyingNumber est le code produit MSI:

wbemtest.exe

  1. Ensuite, vous pouvez essayer un outil WMI personnalisé, plus complet, tel que _WMIExplorer.exe_

    • Ce n'est pas inclus dans Windows. C'est un très bon outil, cependant. Conseillé.
    • Vérifiez-le à: https://github.com/vinaypamnani/wmie2/releases
    • Lancez l'outil, cliquez sur Connecter, double-cliquez sur ROOT\CIMV2.
    • Dans l'onglet "Query"", tapez la requête suivante _SELECT IdentifyingNumber,Name,Version FROM Win32_Product_ et appuyez sur Exécuter.
    • Capture d'écran ignorée, l'application nécessite trop d'espace à l'écran.
  2. 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).

    • Copiez le script ci-dessous et collez-le dans un fichier * .vbs sur votre bureau, puis essayez de l'exécuter en double-cliquant dessus. Votre bureau doit être accessible en écriture pour vous, ou vous pouvez utiliser tout autre emplacement accessible en écriture.
    • Ce n'est pas un excellent VBScript.La préférence est faibleplutôt que sur la gestion des erreurs et son exhaustivité, mais il convient de faire le travail avec un minimum de complexité.
    • Le fichier de sortie est créé dans le dossier à partir duquel vous exécutez le script (dossier doit être accessible en écriture). Le fichier de sortie s'appelle _msiinfo.csv_.
    • Double-cliquez sur le fichier à ouvrir dans un tableur, sélectionnez une virgule comme délimiteur lors de l'importation - OR - ouvrez simplement le fichier dans le Bloc-notes ou un visualiseur de texte.
    • L'ouverture dans une feuille de calcul permettra des fonctionnalités de tri avancées.
    • Ce script peut facilement être adapté pour afficher un nombre important d'informations supplémentaires sur l'installation de MSI . Une démonstration de ceci peut être trouvée ici: comment savoir quels produits sont installés - les nouveaux produits sont déjà installés MSI Windows .
_' 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_.


Désinstaller les packages MSI

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.


Récupération d'autres propriétés/informations MSI (code de mise à niveau f.ex)

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):

115
Stein Åsmul

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
0
Alexis Coles