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?
[~ # ~] 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):
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).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.
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
À 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.
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.
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" }
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.
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.
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.
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
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 #?