Как найти UpgradeCode и ProductCode установленного приложения в Windows 7 - PullRequest
37 голосов
/ 21 февраля 2011

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

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

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

Ответы [ 10 ]

65 голосов
/ 21 февраля 2011

ВАЖНО : Прошло много времени с тех пор, как этот ответ был первоначально опубликован, и умные люди придумали более разумные ответы. Проверьте Как найти код обновления для установленного файла 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». Это значение сбрасывается туда.

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

18 голосов
/ 26 января 2013

Для возврата результатов требуется некоторое время, легко много десятков секунд, но 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
10 голосов
/ 24 сентября 2014

Всем, кто использует:

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 во время установки приложений, вам следует избегать запуска самовосстановления, поскольку они возвращают некоторые важные настройки.

  • Примечание. При этом будет найден код вашего продукта, затем обновление будет найдено, как упомянул Ян. Я обычно, однако, просто использую либо «InstEd It!» или «Orca», затем перейдите к таблице свойств MSI, и она перечисляет их прямо вверху.
8 голосов
/ 28 мая 2013

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

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

6 голосов
/ 30 мая 2013

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"  }
3 голосов
/ 21 апреля 2015

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

2 голосов
/ 21 февраля 2011

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

0 голосов
/ 04 декабря 2014

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

0 голосов
/ 25 сентября 2013

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

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

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

0 голосов
/ 26 июля 2013

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

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

Ссылки:
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 "","",MSIDetails

...