インストールされたMSIセットアップのプロダクトGUIDを見つけるにはどうすればよいですか?

パッチ適用、アンインストールhow-to uninstall)などのメンテナンスを行うため、また監査目的のために、インストールされたMSIファイルproduct GUID**を見つける必要があるのですが、どうすればいいですか?

ソリューション

アップグレードコード**の取得について。

https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-for-an-installed-msi-file/46637095#46637095

ショートバージョン

以下の情報は、時間の経過とともにかなり増えてきており、少し凝りすぎている可能性があります。プロダクトコードを素早く取得する方法(4つのアプローチ)。 1.Powershell "ワンライナー"を使用する。

スクリーンショットとステップバイステップは下にスクロールしてください。免責事項は以下の通りです。 - あなたが尋ねる人に応じて、マイナーまたは中程度のリスク。私にとってはOKです。このオプションによって引き起こされた自己修復は、一般的にキャンセルすることが可能であるべきです。パッケージの整合性チェックは、イベントログにノイズを加えますが。注意事項!IdentifyingNumber` ProductCode (WMI peculiarity)です。

get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

Powershellのクイックスタート: Windows key を押しながら R をタップして "powershell" を入力して Enter Windows SDKです。Orca-x86_ja-us.msi`** - で検索してみてください。

Program Files (x86)` で、MSIが見つかればインストールします。

そして、その下に、"有機的に成長"した元の答えがあり、多くの詳細があります。 もし、この作業が必要であれば、以下の "Uninstall MSI Packages" のセクションを参照してください。

プロダクトコードの取得

UPDATE:アップグレードコードも必要な場合は、こちらの回答をご確認ください。 https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-for-an-installed-msi-file/46637095#46637095** (関連する製品コード、アップグレードコード、製品名を検索します) 以下のようなテーブルを出力します。)

PowerShellを使用できない場合、以下の「代替ツール」を参照してください。

  • アンインストールするには? 以下の「"MSIパッケージのアンインストール」のセクションを参照してください。 PowerShellを起動し(Windowsキーを押しながらRをタップし、Windowsキーを離し、"powershell"と入力しOKを押す)、以下のコマンドを実行すると、インストール済みのMSIパッケージの製品コードローカルキャッシュパッケージパス*製品名**(名前が切り捨てられないようPowerShellウィンドウを最大化します)が一覧に表示されます。 このコマンドラインを実行する前に、以下の免責事項をお読みください (危険なことは何もありませんが、いくつかの潜在的な迷惑があります)。セクション3の「代替ツール」では、VBScriptを使用してWMI以外の方法で同じ情報を取得する方法を示しています。パッケージをアンインストールする場合、以下のセクションに msiexec.exe のコマンドラインの例があります。
get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

出力はこのようなものになるはずです。 画像の説明を入力してください]7。 注意!** 不思議なことに、WMIではquot;ProductCode"quot;IdentifyingNumber"と呼ばれています。つまり、言い換えれば、上の図では、IdentifyingNumberはProductCodeであるということです。 多くのリモート コンピュータに対してこのクエリをリモートで実行する必要がある場合*、以下の "Retrieve Product Codes From A Remote Computer*" セクションを参照してください。

DISCLAIMER (重要です。コマンドを実行する前にお読みください!):マイクロソフトの奇妙な設計により、Win32_ProductへのWMI呼び出しは、すべて、そのようなものではありません。 (以下のPowerShellコマンドのように)このコマンドを実行すると、検証のトリガーとなります。 パッケージエステート。かなり遅い*ことに加え、まれに以下のようなことが起こります。 MSIの自己修復の引き金となります。これは、小さなパッケージであったり、何か Visual Studioのような巨大なものです。ほとんどの場合、このようなことは起こりませんが リスクはあります。重要なイベントの直前にこのコマンドを実行しないでください。 この方法は決して危険ではありません(読み取り専用です)が、次のような可能性があります。 ごくまれに修復に時間がかかることがあります。 自己修復も同様に、問題のパッケージによって積極的に阻止されない限り、Win32_Productを呼び出すと再開されます。 また、自己修復を終了させるまで、この状態が続きます(終了させても続く場合もあります:https://stackoverflow.com/questions/5501028/how-can-i-determine-what-causes-repeated-windows-installer-self-repair/6066263#6066263)。 ということです。 あと、一応記録しておきます。[また、Win32_Productクラスに対するWMIクエリが原因であることも分かっています(個人的には、このような現象は見たことがありません)。これは、上で提案したPowershellコマンドとは直接関係なく、WIMクラスWin32_Productの一般的な使用という文脈です。 また、(テーブルの代わりに)リスト形式で出力を取得することができます。

get-wmiobject -class Win32_Product

この場合、出力はこのようになります。 画像の説明を入力してください]9

リモートコンピュータからプロダクトコードを取得する

理論的には、コマンド自体の一部として、リモートコンピューター名を指定すればよいはずです。以下は、上記と同じコマンドをマシン "RemoteMachine"で実行するように設定したものです (ComputerName RemoteMachine セクションが追加されています)。

get-wmiobject Win32_Product -ComputerName RemoteMachine | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize

適切なドメインでドメイン管理者権限で実行している場合、この方法は有効かもしれません。ワークグループ環境(スモールオフィス/ホームネットワーク)では、おそらくWMIコールに直接ユーザー認証情報を追加しないと動作しないでしょう。 さらに、WMIでのリモート接続は、(少なくとも)WindowsファイアウォールDCOM設定ユーザーアカウント制御(UAC)(さらにMicrosoft以外の要因、たとえばリアルファイアウォールサードパーティ製ソフトウェアファイアウォール、**各種セキュリティソフトウェア***などの影響を受ける。)うまくいくかどうかは、あなたの正確な設定によります。

  • リモートWMI接続のセットアップ]10
  • PowerShellでWMIにリモート接続する]11UPDATE:リモートWMIの実行に関する広範なセクションは、この回答で見つけることができます:https://stackoverflow.com/questions/46637094/how-can-i-find-the-upgrade-code-for-an-installed-msi-file/46637095#46637095。ワークグループのネットワーク環境では、ファイアウォールルールとレジストリの調整によるUACプロンプトの抑制で動作させることができるようです。セキュリティ上、推奨される変更ではありませんが、私の場合はうまくいきました

    代替ツール

    PowerShellは、.NETフレームワークのインストールが必要です(現在バージョン3.5.1らしい?2017年10月)。また、.NETがインストールされていても、実際のPowerShellアプリケーション自体がマシンから欠落していることもあります。最後に、PowerShellは様々なシステムポリシーや権限によって無効化またはロックされる可能性があると私は思います。 このような場合、プロダクトコードを取得する他の方法をいくつか試してみてください。私がお勧めするのはVBScriptで、高速で柔軟性があります(ただし、特定のマシンではロックされることがありますし、スクリプトはツールを使用するよりも常に少し複雑です)。 1.1. Windowsに組み込まれているWMIツールから始めてみましょう。wbemtest.exe を使用します。

  • Windowsに内蔵されているWMIツールwbemtest.exeを起動します(Windowsキーを押しながらRキーを押し、Windowsキーを離し、"wbemtest"と入力してOKを押します)。
  • 接続]、[OK]の順にクリックし(ネームスペースのデフォルトはrootcimv2)、再度["connect]をクリックします。
  • SELECT IdentifyingNumber,Name,Version FROM Win32_Product`` and click "Use" (or equivalent - the tool will be localized)と入力します。
  • 出力画面のサンプル(切り捨て)。きれいなフォーマットではありませんが、必要なデータを得ることができます。IdentifyingNumber は MSI 製品コード です。 2.次に、WMIExplorer.exe のようなカスタムでよりフル機能の WMI ツールを試してみることができます。
  • Windowsには搭載されていません。しかし、非常に優れたツールです。おすすめです。
  • https://github.com/vinaypamnani/wmie2/releases でご確認ください。
  • ツールを起動し、Connect をクリックし、ROOTCIMV2 をダブルクリックします。
  • Queryタブ**"から、以下のクエリSELECT IdentifyingNumber,Name,Version FROM Win32_Productを入力し、Executeを押してください。
  • スクリーンショットはスキップされます。このアプリケーションは画面の領域を多く必要とします。 3.3. 最後に、VBScript を使って、MSI automation interface (Windows の中核機能で、WMI とは関係ありません) を介して情報にアクセスすることもできます。
  • 以下のスクリプトをコピーして、デスクトップ上の *.vbs ファイルに貼り付け、ダブルクリックで実行してみてください。デスクトップは書き込み可能でなければならないが、他の書き込み可能な場所を使ってもよい。
  • これは素晴らしいVBScriptではありません。エラー処理や完全性よりも、簡潔さが優先されていますが、最小限の複雑さで仕事をこなすはずです。
  • 出力ファイルは、スクリプトを実行したフォルダに作成されます(フォルダは書き込み可能でなければなりません)。出力ファイルの名前は msiinfo.csv です。
  • ファイルをダブルクリックして表計算ソフトで開き、インポート時にデリミタとしてカンマを選択します - または - メモ帳やその他のテキストビューアでファイルを開きます。
  • スプレッドシートで開くと、高度なソート機能が利用できます。
  • このスクリプトは、MSIインストールに関するかなりの量の詳細を表示するように簡単に変更することができます。このデモは、ここで見ることができます。https://stackoverflow.com/questions/28963089/how-to-find-out-which-products-are-installed-newer-product-are-already-install/28971679#28971679
' Retrieve all ProductCodes (with ProductName and ProductVersion)
Set fso = CreateObject("Scripting.FileSystemObject")
Set output = fso.CreateTextFile("msiinfo.csv", True, True)
Set installer = CreateObject("WindowsInstaller.Installer")

On Error Resume Next ' we ignore all errors

For Each product In installer.ProductsEx("", "", 7)
   productcode = product.ProductCode
   name = product.InstallProperty("ProductName")
   version=product.InstallProperty("VersionString")
   output.writeline (productcode & ", " & name & ", " & version)
Next

output.Close

今のところ、これ以上の商品コード取得の汎用的なオプションは思いつきませんので、ご存知の方は追加をお願いします。あまり多くのコメントを追加するよりも、インラインで編集してください。

アプリケーションからこの情報にアクセスすることは可能です。 MSIオートメーションインターフェイス]1(COMベース)または[C++]を呼び出すことによって。 MSIインストーラ関数]14です。また、上記のサンプルのように、PowerShellwbemtest.exeまたはWMIExplorer.exe`` を使って、アプリケーションから WMI クエリを使用することもできます。

MSIパッケージのアンインストール

プロダクトコードを見つけたMSIパッケージをアンインストールしたい場合は、昇格コマンドプロンプトcmd.exeを検索し、右クリックして管理者として実行)を使って以下のように行うことができます。 オプション1ログを取らない基本的な対話式アンインストール (迅速かつ簡単)。

msiexec.exe /x {00000000-0000-0000-0000-00000000000C}

クイックパラメータの説明です。

/X = run uninstall sequence
{00000000-0000-0000-0000-00000000000C} = product code for product to uninstall

また、必要に応じて(冗長)ログを有効にし、サイレントモードで実行することができますので、オプション2へとつながります。 オプション 2:サイレントアンインストールと冗長ロギング (バッチファイルの場合)

msiexec.exe /x {00000000-0000-0000-0000-00000000000C} /QN /L*V "C:\My.log" REBOOT=ReallySuppress

クイックパラメータの説明です。

/X = run uninstall sequence
{00000000-0000-0000-0000-00000000000C} = product code for product to uninstall
/QN = run completely silently
/L*V "C:\My.log"= verbose logging at specified path
REBOOT=ReallySuppress = avoid unexpected, sudden reboot

MSIアンインストールに関する*包括的なリファレンスがここにあります(MSIパッケージをアンインストールする様々な異なる方法):https://stackoverflow.com/questions/450027/uninstalling-an-msi-file-from-the-command-line-without-using-msiexec/1055933#1055933。アンインストールには、たくさんの異なる方法がありますバッチファイルを書いている場合は、上記のリンク先の回答のセクション3を見て、いくつかの一般的で標準的なアンインストールコマンドラインのバリエーションを確認してください。 また、msiexec.exe (command line options) (MSDN による msiexec.exe のコマンドラインの概要) への簡単なリンクがあります。そして、Technet版も同様に。

その他のMSIプロパティ/情報(例:アップグレードコード)の取得

UPDATE: MSIファイル内のコードを手動で探す代わりに、インストールされたパッケージのアップグレードコードを見つける方法についての新しい回答]17をご覧ください。についてです。 インストール済みのパッケージは、この方がずっと信頼できます。もしパッケージが インストールされている場合でも、MSIファイル(またはソースファイル)を見る必要があります。 MSI のコンパイルに使用された >)から、アップグレードコードを見つけることができます。以下の古いセクションに残しておきます。 アップグレードコードやその他のMSIのプロパティを取得したい場合は、上の画像で"LocalPackage"で指定した場所にある製品のキャッシュインストールMSIを開いてください(みたいなものです。C:\WINDOWSInstaller︵50c080ae.msi` - hex file name, unique on each system).それから、quot;Property table" でUpgradeCodeを探します(UpgradeCodeは変換で再定義されることがあります - 正しい値を得るには、システムからプログラムでコードを取得する必要があります - このためのスクリプトを近日中に提供します。ただし、キャッシュされたMSIで見つかったUpgradeCodeは一般的に正しいです)。 キャッシュされたMSIファイルを開くには、Orca または他のパッケージングツールを使用します。ここでは、様々なツール(どれでも構いません)について説明しています。https://stackoverflow.com/questions/1544292/what-installation-product-to-use-installshield-wix-wise-advanced-installer/1546941#1546941。もし、そのようなツールがインストールされていない場合は、[Super Orca]4 を試してみるのが一番早いかもしれません(使い方は簡単ですが、私が広範囲にテストしているわけではありません)。 UPDATE: MSIファイルを見るために使用できる様々な無料の製品に関する情報を含む新しい回答があります: https://stackoverflow.com/questions/48482545/how-can-i-compare-the-content-of-two-or-more-msi-files/48482546#48482546 Visual Studioがインストールされている場合、Program Files (x86)` の下にある Orca-x86_en-us.msi を検索してインストールしてください(これはMicrosoft独自の公式MSIビューアおよびエディタです)。そして、スタートメニューからOrcaを見つけてください。すぐに使えるようになります:-)。技術的には、OrcaはWindows SDK(Visual Studioではない)の一部としてインストールされますが、Windows SDKはVisual Studioのインストール時にバンドルされています。もしあなたがVisual Studioをインストールしていないなら、もしかしたらインストールしている人を知っているかもしれませんね?このMSIを検索してもらい、送信してもらえばよいのです(0.5MBの小さなファイルです)。UPDATE**:MSIと同様にいくつかのCABファイルが必要です。MSIがない場合は、Windows SDKをダウンロードしてください(無料ですが、サイズが大きく、インストールするとPCの速度が低下します)。SDKのどの部分がOrca MSIをインストールするのか、私にはわかりません。もしそうなら、ここに編集して詳細を追加してください。

解説 (6)

インストーラの数が多すぎて、探しているものが簡単に見つからない場合、フィルターを提供して表示名で少し絞り込むためのpowershellを紹介します。

$filter = "*core*sdk*"; (Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall).Name | % { $path = "Registry::$_"; Get-ItemProperty $path } | Where-Object { $_.DisplayName -like $filter } | Select-Object -Property DisplayName, PsChildName
解説 (0)