web-dev-qa-db-ja.com

Windows 7にインストールされたアプリケーションのUpgradeCodeとProductCodeを見つける方法

マシンにアプリケーションがインストールされています。ソースコードもありますが、どういうわけかこのアプリケーションのProductCodeとUpgradeCodeが変更されました。

次に、このインストール済みアプリケーションのUpgradeCodeとProductCodeを取得します。これには何らかのツールが必要だと思います。

インストールされたアプリケーションのUpgradeCodeとProductCodeを取得する方法を教えてもらえますか?

37
codeLover

[〜#〜] important [〜#〜]この回答が最初に投稿されてからしばらく経ち、スマート人々は賢明な答えを思いついた。 インストールされたMSIファイルのアップグレードコードを見つけるにはどうすればよいですか? @ SteinÅsmulから提供されます。しっかりとした包括的なアプローチが必要な場合。


別の方法があります(ツールは必要ありません):

  • システムレジストリを開き、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」を検索します。この値はそこにダンプされます。

注:再インストールフローが正しく実装され、インストールされたアプリケーションが破損しないことが確実な場合にのみ、これを行う必要があります。

66
Yan Sklyarenko

結果を返すには数十秒かかりますが、 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
18
matt wilkie

使用しているすべての人へ:

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のプロパティテーブルに移動し、最上部にリストされます。
10
xBr0k3n

MsiインストーラーをOrca(Microsoftのツール)、テーブルプロパティ(UpgradeCode、ProductCode、製品バージョンなどの行)またはテーブルアップグレード列のアップグレードコードで開きます。

レジストリを使用して、instllerを見つけてください:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall必要なサブキーを見つけ、値InstallSourceを監視します。たぶん、MSIファイルを見つけることができるでしょう。

8
vinogradniy

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
codekaizen

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です。

3
batbaatar

MsiEnumProductsEx および MsiGetProductInfoEx メソッドを使用して、システムにインストールされているすべてのアプリケーションを列挙し、データをアプリケーションに一致させることができます。

2
Ciprian

以前の回避策が必要であったため、アプリケーションを再インストールする必要がないという利点がある、あまりにも複雑な回避策。これには、msi(またはmsiが埋め込まれたsetup.exe)へのアクセス権が必要です。

Visual Studio 2012(または他のエディション)があり、無料の「InstallShield LE」をインストールする場合、InstallShieldを使用して新しいセットアッププロジェクトを作成できます。

「セットアップの整理」ステップの構成オプションの1つは「パスのアップグレード」と呼ばれます。アップグレードパスのプロパティを開き、左ペインで[アップグレードパス]を右クリックし、[新しいアップグレードパス]を選択します。..msi(またはmsiを含むsetup.exe)を参照し、[開く]をクリックします。アップグレードコードは、右側のペインの設定ページに表示されます。

0
TCC

Yan Sklyarenko回避策 (現在)を見る前に、インストールされたアプリケーションからUpgradeCodeを見つける方法を見つけられませんでした。ただし、MSIからUpgradeCodeとProductCodeの両方を(少なくとも)見つける方法を見つけられる場合は、先に進んでください。

http://www.dwarfsoft.com/blog/2010/06/22/msi-package-code-fun/ から、許可するように変更(wscript.exe)MSIごとに1つのポップアップボックス(1023文字で切り捨てられた、wscript.echo制限); GUIおよびCLIからMSIを入力できます。基本的な人間の入力の検証。デバッグコード( '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.aspxhttp://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

0
user66001

Msiがなく、製品コードではなくアップグレードコードが必要な場合、答えはこちらです: C#でインストールされたアプリケーションのアップグレードコードを見つけるにはどうすればよいですか?

0
krispy