1. ホーム
  2. powershell

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

2023-07-22 16:37:10

質問

私は 製品GUID に対して インストールされた MSI ファイル のようなメンテナンスを行うために patching , uninstall ( ハウツーアンインストール )、また auditing purposes .

どのように解決するのですか?

<ブロッククオート

以下のような場合 アップグレードコード を検索してください。 インストールされた MSI ファイルのアップグレードコードはどのようにすれば見つけることができますか? ( または、htmlテーブルエクスポートスクリプトを使用します。 - を使用することもできます。)


ショートバージョン

以下の情報は、時間の経過とともにかなり大きくなり、少し凝りすぎている可能性があります。 プロダクトコードを早く取得する方法は? (4つのアプローチ)を紹介します。

1 - Use the Powershell "one-liner"

スクリーンショットとステップバイステップを見るには下にスクロールしてください。 . 免責事項 - あなたが尋ねる人に応じて、マイナーまたは中程度のリスク。私にとってはOKです。どんなことでも 自己修復 が発生した場合、一般にそれをキャンセルすることができます。そのため パッケージの完全性チェック は、イベントログにいくつかのノイズを追加します。 注意 ! IdentifyingNumber その ProductCode (WMIの特有)です。

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

Powershellのクイックスタート : 押さえて Windowsキー をタップ R をタップし、"powershell" と入力し Enter

アップデイト : Alexis Colesがコメントしているように、WMIをスキップしてCOMを経由することができます(より高速です)。

$Installer = New-Object -ComObject WindowsInstaller.Installer; $InstallerProducts = $Installer.ProductsEx("", "", 7); $InstalledProducts = ForEach($Product in $InstallerProducts){[PSCustomObject]@{ProductCode = $Product.ProductCode(); LocalPackage = $Product.InstallProperty("LocalPackage"); VersionString = $Product.InstallProperty("VersionString"); ProductPath = $Product.InstallProperty("ProductName")}} $InstalledProducts

アップグレードコードが必要な場合は、代わりにhtmlエクスポートを使用することができます。 (下のセクション2)

2 - Use VBScript ( github.com上のスクリプト - htmlエクスポートバージョン )

以下の " に記述されています。 代替ツール" (第 3 節) で説明します。 . このオプションは より安全 このオプションは、以下に詳しく説明する理由により、Powershellよりも安全かもしれません。要するに、これは(ずっと) より速い であり、WMI を経由しないので MSI の自己修復をトリガーすることはできません (これは MSI COM API に直接アクセスします)。 しかし、これは Powershell オプションよりも複雑です。 (数行のコード)よりも複雑です。

ヘッドアップ : html版もアップグレードコードを取得します。これは自己修復と過剰なロギングの両方を引き起こす可能性があります。に埋め込まれた警告を参照してください。 スクリプト自体に埋め込まれた警告を参照してください。 . 通常は問題なく実行されますが、完了までにしばらく時間がかかります。

3 - Registry Lookup

レジストリで物事を調べることを誓う人もいます。私は、適切な API (言い換えれば、OS の関数呼び出し) を介して行うのが好きです。API 実装の内部でのみ説明される奇妙な例外が常に存在します。

  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
  • HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
  • HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall

4 - Original MSI File / WiX Source

を見つけることができます。 Product Code の中に Property table を使用することができます (他のプロパティも同様)。しかし、GUID は、インストール時に適用される変換によって上書きされ、製品が登録されている GUID と一致しない可能性があります (上記のアプローチ 1 および 2 は、そのようなまれなシナリオでは Windows で登録されている実際の製品コードを報告します)。

MSI MSI ファイルを表示するツールが必要です。

MSI . ダウンロードできる無料のツールのリストについては、次の回答の下部を参照してください (または、以下のクイック オプションを参照してください)。 2 つ (またはそれ以上) の MSI ファイルのコンテンツを比較するにはどうすればよいですか?

アップデイト : 利便性と 速度の必要性 :-), ダウンロード スーパーオークラ から遅滞なく、大騒ぎすることなく この直接ダウンロードできるホットリンク - をインストールし、MSI を開いて、そのまま プロパティテーブル を探し、その中から ProductCode の行を探します ( 直接ダウンロードできるホットリンクは必ずウイルスチェックをしてください - 明らかに - を使用することができます。 virustotal.com を使用して、アップロードしたものをスキャンするために、何十ものアンチウィルスおよびマルウェア スイートを利用したオンライン スキャンを行うことができます)。

