マシンにアプリケーションがインストールされています。ソースコードもありますが、どういうわけかこのアプリケーションのProductCodeとUpgradeCodeが変更されました。
次に、このインストール済みアプリケーションのUpgradeCodeとProductCodeを取得します。これには何らかのツールが必要だと思います。
インストールされたアプリケーションのUpgradeCodeとProductCodeを取得する方法を教えてもらえますか?
[〜#〜] important [〜#〜]:この回答が最初に投稿されてからしばらく経ち、スマート人々は賢明な答えを思いついた。 インストールされたMSIファイルのアップグレードコードを見つけるにはどうすればよいですか? @ SteinÅsmulから提供されます。しっかりとした包括的なアプローチが必要な場合。
別の方法があります(ツールは必要ありません):
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」を検索します。この値はそこにダンプされます。
注:再インストールフローが正しく実装され、インストールされたアプリケーションが破損しないことが確実な場合にのみ、これを行う必要があります。
結果を返すには数十秒かかりますが、 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
使用しているすべての人へ:
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の負荷を使用する場合、いくつかの重要な設定を元に戻すため、自己修復の実行を避けたいでしょう。
MsiインストーラーをOrca(Microsoftのツール)、テーブルプロパティ(UpgradeCode、ProductCode、製品バージョンなどの行)またはテーブルアップグレード列のアップグレードコードで開きます。
レジストリを使用して、instllerを見つけてください: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" }
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です。
MsiEnumProductsEx および MsiGetProductInfoEx メソッドを使用して、システムにインストールされているすべてのアプリケーションを列挙し、データをアプリケーションに一致させることができます。
以前の回避策が必要であったため、アプリケーションを再インストールする必要がないという利点がある、あまりにも複雑な回避策。これには、msi(またはmsiが埋め込まれたsetup.exe)へのアクセス権が必要です。
Visual Studio 2012(または他のエディション)があり、無料の「InstallShield LE」をインストールする場合、InstallShieldを使用して新しいセットアッププロジェクトを作成できます。
「セットアップの整理」ステップの構成オプションの1つは「パスのアップグレード」と呼ばれます。アップグレードパスのプロパティを開き、左ペインで[アップグレードパス]を右クリックし、[新しいアップグレードパス]を選択します。..msi(またはmsiを含むsetup.exe)を参照し、[開く]をクリックします。アップグレードコードは、右側のペインの設定ページに表示されます。
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
Msiがなく、製品コードではなくアップグレードコードが必要な場合、答えはこちらです: C#でインストールされたアプリケーションのアップグレードコードを見つけるにはどうすればよいですか?