如何在Windows 7中查找已安装应用程序的UpgradeCode和ProductCode

时间:2011-02-21 06:53:06

标签: automation wix installer windows-installer msiexec

我的计算机上安装了一个应用程序。我也有它的源代码,但不知何故,这个应用程序的ProductCode和UpgradeCode已经改变。

现在我想获得此已安装应用程序的UpgradeCode和ProductCode。我觉得必须有一些工具。

有人可以告诉我如何获取已安装应用程序的UpgradeCode和ProductCode吗?

11 个答案:

答案 0 :(得分:65)


重要自从这个答案最初发布以来已经有一段时间了,聪明人提出了更明智的答案。如果您需要一个可靠而全面的方法,请查看@SteinÅsmul的How can I find the Upgrade Code for an installed MSI file?


这是另一种方式(你不需要任何工具):

  • 打开系统注册表并搜索HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall密钥(如果它是64位计算机上的32位安装程序,则可能位于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”。这个值被转储到那里。

注意:只有在确定正确实施重新安装流程并且这不会破坏已安装的应用程序时,才应执行此操作。

答案 1 :(得分:18)

返回结果需要一些时间,很容易就是几十秒,但是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,请参阅including uninstall

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

答案 2 :(得分:10)

给每个人使用:

Get-WMIObject win32_product

您应该知道,这将在PC上安装的每个MSI应用程序上进行自我修复。如果您要检查eventvwr,它会说已完成重新配置每个产品。

在这种情况下,我使用以下(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>*" }

现在,如果您输入:

$WantedApp.PSChildName

您将获得以下内容:

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

如果您的组织在安装应用程序时使用了大量的MST,那么您可能希望避免运行自我修复包装,而是还原一些关键设置。

  • 注意 - 这将找到您的产品代码,然后可以找到Yan提到的升级。不过,我通常只使用'InstEd It!'或者“Orca”然后转到MSI的Property表,它将它们列在顶部。

答案 3 :(得分:8)

如果您有msi安装程序使用Orca(Microsoft的工具),表属性(行UpgradeCode,ProductCode,产品版本等)或表升级列升级代码打开它。

尝试通过注册表找到instller:HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall查找所需的子项并观察值InstallSource。也许在你能够找到MSI文件的过程中。

答案 4 :(得分:6)

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

答案 5 :(得分:3)

在使用 PowerShell 5 的Windows 10预览版中,我可以看到您可以执行以下操作:

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

不熟悉甚至不确定所有产品是否都有UpgradeCode,但根据这篇文章您需要从此注册表路径中搜索UpgradeCode:

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

不幸的是,注册表项值是ProductCode,注册表项是UpgradeCode。

答案 6 :(得分:2)

您可以使用MsiEnumProductsExMsiGetProductInfoEx方法枚举系统中所有已安装的应用程序,并将数据与您的应用程序相匹配

答案 7 :(得分:1)

如果任何人想获取已安装的应用程序软件包代码,只需在命令提示符下以您的应用程序名称执行以下命令。您将获得产品代码和包装代码。

wmic product where "Name like '%YOUR_APPLICATION_NAME%'" get IdentifyingNumber, PackageCode

答案 8 :(得分:0)

在上面看到Yan Sklyarenkoworkaround(当前)之前,没有找到任何方法从已安装的应用程序中找到UpgradeCode。但是,如果您/其他人找到了一种从MSI中找到(至少)UpgradeCode和ProductCode的方法,请继续阅读。

http://www.dwarfsoft.com/blog/2010/06/22/msi-package-code-fun/,修改为允许(当使用wscript.exe启动时)每个MSI一个弹出框信息(由于wscript.echo限制,在1023个字符处发送);能够从GUI和CLI输入MSI;一些基本的人类输入验证;删除了调试代码('Set oDatabase)和1个bug修复(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

答案 9 :(得分:0)

另一种方法 - 过于复杂的解决方法,无需像以前的解决方法那样重新安装应用程序。这要求您可以访问msi(或嵌入了msi的setup.exe)。

如果您有Visual Studio 2012(或可能是其他版本)并安装免费的“InstallShield LE”,那么您可以使用InstallShield创建一个新的安装项目。

“组织您的设置”步骤中的一个配置选项称为“升级路径”。打开升级路径的属性,在左窗格中右键单击“升级路径”并选择“新升级路径”...现在浏览到msi(或包含msi的setup.exe),然后单击“打开”。将在右侧窗格的设置页面中为您填充升级代码,您现在应该看到它。

答案 10 :(得分:0)

如果您没有msi并且需要升级代码而不是产品代码,那么答案就在这里:How can I find the upgrade code for an installed application in C#?