オルカ はマイクロソフト独自のツールで、インストールは ビジュアルスタジオ と その Windows SDK . を検索してみてください。 Orca-x86_en-us.msi - の下に Program Files (x86) で、MSIが見つかればインストールします。

  • 現在のパス : C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86
  • 必要に応じてバージョン番号を変更する

そして、その下に、多くの詳細が有機的に成長したオリジナルの回答があります。

多分、".を参照してください。 MSI パッケージのアンインストール のセクションを参照してください。


製品コードを取得する

アップデイト : も必要な場合は アップグレードコード も必要であれば、この回答を確認してください。 インストールされたMSIファイルのアップグレードコードを見つけるにはどうしたらいいですか? (関連する製品コード、アップグレードコード、および製品名を検索します。 を表形式で出力します)。

  • PowerShellは使えないのですか? 以下の「代替ツール」の項を参照してください。
  • アンインストールをお探しですか? 以下の「MSIパッケージのアンインストール」セクションを参照してください。

起動 パワーシェル ( Windows キーを押しながら R をタップし、Windows キーを離し、"powershell" と入力し、OK を押してください。 ) で、以下のコマンドを実行し、インストールされた MSI パッケージのリストを取得します。 プロダクトコード と共に ローカルキャッシュパッケージパス 製品名 を追加します (名前が切り捨てられないように PowerShell ウィンドウを最大化します)。

このコマンド ラインを実行する前に、以下の免責事項をお読みください (危険なことは何もありませんが、いくつかの潜在的な迷惑があります)。セクション 3 の「代替ツール」では、VBScript を使用して同じ情報を取得する、WMI ではない代替方法を示しています。パッケージをアンインストールする場合は、以下のセクションで msiexec.exe のコマンドラインの例をいくつか紹介しています。

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

この 出力 はこのようなものであるべきです。

注意! なぜか不思議なことに 製品コード として参照されます。 "識別番号" WMIでは . つまり、上の図ではIdentifyingNumberが であり、ProductCodeである。

もし、あなたが このクエリを多くのリモートコンピュータに対してリモートで実行する必要がある場合 を参照してください。 リモートコンピュータから製品コードを取得する のセクションを参照してください。

免責事項 (重要。コマンドを実行する前に読んでください!): Microsoft の奇妙な設計により、WMI 呼び出しが Win32_Product (以下の PowerShell コマンドのような) への WMI 呼び出しは のバリデーションを引き起こします。 パッケージエステート . であることに加え かなり遅い であることに加え、これはまれに MSI の自己修復を引き起こすことがあります。これは小さなパッケージであったり、Visual Studio のような Visual Studio のような巨大なものです。ほとんどの場合、これは発生しませんが しかし、リスクはあります。 このコマンドは重要な会議の直前には実行しないでください。 このコマンドは決して危険ではありませんが (読み取り専用です)、非常に稀なケースで長時間の修復につながる可能性があります。 非常に稀なケースとして、長い修復につながる可能性があります。 (自己修復をキャンセルすることも可能だと思います。 自己修復もキャンセルできると思いますが、問題のパッケージによって積極的に阻止されていない限り、Win32_Product を再び呼び出すと再開されます。 を再度呼び出すと再開され、自己修復を終了させるまで続きます - 終了させても続くことがあります。 Windows Installer の自己修復を繰り返す原因を特定するにはどうすればよいですか? ).

そして、念のため イベント ログが MsiInstaller EventID 1035 のエントリでいっぱいになったと報告する人がいます。 (コード チーフの回答を参照) - 明らかに Win32_Product クラスへの WMI クエリが原因です (個人的には、これを見たことがありません)。これは ではなく WIM クラス Win32_Product の一般的な使用というコンテキストにあります。

また、(テーブルの代わりに)リスト形式で出力を得ることができます。

get-wmiobject -class Win32_Product

この場合、出力はこのようになります。


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

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

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

