我的计算机上安装了一个应用程序。我也有它的源代码,但不知何故,这个应用程序的ProductCode和UpgradeCode已经改变。
现在我想获得此已安装应用程序的UpgradeCode和ProductCode。我觉得必须有一些工具。
有人可以告诉我如何获取已安装应用程序的UpgradeCode和ProductCode吗?
答案 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是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,那么您可能希望避免运行自我修复包装,而是还原一些关键设置。
答案 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)
您可以使用MsiEnumProductsEx和MsiGetProductInfoEx方法枚举系统中所有已安装的应用程序,并将数据与您的应用程序相匹配
答案 7 :(得分:1)
如果任何人想获取已安装的应用程序软件包代码,只需在命令提示符下以您的应用程序名称执行以下命令。您将获得产品代码和包装代码。
wmic product where "Name like '%YOUR_APPLICATION_NAME%'" get IdentifyingNumber, PackageCode
答案 8 :(得分:0)
在上面看到Yan Sklyarenko的workaround(当前)之前,没有找到任何方法从已安装的应用程序中找到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#?