Powershell – Vérifier et trouver le GUIDE du produit d’une configuration MSI installée

Pour déverrouiller totalement cette section, vous devez vous connecter

Le code produit est le GUID unique permettant d’identifier une application ou une version de produit; En d’autres termes, les différentes versions et langues du produit doivent avoir des codes de produit différents.

En outre, ProductCode peut être utilisé pour interroger l’état de la fonctionnalité et l’état du produit. Par exemple, l’API d’installation « MsiQueryFeatureStateEx() » et « MsiQueryProductState() », etc.

Les quatre approches suivantes peuvent nous donner plusieurs méthodes pour trouver et récupérer (également à distance) le GUID des paquets MSI installés:

Utilisez le Powershell « one-liner »

Toute auto-réparation déclenchée par cette option devrait généralement être possible d’annuler. Les contrôles d’intégrité du package déclenchés ajoutent cependant du « bruit » dans le journal des événements. Ne prenez pas que le numéro d’identification soit le code produit (particularité WMI).

get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

Démarrage rapide de Powershell: maintenez la touche Windows enfoncée, appuyez sur R, tapez « powershell » et appuyez sur Entrée.

Utilisez VBScript

Cette option peut être plus sûre que Powershell pour des raisons expliquées en détail ci-dessous.

En substance, il est (beaucoup) plus rapide et ne peut pas déclencher l’auto-réparation MSI car il ne passe pas par WMI (il accède directement à l’API MSI COM – à une vitesse fulgurante). Cependant, il est plus impliqué que l’option Powershell (plusieurs lignes de code).

Vous pouvez essayer un VBScript pour accéder aux informations via l’interface d’automatisation MSI (fonctionnalité principale de Windows – elle n’est pas liée à WMI).

  • Copiez le script ci-dessous et collez-le dans un *.fichier vbs sur votre bureau, et essayez de l’exécuter en double-cliquant. Votre bureau doit être accessible en écriture pour vous, ou vous pouvez utiliser n’importe quel autre emplacement accessible en écriture.
  • Ceci est un exemple de VBScript. La lacune a été préférée à la gestion des erreurs et à l’exhaustivité, mais elle devrait faire le travail avec un minimum de complexité.
  • Le fichier de sortie est créé dans le dossier à partir duquel vous exécutez le script (le dossier doit être accessible en écriture). Le fichier de sortie s’appelle msiinfo.csv.
  • Double-cliquez sur le fichier à ouvrir dans une feuille de calcul, sélectionnez une virgule comme délimiteur lors de l’importation OU ouvrez simplement le fichier dans le bloc-notes ou dans n’importe quelle visionneuse 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 une quantité importante de détails supplémentaires sur l’installation de MSI.

'#### 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 errorsFor Each product In installer.ProductsEx("", "", 7) productcode = product.ProductCode name = product.InstallProperty("ProductName") version=product.InstallProperty("VersionString") output.writeline (productcode & ", " & name & ", " & version)Nextoutput.Close

Recherche de registre

Vous pouvez également trouver le code produit en parcourant le registre à partir de cette clé de base: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall.

Appuyez sur la touche F3 et recherchez le nom de votre produit. S’il s’agit d’un programme d’installation 32 bits sur une machine 64 bits, il peut se trouver sous la clé suivante : HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall.

Les clés de registre suivantes sont les emplacements courants dans lesquels rechercher et trouver les GUID des paquets MSI:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\UninstallHKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\UninstallHKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall

Fichier MSI d’origine

Vous pouvez trouver le code produit dans la table des propriétés de tout fichier MSI (et de toute autre propriété également). Cependant, le GUID pourrait être (rarement) remplacé par une transformation appliquée au moment de l’installation et ne correspond donc pas au GUID sous lequel le produit est enregistré (les approches 1 et 2 ci-dessus rapporteront le code produit réel – qui est enregistré avec Windows – dans de si rares scénarios).

Vous avez besoin d’un outil pour afficher les fichiers MSI. Voir vers le bas de la réponse suivante pour une liste d’outils gratuits que vous pouvez télécharger (ou voir l’option rapide ci-dessous): Comment puis-je comparer le contenu de deux fichiers MSI (ou plus)?

Pour plus de commodité et de rapidité, vous pouvez télécharger SuperOrca sans délai et sans tracas à partir de ce lien direct à télécharger – l’outil est assez bon pour faire le travail – installez, ouvrez MSI et accédez directement à la table des propriétés et trouvez la ligne ProductCode (veuillez toujours vérifier un lien direct à télécharger – évidemment – vous pouvez utiliser virustotal.com pour ce faire – analyse en ligne en utilisant des dizaines de suites antivirus et de logiciels malveillants pour analyser ce que vous téléchargez).