これは、適切なドメイン上でドメイン管理者権限で実行している場合に動作するかもしれません。ワークグループ環境 (小規模オフィス/ホーム ネットワーク) では、おそらく動作させるには、ユーザー資格情報を WMI 呼び出しに直接追加する必要があります。

さらに、WMI のリモート接続は (少なくとも) Windows ファイアウォール , DCOM 設定 そして ユーザーアカウント制御 (UAC) (さらに、マイクロソフト以外の要素 - たとえば リアルファイアウォール , サードパーティソフトウェアファイアウォール , 各種セキュリティソフト などなど...)。それがうまくいくかどうかは、あなたの正確な設定によります。

アップデイト : リモートWMIの実行に関する広範なセクションは、この回答で見つけることができます。 インストールされた MSI ファイルのアップグレード コードはどのように見つけることができますか? . ファイアウォール ルールとレジストリの調整による UAC プロンプトの抑制により、ワークグループ ネットワーク環境で動作させることができるようです。セキュリティ的に推奨される変更ではありませんが、私の場合はうまくいきました。


代替ツール

PowerShell を必要とします。 .NET フレームワーク がインストールされている必要があります(現在はバージョン3.5.1のようです? 2017年10月)。実際のPowerShellアプリケーション自体は が欠落していることもあります。 をインストールする必要があります。最後に、私はPowerShellは を無効にしたりロックしたりできます。 を無効にしたり、ロックしたりすることができます。

このような場合、製品コードを取得するための他の方法をいくつか試してみることができます。私が推奨する代替方法は VBScript - で、これは高速で柔軟性があります (ただし、特定のマシンではロックされることがあり、スクリプトはツールを使用するよりも常に少し複雑です)。

  1. で始めてみましょう。 Windows 組み込みの WMI ツール : wbemtest.exe .
  • 起動 wbemtest.exe ( Windows キーを押しながら R をタップし、Windows キーを離した状態で "wbemtest.exe" と入力し、OK を押します。 ).
  • クリック 接続する をクリックし、次に をクリックします。 OK (namespace defaults to rootcimv2) をクリックし、" をクリックします。 接続 をもう一度クリックします。
  • "をクリックします。 クエリ をクリックし、次のように入力します。 WQLコマンド (SQLフレーバー)を入力します。 SELECT IdentifyingNumber,Name,Version FROM Win32_Product をクリックし、"Use" (または同等のもの - ツールはローカライズされます)をクリックします。
  • サンプル出力スクリーンショット (切り捨て)。最も美しいフォーマットではありませんが、必要なデータを得ることができます。 IdentifyingNumber は MSI 製品コードです。 :

  1. 次に、次のようなカスタムでよりフル機能の WMI ツールを試してみることができます。 WMIExplorer.exe
  • これは Windows には含まれていません。しかし、非常に優れたツールです。お勧めします。
  • でチェックしてみてください。 https://github.com/vinaypamnani/wmie2/releases
  • ツールを起動し、[Connect]をクリックし、ROOT⇄CIMV2をダブルクリックします。
  • から、" クエリ] タブ "で、次のクエリを入力します。 SELECT IdentifyingNumber,Name,Version FROM Win32_Product と入力し、[Execute]を押します。
  • スクリーンショットはスキップされます。このアプリケーションは画面の領域を多く必要とします。
  1. 最後に VBScript を使って情報にアクセスすることができます。 MSIオートメーションインターフェイス (Windows の中核機能であり WMI とは関係ありません。 ).
  • 以下のスクリプトをコピーし、デスクトップ上の *.vbs ファイルに貼り付けて、ダブルクリックで実行してみてください。デスクトップは書き込み可能でなければなりませんが、他の書き込み可能な場所を使用することもできます。
  • これは素晴らしい VBScript ではありません。 Tersenessが好まれています しかし、これは最小限の複雑さで仕事をするはずです。
  • 出力ファイルはスクリプトを実行したフォルダに作成されます ( フォルダは書き込み可能でなければなりません。 ). 出力ファイルの名前は msiinfo.csv .
  • ファイルをダブルクリックして表計算アプリケーションで開き、インポート時に区切り記号としてカンマを選択します - または - メモ帳や任意のテキスト ビューアーでファイルを開きます。
  • スプレッドシートで開くと、高度なソート機能が使用できます。
  • このスクリプトは簡単に適応して を表示させることができます。 . このデモはここで見ることができます。 どの製品がインストールされているかを調べる方法 - 新しい製品は、すでにインストールされているMSIウィンドウズ .
