Как найти UpgradeCode и ProductCode установленного приложения в Windows 7

У меня есть приложение, установленное на моей машине. У меня также есть исходный код, но каким-то образом код продукта и UpgradeCode этого приложения были изменены.

теперь я хочу получить UpgradeCode и ProductCode этого установленного приложения. Я чувствую, что должен быть какой-то инструмент для этого.

может ли кто-нибудь любезно сообщить мне, как получить UpgradeCode и ProductCode установленного приложения?

10 ответов



важно: прошло некоторое время с тех пор, как этот ответ был первоначально опубликован, и умные люди придумали более мудрые ответы. Проверка как найти код обновления для установленного файла MSI? от @ Stein Åsmul, если вам нужен твердый и всеобъемлющий подход.


вот еще один способ (вам не нужны никакие инструменты):

  • откройте системный реестр и найдите HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall key (если это 32-разрядный установщик на 64-разрядная машина, она может быть под HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall вместо).
  • GUID, перечисленные под этим ключом, являются продуктами, установленными на этой машине
  • найдите тот, о котором вы говорите - просто шаг за шагом, пока не увидите его имя на правой панели

этот GUID, на котором вы остановились, является кодом продукта.

Теперь, если вы уверены, что переустановка этого приложения будет идти нормально, вы можете запустить следующую командную строку:

msiexec / i {код продукта-GUID-здесь} Переустановить=все переустановить = omus / l*v бревно.txt

Это будет "ремонт" вашего приложения. Теперь посмотрите на файл журнала и найдите "UpgradeCode". Это значение сбрасывается туда.

Примечание: Вы должны сделать это, только если вы уверены, что reinstall flow реализован правильно, и это не сломает установленное приложение.


требуется некоторое время, чтобы вернуть результаты, легко много десятков секунд, но wmic работает хорошо и может быть сценарий:

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

результат:

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

на IdentifingNumber - это код продукта. Я не видел свойства для UpgradeCode, но, возможно, оно может быть похоронено под чем-то другим. Вижу http://quux.wiki.zoho.com/WMIC-Snippets.html для многих других примерах в том числе удалить:

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

для всех через:

Get-WMIObject win32_product

вы должны знать, что это будет запускать самоисцеление на каждом приложении MSI, установленном на ПК. Если вы проверите eventvwr, он скажет, что он закончил перенастройку каждого продукта.

в данном случае я использую следующее (смесь метода Яна Скляренко):

$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>*" }

теперь, если вы были типа:

$WantedApp.PSChildName

вам будет дано следующее:

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

если ваша организация использует нагрузки MST во время установки приложений, которые вы хотели бы избежать запуска self-heals encase они возвращают некоторые важные настройки.

  • Примечание-это найдет ваш код продукта, тогда обновление можно найти, Как упоминалось Yan. Я обычно, однако, просто использую либо " InstEd It!"или" Orca " затем перейдите в таблицу свойств MSI, и она перечисляет их прямо вверху.

Если у вас есть установщик msi, откройте его с помощью Orca (tool от Microsoft), свойства таблицы (rows UpgradeCode, ProductCode, версия продукта и т. д.) или кода обновления столбца обновления таблицы.

попробуйте найти instller через реестр: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall найти необходимый подраздел и посмотреть значение InstallSource. Возможно, по пути вы сможете найти файл MSI.


Powershell обрабатывает такие задачи довольно удобно:

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

затем вы можете использовать его, чтобы получить удалить информацию:

$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"  }

в Windows 10 предварительный просмотр сборки с PowerShell 5, Я вижу, что вы можете сделать:

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

не знаком даже не уверен, что все продукты имеют UpgradeCode, но согласно этому сообщению нужно искать UpgradeCode из этого раздела:

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

к сожалению, значения раздела реестра являются ProductCode и ключи реестра являются UpgradeCode.


можно использовать MsiEnumProductsEx и MsiGetProductInfoEx методы для перечисления всех установленных приложений в вашей системе и сопоставления данных с вашим приложением


другой способ-слишком сложный обходной путь, с преимуществом не нужно повторно установить приложение, как требуется предыдущий обходной путь. Это требует, чтобы у вас был доступ к msi (или установке.exe со встроенным msi).

Если у вас есть Visual Studio 2012 (или, возможно, другие выпуски) и установите бесплатный "InstallShield LE", вы можете создать новый проект установки с помощью InstallShield.

один из параметров конфигурации в шаге "организовать настройку" называется "пути обновления". Откройте свойства путей обновления и в левой панели щелкните правой кнопкой мыши "пути обновления" и выберите "Новый путь обновления" ... Теперь перейдите к msi (или setup.exe, содержащий msi) и нажмите "Открыть". Код обновления будет заполнен для вас на странице настроек в правой панели, которую вы должны увидеть.


не нашел никакого способа узнать UpgradeCode из установленного приложения, прежде чем увидеть Скляренко Яна ' s решение (в настоящее время) выше. Но если вы / кто-нибудь еще найдет способ узнать (по крайней мере) и UpgradeCode и ProductCode из MSI, читайте дальше.

С http://www.dwarfsoft.com/blog/2010/06/22/msi-package-code-fun/, изменен (при запуске с wscript.exe) одно всплывающее окно информации на MSI (Trunicated на 1023 chars, из-за wscript.echo ограничение); возможность ввода MSI(S) из GUI, а также CLI; некоторая базовая проверка ввода человеком; удаленный код отладки (' Set oDatabase) и 1 исправление ошибок (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.

References:
http://msdn.microsoft.com/en-us/library/aa369794%28VS.85%29.aspx http://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

если нужно чтобы скопировать и вставить любой из GUID во всплывающем окне, я считаю, что проще всего использовать следующий inputbox, например inputbox "","",MSIDetails


Если у вас нет msi, и вам нужен код обновления, а не код продукта, то ответ здесь:Как найти код обновления для установленного приложения в C#?