Un autre outil, l’original, Orca est le propre outil de Microsoft, il est installé avec Visual Studio et le SDK Windows. Essayez de rechercher Orca-x86_fr-us.msi, sous Fichiers de programme (x86) et installez le MSI s’il est trouvé.

Récupérez les codes de produit

Lancez Powershell (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 une liste des codes de produit de package MSI installés avec le chemin du package de cache local et le nom du produit (maximisez 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). Si vous essayez de désinstaller un package, il y a une section ci-dessous avec un exemple de msiexec.lignes de commande exe:

get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

La sortie devrait être similaire à ceci:

 Powershell - Vérifiez et trouvez le GUIDE du produit d'une installation MSI installée

Pour une raison étrange, le « code produit » est appelé « Numéro d’identification » dans WMI. Donc, en d’autres termes, dans l’image ci-dessus, le numéro d’identification est le code produit.

En raison d’une conception étrange de Microsoft, tout appel WMI à Win32_Product (comme la commande PowerShell ci-dessous) déclenchera une validation de la succession de paquets. En plus d’être assez 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 y a un risque.

N’exécutez pas cette commande juste avant une réunion importante, elle n’est jamais dangereuse (c’est une requête en lecture seule), mais elle peut entraîner une longue réparation dans de très rares cas.

Vous pouvez également obtenir la sortie sous forme de liste (au lieu de table):

get-wmiobject -class Win32_Product

Dans ce cas, la sortie est similaire à ceci:

 Powershell - Vérifiez et trouvez le GUID de produit d'une installation MSI installée

Récupérez les codes de produit d’un ordinateur distant

En théorie, vous devriez simplement pouvoir spécifier un nom d’ordinateur distant dans le cadre de la commande elle-même. Voici la même commande que ci-dessus configurée pour s’exécuter sur la machine « RemoteMachine » (- La section RemoteMachine de nom d’ordinateur a été ajoutée):

get-wmiobject Win32_Product -ComputerName RemoteMachine | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

Cela peut fonctionner si vous utilisez des droits d’administrateur de domaine sur un domaine approprié. Dans un environnement de groupe de travail (petit réseau de bureau /domestique), vous devez probablement ajouter des informations d’identification utilisateur directement aux appels WMI pour que cela fonctionne.

De plus, les connexions à distance dans WMI sont affectées (au moins) par le pare-feu Windows, les paramètres DCOM et le contrôle de compte d’utilisateur (UAC) (plus tout facteur supplémentaire non Microsoft, par exemple des pare-feu physiques ou virtuels supplémentaires, des pare-feu logiciels tiers, des logiciels de sécurité de divers types, etc.). Que cela fonctionne ou non dépend, généralement, de votre configuration exacte.

Powershell

PowerShell nécessite l’installation du framework .NET, mais sur la plupart des systèmes d’exploitation modernes (Windows Server et plates-formes Windows, Powershell est déjà inclus et disponible). L’application PowerShell elle-même peut également être absente de la machine même si .NET est installé. Enfin, PowerShell peut être désactivé ou verrouillé par diverses stratégies et privilèges système.

Si c’est le cas, vous pouvez essayer quelques autres façons de récupérer les codes de produit. Une alternative est VBScript – il est rapide et flexible (mais peut également être verrouillé sur certaines machines, et le script est toujours un peu plus impliqué que l’utilisation d’outils).

Commençons par un outil WMI Windows intégré, généralement utilisé pour tester les composants et fonctionnalités de WMI : wbemtest.EXE.

  • Lancez wbemtest.exe (Maintenez la touche Windows enfoncée, appuyez sur R, relâchez la touche Windows, tapez « wbemtest.exe  » et appuyez sur OK).
  • Cliquez sur connecter, puis sur OK (l’espace de noms par défaut est root\cimv2), puis cliquez à nouveau sur « connecter ».
  • Cliquez sur « Requête » et tapez cette commande WQL (saveur SQL): SÉLECTIONNEZ Numéro d’identification, Nom, Version DE Win32_Product.
  • Cliquez sur « Utiliser » (ou équivalent – l’outil sera localisé).

L’exemple de capture d’écran de sortie est le suivant. Pas le plus beau formatage, mais vous pouvez obtenir les données dont vous avez besoin. Le numéro d’identification est le code produit MSI:

 Powershell - Vérifiez et trouvez le GUIDE du produit d'une configuration MSI installée

Ensuite, vous pouvez essayer un outil WMI personnalisé et plus complet tel que WMIExplorer.EXE.

  • Ceci n’est pas inclus dans Windows. C’est cependant un très bon outil.
  • Vérifiez-le à: https://github.com/vinaypamnani/wmie2/releases.
  • Lancez l’outil, cliquez sur Connecter, double-cliquez sur ROOT\CIMV2
  • Dans l' »onglet Requête », tapez la requête suivante SÉLECTIONNEZ Numéro d’identification, Nom, Version DE Win32_Product et appuyez sur Exécuter.

Obtenir le GUID des paquets MSI (Comparant le code produit et le code de mise à niveau)

Lancer PowerShell: maintenez les touches Windows et R enfoncées ensemble, relâchez la touche Windows, tapez « powershell » et appuyez sur OK ou appuyez sur Entrée.

Copiez le script ci-dessous dans son intégralité, puis faites un clic droit dans la fenêtre PowerShell.

Pour Win32_Property, nous filtrons les lignes et les colonnes (le code de mise à niveau n’est qu’un des nombreux types de lignes). Soyez prêt pour une opération lente, WMI est très lent à effectuer de telles récupérations.

$wmipackages = Get-WmiObject -Class win32_product$wmiproperties = gwmi -Query "SELECT ProductCode,Value FROM Win32_Property WHERE Property='UpgradeCode'"$packageinfo = New-Object System.Data.Datatable$packageinfo.Columns.Add("Name")$packageinfo.Columns.Add("ProductCode")$packageinfo.Columns.Add("UpgradeCode")foreach ($package in $wmipackages) { $foundupgradecode = $false #Let's assume that no UpgradeCode is found yet. foreach ($property in $wmiproperties) { if ($package.IdentifyingNumber -eq $property.ProductCode) { $packageinfo.Rows.Add($package.Name,$package.IdentifyingNumber, $property.Value) $foundupgradecode = $true break } } if(-Not ($foundupgradecode)) { # No upgrade code found, add product code to list. $packageinfo.Rows.Add($package.Name,$package.IdentifyingNumber, "") }}$packageinfo | Format-table ProductCode, UpgradeCode, Name# Enable the following line to export to CSV (good for annotation). Set full path in quotes.# $packageinfo | Export-Csv "\MsiInfo.csv"

Le code de mise à niveau est le GUID unique permettant d’identifier une famille de produits. Autrement dit, les mêmes produits avec des versions différentes ont probablement été expédiés pour quelques versions. Ces produits ont des codes de produits différents, mais ils sont liés ensemble en utilisant le MÊME code de mise à niveau.

Par exemple, en supposant que nous ayons écrit un produit appelé « Happy MSI » et que ce produit ne dispose que d’un seul package MSI à déployer sur le système client.

La première version de ce produit est en fait le package MSI avec le nom « version_1.msi », et la deuxième version est « version_2.msi ». Ensuite, ces deux MSI doivent avoir le même code de mise à niveau. Lorsque les utilisateurs exécutent « version_2.msi » sur son système, le programme d’installation de Windows utilisera le UpgradeCode pour décider si les versions précédentes de ce produit sont déjà présentes sur le système.

L’API d’installation « MsiEnumRelatedProducts() » utilise le UpgradeCode pour interroger tous les produits de la famille.

Désinstaller les packages MSI

Si vous souhaitez désinstaller le package MSI et que vous avez trouvé le code produit (GUID) pour, vous pouvez le faire comme suit en utilisant une invite de commande élevée (recherchez cmd.exe, clic droit et exécuter 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 des Paramètres:

  • / X = exécuter la séquence de désinstallation
  • {00000000-0000-0000-0000-0000000000C} = Code produit pour le produit à désinstaller

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 une journalisation détaillée (mieux pour les fichiers batch):

msiexec.exe /x {00000000-0000-0000-0000-00000000000C} /QN /L*V "C:\My.log" REBOOT=ReallySuppress

Explication Rapide des Paramètres:

  • / X = exécuter la séquence de désinstallation
  • {00000000-0000-0000-0000-0000000000C} = Code produit pour le produit à désinstaller
  • /QN = Exécuter complètement silencieusement
  • /L * V »C:\My .log » = Journalisation détaillée sur le chemin spécifié
  • REBOOT = ReallySuppress = Éviter un redémarrage inattendu et soudain

Leave a Reply

Votre adresse e-mail ne sera pas publiée.