web-dev-qa-db-fra.com

Comment trouver le UpgradeCode et le ProductCode d'une application installée dans Windows 7

J'ai une application installée sur ma machine. J'ai aussi son code source, mais les codes ProductCode et UpgradeCode de cette application ont été modifiés.

Maintenant, je veux obtenir les codes UpgradeCode et ProductCode de cette application installée. Je pense qu'il doit y avoir un outil pour cela.

Quelqu'un peut-il me faire savoir comment obtenir le code de mise à niveau et le code de produit d'une application installée?

37
codeLover

[~ # ~] important [~ # ~] : Il y a longtemps que cette réponse a été publiée et que des personnes intelligentes sont arrivées avec des réponses plus sages. Vérifiez Comment puis-je trouver le code de mise à niveau pour un fichier MSI installé? à partir de @ Stein Åsmul si vous avez besoin d’une approche solide et complète.


Voici une autre façon (vous n'avez pas besoin d'outils):

  • ouvrir le registre du système et rechercher HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall _ clé (s’il s’agit d’un programme d’installation 32 bits sur un ordinateur 64 bits, il se peut que ce soit sous HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall au lieu).
  • les GUID répertoriés sous cette clé sont les produits installés sur cette machine
  • trouvez celui dont vous parlez - il suffit de procéder étape par étape jusqu'à ce que son nom apparaisse dans le volet de droite.

Ce GUID sur lequel vous vous êtes arrêté est le code de produit.

Maintenant, si vous êtes sûr que la réinstallation de cette application se passera bien, vous pouvez exécuter la ligne de commande suivante:

msiexec/i {GUID-PRODUIT-GUIDE-ICI} REINSTALL = TOUS REINSTALLMODE = omus/l * v log.txt

Cela "réparera" votre application. Maintenant, regardez le fichier journal et recherchez "UpgradeCode". Cette valeur est déversée ici.

REMARQUE: vous ne devez le faire que si vous êtes sûr que le flux de réinstallation est correctement implémenté et que cela ne cassera pas votre application installée.

66
Yan Sklyarenko

Il faut un certain temps pour obtenir des résultats, facilement plusieurs dizaines de secondes, mais wmic fonctionne bien et peut être scripté:

wmic product where "Name like '%Word%'" get Name, Version, IdentifyingNumber

résultat:

IdentifyingNumber                       Name                                      Version
{90140000-001B-0409-0000-0000000FF1CE}  Microsoft Office Word MUI (English) 2010  14.0.6029.1000

Le IdentifingNumber est le ProductCode. Je n'ai pas vu de propriété pour UpgradeCode, mais peut-être pourrait-il être enfoui sous quelque chose d'autre. Voir http://quux.wiki.zoho.com/WMIC-Snippets.html pour de nombreux autres exemples, y compris la désinstallation :

wmic path win32_product where "name = 'HP Software Update'" call Uninstall
18
matt wilkie

À tous ceux qui utilisent:

Get-WMIObject win32_product

Vous devez savoir que cela exécutera une auto-correction sur chaque application MSI installée sur le PC. Si vous deviez vérifier eventvwr, il dira que la reconfiguration de chaque produit est terminée.

Dans ce cas, j'utilise ce qui suit (un mélange de la méthode de Yan Sklyarenko):

$Reg = @( "HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*", "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*" )
$InstalledApps = Get-ItemProperty $Reg -EA 0
$WantedApp = $InstalledApps | Where { $_.DisplayName -like "*<part of product>*" }

Maintenant, si vous deviez taper:

$WantedApp.PSChildName

Vous obtiendrez ce qui suit:

PS D:\SCCM> $WantedApp.PSChildName
{047904BA-C065-40D5-969A-C7D91CA93D62}

Si votre organisation utilise des charges de MST lors de l'installation d'applications, vous voudriez éviter d'exécuter l'auto-réparation, elles rétablissent certains paramètres cruciaux.

  • Remarque - Ceci trouvera votre code produit, puis la mise à niveau peut être trouvée comme indiqué par Yan. Cependant, d'habitude, j'utilise simplement 'InstEd It!' ou 'Orca' puis allez à la table des propriétés du MSI et les répertorie tout en haut.
10
xBr0k3n

Si vous avez un programme d'installation msi, ouvrez-le avec Orca (outil de Microsoft), propriété de la table (lignes UpgradeCode, ProductCode, version du produit, etc.) ou la colonne Mise à niveau de la colonne Code de mise à niveau.

Essayez de trouver instller via le registre: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, recherchez la sous-clé requise et surveillez la valeur InstallSource. En cours de route, vous pourrez peut-être trouver le fichier MSI.

8
vinogradniy

Powershell gère ces tâches assez facilement:

$productCode = (gwmi win32_product | `
                ? { $_.Name -Like "<PRODUCT NAME HERE>*" } | `
                % { $_.IdentifyingNumber } | `
                Select-Object -First 1)

Vous pouvez ensuite l'utiliser pour obtenir également les informations de désinstallation:

$wow = ""
$is32BitInstaller = $True # or $False

if($is32BitInstaller -and [System.Environment]::Is64BitOperatingSystem) 
{
    $wow = "\Wow6432Node" 
}

$regPath = "HKEY_LOCAL_MACHINE\SOFTWARE$wow\Microsoft\Windows\CurrentVersion\Uninstall"

dir "HKLM:\SOFTWARE$wow\Microsoft\Windows\CurrentVersion\Uninstall" | `
? { $_.Name -Like "$regPath\$productCode"  }
6
codekaizen

Dans l'aperçu de Windows 10 construit avec PowerShell 5, je peux voir que vous pouvez faire:

$info = Get-Package -Name YourInstalledProduct
$info.Metadata["ProductCode"]

Pas familier avec même pas sûr si tous les produits ont UpgradeCode, mais selon ce post vous devez rechercher UpgradeCode à partir de ce chemin de registre:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes

Malheureusement, les valeurs de clé de registre sont le ProductCode et les clés de registre sont le UpgradeCode.

3
batbaatar

Vous pouvez utiliser les méthodes MsiEnumProductsEx et MsiGetProductInfoEx pour énumérer toutes les applications installées sur votre système et faire correspondre les données à votre application.

2
Ciprian

Solution de contournement très compliquée, avec l’avantage de ne pas avoir à réinstaller l’application comme la solution de contournement précédente était requise. Cela nécessite que vous ayez accès au msi (ou à un setup.exe avec le msi intégré).

Si vous utilisez Visual Studio 2012 (ou éventuellement d'autres éditions) et installez gratuitement "InstallShield LE", vous pouvez créer un nouveau projet de configuration à l'aide de InstallShield.

L'une des options de configuration de l'étape "Organiser votre configuration" est appelée "Chemins de mise à niveau". Ouvrez les propriétés des chemins de mise à niveau et, dans le volet de gauche, cliquez avec le bouton droit de la souris sur "Chemins de mise à niveau" et sélectionnez "Nouveau chemin de mise à niveau" ... parcourez maintenant le fichier msi (ou setup.exe contenant le fichier .ms), puis cliquez sur "Ouvrir". Le code de mise à niveau sera renseigné pour vous dans la page des paramètres du volet de droite que vous devriez maintenant voir.

0
TCC

N'avait trouvé aucun moyen de connaître le UpgradeCode à partir d'une application installée avant de voir Yan Sklyarenko 's solution de contournement (actuellement) ci-dessus. Mais si vous/quelqu'un d'autre trouvez un moyen de connaître (au moins) les codes UpgradeCode et ProductCode à partir d'un fichier MSI, lisez la suite.

De http://www.dwarfsoft.com/blog/2010/06/22/msi-package-code-fun/ , modifié pour autoriser (lors du lancement avec wscript.exe) une boîte contextuelle d’informations par MSI (Trunicated à 1023 caractères, en raison de wscript.echo _ limitation); capable d'entrer des MSI à partir de l'interface graphique ainsi que de la CLI; certaines validations de base des entrées humaines; Suppression du code de débogage ('Set oDatabase) et d'un correctif (DB.OpenView).

'Created by:   Chris Bennett
'Created Date: 22/06/2010
'Description:
'   Opens up MSI file(s) Passed as Arguments & returns ProductName, ProductCode,
'   The HKCR key created from ProductCode (a Packed GUID of ProductCode), the 
'   PackageCode and the UpgradeCode of the MSI. Much quicker than getting these
'   out of the MSI's the Manual Way.

Références:
http://msdn.Microsoft.com/en-us/library/aa369794%28VS.85%29.aspxhttp://www.eggheadcafe.com /forumarchives/platformsdkmsi/Jan2006/post25948124.asp

if wscript.arguments.count = 0 then
  MSIs = inputbox("Enter in * delimited list of MSI's to query (Max 254 characters)", "MSI Product Details")
  MSIs = split(MSIs,"*")
else
  set MSIs = wscript.arguments
end if

set objFS = createobject("scripting.filesystemobject")
For Each MSIPath in MSIs
  if objFS.fileexists(MSIPath) then
    Set MSIDetails = EvaluateMSI(MSIPath)
    MSIDetails = MSIPath & ": " & vbcrlf & vbcrlf & "Product Name: " &_
    MSIDetails("ProductName") & vbcrlf & "Product Code: " &_
    MSIDetails("ProductCode") & vbcrlf & "Product Key : " &_
    "HKCR\Installer\Products\" & PackGUID(MSIDetails("ProductCode")) &_
    vbcrlf & "Package Code: " & MSIDetails("PackageCode") & vbcrlf &_
    "Upgrade Code: " & MSIDetails("UpgradeCode") & vbcrlf
    WScript.Echo MSIDetails
  else
    wscript.echo "Inaccessible; Non-existant; or Error in Path for:" & vbcrlf & MSIPath & vbcrlf & "... skipping"
  end if
Next

Function EvaluateMSI(MSIPath)
  On Error Resume Next
  ' create installer object
  Set oInstaller = CreateObject("WindowsInstaller.Installer")
  ' open msi in read-only mode
  Set oDatabase = oInstaller.OpenDatabase(MSIPath, 0)
  Set objDictionary = CreateObject("Scripting.Dictionary")
  ' Get Package Code from Summary Information Stream   
  Set streamobj = oDatabase.SummaryInformation(0) '0 = read only
  objDictionary("PackageCode") = streamobj.Property(9)
  ' Get Product Name from MSI Database
  Set View = oDatabase.OpenView("Select `Value` From Property WHERE `Property`='ProductName'")
  View.Execute
  Set ProductName = View.Fetch
  objDictionary("ProductName") = ProductName.StringData(1)

  ' Get Product Code from MSI Database
  Set View = oDatabase.OpenView("Select `Value` From Property WHERE `Property`='ProductCode'")
  View.Execute
  Set ProductCode = View.Fetch
  objDictionary("ProductCode") = ProductCode.StringData(1)

  ' Get Upgrade Code from MSI Database
  Set View = oDatabase.OpenView("Select `Value` From Property WHERE `Property`='UpgradeCode'")
  View.Execute
  Set UpgradeCode = View.Fetch
  objDictionary("UpgradeCode") = UpgradeCode.StringData(1)

  Set EvaluateMSI = objDictionary
  On Error Goto 0
End Function

Function PackGUID(guid)  
  PackGUID = ""  
  '*  
  Dim temp  
  temp = Mid(guid,2,Len(guid)-2)  
  Dim part  
  part = Split(temp,"-")  
  Dim pack  
  pack = ""  
  Dim i, j  
  For i = LBound(part) To UBound(part)
    Select Case i
      Case LBound(part), LBound(part)+1, LBound(part)+2
        For j = Len(part(i)) To 1 Step -1  
          pack = pack & Mid(part(i),j,1)  
        Next  
      Case Else
        For j = 1 To Len(part(i)) Step 2  
          pack = pack & Mid(part(i),j+1,1) & Mid(part(i),j,1)  
      Next  
    End Select
  Next  
  '*  
  PackGUID = pack  
End Function

Si l'on a besoin de copier-coller l'un des GUID dans la fenêtre contextuelle, j'ai tendance à trouver qu'il est plus facile d'utiliser une boîte de saisie ultérieure, comme inputbox "","",MSIDetails

0
user66001

Si vous n'avez pas le fichier msi et que vous avez besoin du code de mise à niveau plutôt que du produit, la réponse est la suivante: Comment puis-je trouver le code de mise à niveau d'une application installée en C #?

0
krispy