' 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オートメーションインターフェイス (COM ベース) または C++ MSI インストーラ機能 (Win32 API) を使用することもできます。あるいは、上記のサンプルで行っているように、アプリケーション内から WMI クエリを使用することもできます。 PowerShell , wbemtest.exe または WMIExplorer.exe .


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 パッケージをアンインストールするさまざまな方法)。 msiexec を使用せずにコマンドラインから MSI ファイルをアンインストールする . アンインストールするためのさまざまな方法が山ほどあります。

バッチ ファイルを記述する場合は、上記のリンク先の回答のセクション 3 で、いくつかの一般的で標準的なアンインストール コマンド ラインのバリエーションをご覧ください。

また、簡単なリンクとして msiexec.exe (コマンド ライン オプション) (MSDN による msiexec.exe のコマンドラインの概要) を参照してください。また テクネット版 にも対応しています。


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

アップデイト : 以下をご覧ください。 インストールされたパッケージのアップグレードコードを見つける方法についての新しい回答です。 を追加することで、MSI ファイルで手動でコードを探す代わりに インストールされたパッケージでは インストールされたパッケージでは、この方法がより信頼できます。パッケージがインストールされていない場合 パッケージがインストールされていない場合は、MSI ファイル (または MSI をコンパイルするために使用されたソースファイル) を調べて、アップグレード コードを見つける必要があります。 を参照し、アップグレードコードを見つける必要があります。以下の古いセクションを参照してください。

を取得したい場合 アップグレードコード または その他のMSIプロパティ で指定された場所から、その製品のキャッシュされたインストールMSIを開くことができます。 ローカルパッケージ "で指定された場所から、その製品のインストール用MSIを開くことができます。 C:\WINDOWS\Installer\50c080ae.msi - これは16進のファイル名で、各システムでユニークです)。そして、あなたは".を見ます。 プロパティ・テーブル アップグレードコードを探します(アップグレードコードはトランスフォームで再定義することができます - 正しい値を得ることを確認するには、システムからプログラム的にコードを取得する必要があります。しかし キャッシュされた MSI で見つかった UpgradeCode は一般に正しいものです。 ).

キャッシュされた MSI ファイルを開くには オルカ または他のパッケージングツールです。ここでは、さまざまなツールについて説明します(どれでもかまいません)。 どのようなインストール製品を使用するか?InstallShield、WiX、Wise、Advanced Installer、など。 . そのようなツールがインストールされていない場合、最も手っ取り早い方法は スーパーオルカ を試してみるのが一番早いかもしれません (これは簡単に使えますが、私が広範囲にテストしたわけではありません)。

アップデイト : MSI ファイルを表示するために使用できる様々な無料製品に関する情報を含む新しい回答です。 2 つ (またはそれ以上) の MSI ファイルの内容を比較するにはどうすればよいですか?

Visual Studioがインストールされている場合 を検索してみてください。 Orca-x86_en-us.msi - で検索してください。 Program Files (x86) - をクリックし、インストールします(これはマイクロソフト独自の公式MSIビューア兼エディタです)。そして、スタートメニューでOrcaを見つけます。あっという間に時間が経ちます :-)。技術的には、OrcaはWindows SDKの一部としてインストールされますが(Visual Studioではありません)、Windows SDKはVisual Studioのインストールにバンドルされています。 Visual Studioがインストールされていない場合 もしVisual Studioがインストールされていないなら、誰か知っている人がいるかもしれません。このMSIを検索してもらい、送ってもらえばよいのです (小さな半MBのファイルです) - 数秒かかるはずです。 アップデイト : MSIと同様にいくつかのCABファイルが必要です - これらはMSIがあるのと同じフォルダで見つかります。もしそうでなければ、いつでも Windows SDK (をダウンロードすることができます(無料ですが、サイズが大きく、インストールするものすべてがPCの速度を低下させます)。SDKのどの部分がOrca MSIをインストールするのかがわかりません。もしご存知でしたら、編集してここに詳細を追加してください。



類似のトピック (参照と簡単なアクセスのため - このリストを整理する必要があります)。