web-dev-qa-db-fra.com

Trouver GUID À partir d'un fichier MSI

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

Je cherche dans le fichier MSI avec Orca mais je ne sais pas où chercher pour trouver le GUID.

Merci!

10
dshipper

Les trois principaux GUID d'une base de données Windows Installer sont les suivants: Package Code , ProductCode et UpgradeCode . Le premier est stocké dans le flux d'informations récapitulatif (menu Affichage dans Orca) et les autres dans la table des propriétés. (D'autres formes de bases de données, telles que les modules de fusion et les correctifs, ont des GUID similaires à des emplacements similaires, tels que le GUID du module de fusion ou le code du correctif GUID - chacun étant stocké de manière identique au code du package. )

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

11
Michael Urman

Il existe plusieurs façons de localiser le produit GUID pour packages installés. S'il vous plaît préférez l'option numéro 3.

Les plus courants sont:

  1. Vérifiez dans le registre sous les chemins de base suivants à l'aide de regedit.exe. Recherchez le nom de l'application (ou naviguez dans chaque sous-dossier jusqu'à ce que vous le trouviez). Une fois que vous l'avez trouvé, vous pouvez le transmettre à 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 localement le package MSI mis en cache dans % SystemRoot%\Installer. Il s'agit d'une version en cache du fichier MSI d'origine qui avait été utilisé à l'origine pour installer le produit sur votre ordinateur.
    • Vous aurez besoin d'un outil capable d'ouvrir des fichiers MSI. Voici une liste et une comparaison des fonctionnalités: Quel produit d’installation utiliser? InstallShield, WiX, Wise, programme d'installation avancé, 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 de visualisation de données MS SQL compatible.
    • L'outil gratuit MSI " Orca " du Kit de développement logiciel (SDK) Windows est l'outil préféré pour cette tâche d'extraction de données simple. C'est rapide, petit et fiable.
    • Suivez ensuite les conseils de Michael Uhrman dans la réponse ci-dessus et localisez le code du package dans le flux de résumé, ainsi que le code de mise à niveau et le produit dans la table Property. Le code de package est également visible à partir de la page de propriétés d'un fichier MSI dans l'Explorateur Windows.
  2. Utilisez Powershell pour répertorier les informations sur les packages. Je trouve cette option la plus facile et la plus pratique. Voir cette réponse pour une capture d'écran et un exemple: Comment puis-je trouver le produit GUID d'une installation MSI installée?

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

Si vous préférez utiliser VBScript à la place de Powershell, essayez la réponse de Phil Wilson: comment savoir quels produits sont installés - les nouveaux produits sont déjà installés MSI windows

6
Stein Åsmul

si vous voulez juste savoir ce que contiennent les noms ProductName et ProductCode (ProductId) d'un MSI donné, sans installer ce MSI ni vérifier le registre, vous pouvez interroger le MSI lui-même avec PowerShell en utilisant une fonction comme celle-ci (inspirée par http: // www .scconfigmgr.com/2014/08/22/comment-obtenir-obtenir-msi-fichier-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()
  }
}
1
grenade

Ma solution est que j'ai écrit une petite application console qui renvoie ProductCode de n'importe quel fichier MSI (le nom est transmis en tant qu'argument de programme). Je le fais en lisant le fichier guid du fichier .msi lui-même. En gros, j’ouvre ce fichier msi sous forme de chaîne et cherche un texte commençant par «ProductCode», obtenant son index et prenant 38 caractères avant cette position d’index. Voici la capture d’écran:  screenshot

1
Farkhod

Généralement (mais pas universellement), si un logiciel utilise une installation basée sur MSI, le GUID se trouve dans l'entrée Désinstaller. Il s'agira généralement du nom de la clé ou apparaîtra dans la valeur UninstallString et/ou UninstallPath. Parfois, la vie est facile et il existe une valeur ProductGuid.

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

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

Sur une version 64 bits de Windows, il existe deux clés de ce type, une pour les logiciels 64 bits et une seconde pour les logiciels 32 bits:

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
1
Harry Johnston