Powershell-インストールされているMSIセットアップの製品GUIDを確認して検索する
このセクションを完全にロック解除するには、ログインする必要があります
製品コードは、アプリケーションまたは製品リリースを識別する一意のGUIDです。
また、ProductCodeを使用して、機能の状態および製品の状態を照会できます。 たとえば、インストーラAPI”MsiQueryFeatureStateEx()”と”MsiQueryProductState()”などです。
次の四つのアプローチは、インストールされているMSIパッケージのGUIDを(リモートで)検索して取得するためのいくつかの方法を与えることができます。
Powershell”one-liner”
このオプ トリガーされたパッケージの整合性チェックは、いくつかのイベントログ”ノイズ”を追加します。 を使用しています。これは、
get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize
Powershellのクイックスタート: windowsキーを押したまま、rをタップし、「powershell」と入力してEnterキーを押します。
VBScriptを使用
このオプションは、以下で詳細に説明する理由からPowershellよりも安全です。
本質的には(はるかに)高速であり、WMIを経由しないため、MSI自己修復をトリガーすることはできません(MSI COM APIに直接アクセスします-ブリスター速度で)。 ただし、Powershellオプション(数行のコード)よりも複雑です。
VBScriptを試して、MSI自動化インターフェイス(Windowsのコア機能-WMIとは無関係)を介して情報にアクセスできます。
- 以下のスクリプトをコピーして*に貼り付けます。デスクトップ上のvbsファイルをダブルクリックして実行してみてください。 デスクトップは書き込み可能であるか、他の書き込み可能な場所を使用できる必要があります。
- これはVBScriptのサンプルです。 エラー処理と完全性よりも簡潔さが優先されていますが、複雑さを最小限に抑えて仕事をする必要があります。
- 出力ファイルは、スクリプトを実行したフォルダに作成されます(フォルダは書き込み可能でなければなりません)。 出力ファイルはmsiinfoと呼ばれます。——-
- ファイルをダブルクリックしてスプレッドシートアプリケーションで開き、インポート時に区切り文字としてコンマを選択します。 スプレッドシートで開くと、高度なソート機能が可能になります。
- このスクリプトは、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 errorsFor Each product In installer.ProductsEx("", "", 7) productcode = product.ProductCode name = product.InstallProperty("ProductName") version=product.InstallProperty("VersionString") output.writeline (productcode & ", " & name & ", " & version)Nextoutput.Close
レジストリ検索
また、このベースキーからレジストリを熟読することによって、製品コードを見つけることができます:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall。
F3キーを押して、製品名を検索します。 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstallキーの下にある可能性があります。
次のレジストリキーは、MSIパッケージのGuidを検索および検索する一般的な場所です:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\UninstallHKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\UninstallHKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall
元のMSIファイル
製品コードは、MSIファイル(およびその他のプロパティ)のプロパティテーブルにあります。 ただし、インストール時に適用された変換によってGUIDが上書きされることはまれであり、製品が登録されているGUIDと一致しない可能性があります(上のア
MSIファイルを表示するにはツールが必要です。 ダウンロードできる無料ツールのリストについては、次の回答の下部を参照してください(または以下のクイックオプションを参照してください)。
利便性とスピードの必要性のために、あなたはこの直接から遅滞や大騒ぎせずにSuperOrcaをダウンロードすることができます-ダウンロードhotlink-ツールは仕事を終らせるのに十分です-インストール、MSIを開き、プロパティテーブルにまっすぐに行き、ProductCode行を見つけます(常に直接ウイルスチェックしてください-ダウンロードhotlink-明らかに-あなたはそれを使用することができますvirustotal.com これを行うには-あなたがアップロードしたものをスキャンするために、アンチウイルスやマルウェアのスイートの数十を利用したオンライ
もう一つ、オリジナルのツールOrcaはMicrosoft独自のツールであり、Visual StudioとWindows SDKとともにインストールされています。 Orca-x86_en-usを検索してみてください。msi、Program Files(x86)の下にあり、見つかった場合はMSIをインストールします。
製品コードの取得
Powershellを起動し(Windowsキーを押したままRをタップし、Windowsキーを離し、”powershell”と入力してOKを押します)、以下のコマンドを実行して、インストールされているMSIパ
このコマンドラインを実行する前に、以下の免責事項をお読みください(危険なものは何もなく、潜在的な迷惑行為だけです)。 パッケージをアンインストールしようとしている場合は、いくつかのサンプルmsiexecと以下のセクションがあります。exeコマンドライン:
get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name, LocalPackage -AutoSize
出力は次のようになります:
の製品GUIDを確認して見つけます何らかの奇妙な理由で、Wmiでは「ProductCode」が「IdentifyingNumber」と呼ばれています。 つまり、上の写真では、IdentifyingNumberはProductCodeです。
奇妙なMicrosoftの設計により、Win32_Product(以下のPowerShellコマンドのような)へのwmi呼び出しは、パッケージエステートの検証をトリガーします。 非常に遅いことに加えて、これはまれにMSIの自己修復を引き起こす可能性があります。 これは、小さなパッケージやVisual Studioのような巨大なものにすることができます。 ほとんどの場合、これは起こりませんが、リスクがあります。
重要な会議の直前にこのコマンドを実行しないでください、それは危険ではありません(読み取り専用クエリです)が、非常にまれなケースでは長い修
また、(テーブルの代わりに)リスト形式で出力を取得することもできます):
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)の影響を受けます(加えて、追加の物理または仮想ファ). それが動作するかどうかは、通常、あなたの正確な設定に依存します。
Powershell
PowerShellは.NET frameworkをインストールする必要がありますが、最新のほとんどのOs(Windows ServerおよびWindowsプラットフォームでは、Powershellが既に含まれており、利用可能です)。 NETがインストールされていても、実際のPowerShellアプリケーション自体がマシンから欠落している可能性があります。 最後に、PowerShellは、さまざまなシステムポリシーと権限によって無効またはロックされる可能性があります。
このような場合は、製品コードを取得するためにいくつかの他の方法を試すことができます。 これは高速で柔軟性があります(ただし、特定のマシンでロックすることもでき、スクリプトは常にツールを使用するよりも少し複雑です)。
まず、wmiコンポーネントと機能のテストに通常使用される組み込みのWindows WMIツールwbemtestから始めましょう。exe”を起動します。
- wbemtestを起動します。exe(Windowsキーを押したまま、Rをタップし、Windowsキーを離し、”wbemtest”と入力します。exe”を押してOKを押します)。
- “接続”をクリックし、”OK”(名前空間のデフォルトはroot\cimv2)をクリックし、再び”接続”をクリックします。
- “クエリ”をクリックし、このWQLコマンド(SQLフレーバー)を入力します:Win32_ProductからIdentifyingNumber、Name、Versionを選択します。
- “使用”をクリックします(または同等の-ツールがローカライズされます)。
サンプル出力スクリーンショットは以下のとおりです。 素敵な書式設定ではありませんが、必要なデータを取得できます。 IdentifyingNumberはMSI製品コードです:
の製品GUIDを確認して検索します次に、WMIExplorerなどのカスタムのよりフル機能のWMIツールを試すことができます。exe”を起動します。
- これはWindowsには含まれません。 しかし、それは非常に良いツールです。
- チェックアウト:https://github.com/vinaypamnani/wmie2/releases。
- ツールを起動し、接続をクリックし、ROOT\CIMV2をダブルクリックします
- “クエリタブ”から、次のクエリを入力しますWin32_ProductからIdentifyingNumber、Name、Versionを選択し、Executeを押します。
MSIパッケージの取得GUID(ProductCodeとUpgradeCodeの比較)
PowerShellの起動:WindowsとRキーを一緒に押したまま、Windowsキーを離し、”powershell”と入力してOKを押すか、Enterキーを押します。
以下のスクリプト全体をコピーし、PowerShellウィンドウ内を右クリックします。
Win32_Propertyの場合、行と列の両方をフィルタリングします(UpgradeCodeは多くの行タイプの1つにすぎません)。 遅い操作のために準備されて、WMIは、このような取得を行うことは非常に遅いです。
$wmipackages = Get-WmiObject -Class win32_product$wmiproperties = gwmi -Query "SELECT ProductCode,Value FROM Win32_Property WHERE Property='UpgradeCode'"$packageinfo = New-Object System.Data.Datatable$packageinfo.Columns.Add("Name")$packageinfo.Columns.Add("ProductCode")$packageinfo.Columns.Add("UpgradeCode")foreach ($package in $wmipackages) { $foundupgradecode = $false #Let's assume that no UpgradeCode is found yet. foreach ($property in $wmiproperties) { if ($package.IdentifyingNumber -eq $property.ProductCode) { $packageinfo.Rows.Add($package.Name,$package.IdentifyingNumber, $property.Value) $foundupgradecode = $true break } } if(-Not ($foundupgradecode)) { # No upgrade code found, add product code to list. $packageinfo.Rows.Add($package.Name,$package.IdentifyingNumber, "") }}$packageinfo | Format-table ProductCode, UpgradeCode, Name# Enable the following line to export to CSV (good for annotation). Set full path in quotes.# $packageinfo | Export-Csv "\MsiInfo.csv"
アップグレードコードは、製品のファミリを識別する一意のGUIDです。 つまり、バージョンが異なる同じ製品がいくつかのリリースで出荷されている可能性があります。 これらの製品には異なるProductcodeがありますが、同じUpgradeCodeを使用してリンクされています。
たとえば、”Happy MSI”という製品を作成し、この製品にはクライアントシステムに展開するためのMSIパッケージが一つしかないと仮定します。
この製品の最初のリリースは、実際には”version_1″という名前のMSIパッケージです。msi”で、2番目のリリースは”version_2″です。三井住友海上” 次に、これら二つのMSIは同じUpgradeCodeを持っている必要があります。 ユーザーが”version_2.msi”システム上では、windowsインストーラはUpgradeCodeを使用して、この製品の以前のバージョンがすでにシステム上に存在するかどうかを判断します。
インストーラAPI”MsiEnumRelatedProducts()”は、UpgradeCodeを使用してすべてのファミリ製品を照会します。
MSIパッケージのアンインストール
MSIパッケージをアンインストールし、製品コード(GUID)を見つけた場合は、管理者特権のコマンドプロンプトを使用して次のようにexe、右クリックして管理者として実行):
オプション1:ロギングなしの基本的な対話型アンインストール(迅速かつ簡単):
msiexec.exe /x {00000000-0000-0000-0000-00000000000C}
クイックパラメータの説明:
- /X=run uninstall sequence
- {00000000-0000-0000-0000-0000000000C}=アンインストールする製品の製品コード
(verbose)ロギングを有効にして、必要に応じてサイレントモードで実行することもできます。
オプバッチファイルの場合):
msiexec.exe /x {00000000-0000-0000-0000-00000000000C} /QN /L*V "C:\My.log" REBOOT=ReallySuppress
クイックパラメータの説明:
- /X=アンインストールシーケンスの実行
- {00000000-0000-0000-0000-00000000000C}=アンインストールする製品の製品コード
- /QN=完全にサイレントに実行
- /L*V”C:\My…..log”=指定されたパスでの詳細ログ
- REBOOT=ReallySuppress=予期しない突然の再起動を避ける