Trouver le guide du fichier MSI

Comment puis-je lister le GUID d'un programme installé dans Windows? Sinon, est-il plus facile de trouver le GUID si j'ai le fichier MSI?

je regarde à travers le fichier MSI avec Orca mais je ne sais pas où chercher pour trouver le guide.

Merci!

10
demandé sur dshipper 2012-06-28 22:48:29

5 réponses

les trois principales GUIDs d'une base de données D'installateur de Windows sont le Code paquet , Code produit , et Upgredecode . La première est stockée dans le flux d'information sommaire (menu de vue dans Orca), et les autres sont stockées dans la table de propriété. (D'autres formes de bases de données telles que les modules de fusion et les patches ont des GUIDs similaires dans des endroits similaires, tels que le GUID du module de fusion ou le GUID du code de patch-chacun stocké identique au Code du paquet.)

pour les trouver sur une machine, vous pouvez chercher dans la clé de désinstallation, où le code de produit est souvent utilisé. Ou encore mieux, si vous cherchez à énumérer ce qui est actuellement installé sur la machine, vous pouvez appeler MsiEnumProducts .

10
répondu Michael Urman 2012-06-29 12:02:59

il y a plusieurs façons de localiser le produit GUID pour paquets installés . S'il vous plaît préférez l'option Numéro 3 .

les plus communs sont:

  1. vérifiez dans le registre sous les chemins de base suivants en utilisant regedit.EXE. Rechercher le nom de l'application (ou simplement parcourir chaque sous-dossier jusqu'à ce que vous le trouviez). Lorsque vous avez trouvé, vous pouvez le passer à msiexec.exe:
- 32-BIT SECTION:

 HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall
 HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall (per user section)
- 64-BIT SECTION:

 HKLM\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
- MERGED SECTION (supposedly all of the above merged together, I have not verified):

 HKCR\Installer\Products
  1. vérifiez le paquet Local MSI en cache dans %SystemRoot%\Installer . Il s'agit d'une version mise en cache du MSI original qui a été utilisé à l'origine pour installer le produit sur votre ordinateur.
    • vous aurez besoin d'un outil capable d'ouvrir les fichiers MSI. Voici une liste et comparaison des fonctionnalités: quel produit d'installation utiliser? InstallShield, WiX, Wise, Advanced Installer, etc .
    • un MSI est une base de données MS SQL déguisée, vous devriez également pouvoir l'ouvrir avec N'importe quel outil compatible MS SQL Data viewer.
    • l'outil MSI libre Orca Windows SDK est le préféré pour cette récupération de données simple tâche. C'est rapide, petit et fiable.
    • puis suivre les conseils de Michael Uhrman de sa réponse ci-dessus, et localiser le code du paquet dans le flux de résumé, et la mise à niveau et le code du produit dans la table de propriété. Le code du paquet est également visible à partir de la page de propriétés D'un fichier MSI dans Windows Explorer.
  2. utiliser Powershell pour inscrire les renseignements sur l'emballage. Je trouve cela le plus facile et le plus pratique option. Voir cette réponse pour une capture d'écran et un exemple: Comment puis-je trouver le produit GUID d'une configuration MSI installée?

si ce que vous essayez de faire est de désinstaller le produit en question, voir cette réponse complète de désinstallation MSI: Désinstaller un fichier MSI à partir de la ligne de commande sans utiliser msiexec

si vous sentez plus confortable d'utiliser VBScript au lieu de Powershell, s'il vous plaît essayer cette réponse de Phil Wilson: comment savoir quels produits sont installés - les nouveaux produits sont déjà installés fenêtres MSI

6
répondu Stein Åsmul 2017-10-17 12:51:57

typiquement (mais pas universellement) si un morceau de logiciel utilise l'installation basée sur MSI la GUID peut être trouvée dans l'entrée de désinstallation. Ce sera généralement soit le nom clé, soit la valeur désinstallation et/ou désinstallation du chemin. Parfois, la vie est facile et il y a une valeur ajoutée.

les entrées de désinstallation peuvent être trouvées ici:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

sur une version 64-bit de Windows il y a deux telles clés, une pour le logiciel 64-bit et une seconde pour les logiciels 32 bits:

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
1
répondu Harry Johnston 2012-06-29 02:04:47

si vous voulez juste savoir ce que ProductName et ProductCode (ProductId) un MSI donné contient, sans installer ce MSI et vérifier le registre, vous pouvez interroger le MSI lui-même avec PowerShell en utilisant une fonction comme celle-ci (inspiré par http://www.scconfigmgr.com/2014/08/22/how-to-get-msi-file-information-with-powershell ):

function Get-MSIProperties {
  param (
    [Parameter(Mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [System.IO.FileInfo] $path,

    [string[]] $properties = @('ProductCode', 'ProductVersion', 'ProductName', 'Manufacturer', 'ProductLanguage')
  )
  begin {
    $windowsInstaller = (New-Object -ComObject WindowsInstaller.Installer)
  }
  process {
    $table = @{}
    $msi = $windowsInstaller.GetType().InvokeMember('OpenDatabase', 'InvokeMethod', $null, $windowsInstaller, @($Path.FullName, 0))
    foreach ($property in $properties) {
      try {
        $view = $msi.GetType().InvokeMember('OpenView', 'InvokeMethod', $null, $msi, ("SELECT Value FROM Property WHERE Property = '$($property)'"))
        $view.GetType().InvokeMember('Execute', 'InvokeMethod', $null, $view, $null)
        $record = $view.GetType().InvokeMember('Fetch', 'InvokeMethod', $null, $view, $null)
        $table.add($property, $record.GetType().InvokeMember('StringData', 'GetProperty', $null, $record, 1))
      }
      catch {
        $table.add($property, $null)
      }
    }
    $msi.GetType().InvokeMember('Commit', 'InvokeMethod', $null, $msi, $null)
    $view.GetType().InvokeMember('Close', 'InvokeMethod', $null, $view, $null)
    $msi = $null
    $view = $null
    return $table
  }
  end {
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($windowsInstaller) | Out-Null
    [System.GC]::Collect()
  }
}
0
répondu grenade 2018-08-28 08:39:31

ma solution est que j'ai écrit une petite application de console qui renvoie le code produit de n'importe quel fichier MSI (nom est passé comme argument de programme). Je le fais en lisant le guide .msi fichier lui-même. En gros, j'ouvre ce fichier msi comme une chaîne de caractères et je cherche un texte qui commence par "ProductCode", qui obtient son index et qui prend 38 caractères avant cette position d'index. Voici la capture d'écran: screenshot

-1
répondu Farkhod 2017-10-17 09:51:22