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

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

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

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

Ответ 1


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


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

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

Этот GUID, на котором вы остановились, это ProductCode.

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

msiexec/i {PRODUCT-CODE-GUID-HERE} REINSTALL = ALL REINSTALLMODE = omus/l * v log.txt

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

ПРИМЕЧАНИЕ. Вы должны сделать это, только если вы уверены, что переустановка потока реализована правильно, и это не нарушит ваше установленное приложение.

Ответ 2

Требуется некоторое время, чтобы возвращать результаты, легко много десятков секунд, но 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 - это ProductCode. Я не видел свойство для UpgradeCode, но, возможно, он мог быть похоронен под чем-то другим. См. http://quux.wiki.zoho.com/WMIC-Snippets.html для многих других примеров, включая удаление:

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

Ответ 3

Для всех, кто использует:

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, они возвращают некоторые важные настройки.

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

В предварительном сборке 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.

Ответ 7

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

Ответ 8

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

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

Литература:
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 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 "","",MSIDetails

Ответ 9

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

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

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