Как найти UpgradeCode и ProductCode установленного приложения в Windows 7
У меня установлено приложение на моей машине. У меня также есть его исходный код, но каким-то образом ProductCode и UpgradeCode этого приложения были изменены.
Теперь я хочу получить UpgradeCode и ProductCode этого установленного приложения. Я чувствую, что для этого должен быть какой-то инструмент.
Может кто-нибудь любезно сообщить мне, как получить UpgradeCode и ProductCode установленного приложения?
10 ответов
ВАЖНО: Прошло много времени с тех пор, как этот ответ был первоначально опубликован, и умные люди придумали более разумные ответы. Проверьте, как я могу найти код обновления для установленного файла 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". Это значение сбрасывается туда.
ПРИМЕЧАНИЕ. Это следует делать только в том случае, если вы уверены, что процесс переустановки реализован правильно, и это не нарушит установленное приложение.
Чтобы вернуть результаты, требуется некоторое время, легко много десятков секунд, но 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 во время установки приложений, вам следует избегать запуска самовосстановления, поскольку они возвращают некоторые важные настройки.
- Примечание. При этом будет найден код вашего продукта, а затем можно найти обновление, о котором упоминал Ян. Я обычно, однако, просто использую либо "InstEd It!" или "Orca", затем перейдите к таблице свойств MSI, и она перечисляет их прямо вверху.
Если у вас есть установщик msi, откройте его с помощью Orca (инструмент от Microsoft), таблицы свойств (строки UpgradeCode, ProductCode, версия продукта и т. Д.) Или таблицы Upgrade column Upgrade Code.
Попробуйте найти инстлер через реестр: 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" }
Вы можете использовать методы MsiEnumProductsEx и MsiGetProductInfoEx, чтобы перечислить все установленные приложения в вашей системе и сопоставить данные с вашим приложением.
В предварительной сборке Windows 10 с PowerShell 5 я вижу, что вы можете сделать:
$info = Get-Package -Name YourInstalledProduct
$info.Metadata["ProductCode"]
Не знаком с даже не уверен, что все продукты имеют UpgradeCode, но согласно этому посту вам нужно искать UpgradeCode из этого пути реестра:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes
К сожалению, значения ключа реестра - это код продукта, а ключи реестра - код обновления.
Если кто-то хочет получить код установленного пакета приложения, просто выполните команду ниже с именем вашего приложения в командной строке. Вы получите код продукта вместе с кодом пакета.
wmic product where "Name like '%YOUR_APPLICATION_NAME%'" get IdentifyingNumber, PackageCode
Другой способ - слишком сложный обходной путь, который не требует переустановки приложения, как требовалось ранее. Это требует, чтобы у вас был доступ к MSI (или setup.exe со встроенным MSI).
Если у вас установлена Visual Studio 2012 (или, возможно, другие выпуски) и установлена бесплатная версия "InstallShield LE", вы можете создать новый проект установки с помощью InstallShield.
Один из параметров конфигурации в шаге "Организация вашей установки" называется "Пути обновления". Откройте свойства путей обновления, и на левой панели щелкните правой кнопкой мыши "Пути обновления" и выберите "Новый путь обновления"... теперь перейдите к msi (или setup.exe, содержащему msi) и нажмите "открыть". Код обновления будет указан для вас на странице настроек в правой панели, которую вы должны увидеть.
Если у вас нет MSI и вам нужен код обновления, а не код продукта, тогда ответ здесь: Как я могу найти код обновления для установленного приложения в C#?
Не нашел способа узнать код UpgradeCode из установленного приложения, прежде чем увидел обходное решение Yan Sklyarenko (в настоящее время) выше. Но если вы или кто-либо другой найдет способ узнать (по крайней мере) оба 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