Windows インストーラーに対応したアプリケーションであれば、WMI の Win32_Product クラスを使用してアクセスできますが、今日普及しているアプリケーションのすべてが Windows インストーラーに対応しているわけではありません。Windows インストーラーには、インストール可能なアプリケーションを管理するための、さまざまな標準的手法が備わっています。ここでは、こうしたアプリケーションに重点を置いて説明します。一般に、他のセットアップ手順を使用するアプリケーションについては、Windows インストーラーでは管理できません。これらのアプリケーションを管理するための手法は、インストーラー ソフトウェアや、アプリケーション開発者の意図によって異なります。
注意事項: | |
アプリケーション ファイルをコンピューターにコピーすることによってインストールされるアプリケーションについては、ここで紹介する手法では管理できません。これらのアプリケーションは、「ファイルおよびフォルダーの操作」で説明する手法を使用し、ファイルおよびフォルダーとして管理できます。 |
Windows インストーラー アプリケーションの一覧表示
Windows インストーラーを使用してローカル システムまたはリモート システムにインストールされているアプリケーションを一覧表示するには、次の単純な WMI クエリを使用します。
PS> Get-WmiObject -Class Win32_Product -ComputerName . IdentifyingNumber : {7131646D-CD3C-40F4-97B9-CD9E4E6262EF} Name : Microsoft .NET Framework 2.0 Vendor : Microsoft Corporation Version : 2.0.50727 Caption : Microsoft .NET Framework 2.0
Win32_Product オブジェクトのすべてのプロパティを画面に表示するには、Format-List コマンドレットなどの書式設定コマンドレットの Property パラメーターに * (すべての値) を指定します。
PS> Get-WmiObject -Class Win32_Product -ComputerName . | Where-Object -FilterScript {$_.Name -eq "Microsoft .NET Framework 2.0"} | Format-List -Property * Name : Microsoft .NET Framework 2.0 Version : 2.0.50727 InstallState : 5 Caption : Microsoft .NET Framework 2.0 Description : Microsoft .NET Framework 2.0 IdentifyingNumber : {7131646D-CD3C-40F4-97B9-CD9E4E6262EF} InstallDate : 20060506 InstallDate2 : 20060506000000.000000-000 InstallLocation : PackageCache : C:\WINDOWS\Installer\619ab2.msi SKUNumber : Vendor : Microsoft Corporation
代わりに、Get-WmiObject Filter パラメーターを使用して、Microsoft .NET Framework 2.0 のみを選択することもできます。このコマンドで使用されるフィルターは WMI のフィルターであるため、Windows PowerShell の構文ではなく、WMI クエリ言語 (WQL) の構文を使用します。そのため、コマンドは次のようになります。
Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='Microsoft .NET Framework 2.0'"| Format-List -Property *
WQL のクエリで頻繁に使用されるスペースや等号などの文字には、Windows PowerShell では特殊な意味があります。そのため、Filter パラメーターの値は常に引用符で囲む習慣を付けることをお勧めします。また、可読性は低くなりますが、Windows PowerShell のエスケープ文字であるアクサン グラーブ (`) を使用することもできます。次のコマンドは、フィルター文字列全体を引用符で囲む代わりに、アクサン グラーブを使って特殊な文字をエスケープした例です。前のコマンドと同じ結果が返されます。
Get-WmiObject -Class Win32_Product -ComputerName . -Filter Name`=`'Microsoft` .NET` Framework` 2.0`' | Format-List -Property *
必要なプロパティのみを一覧表示するには、書式設定コマンドレットの Property パラメーターを使用して、目的のプロパティを一覧表示します。
Get-WmiObject -Class Win32_Product -ComputerName . | Format-List -Property Name,InstallDate,InstallLocation,PackageCache,Vendor,Version,IdentifyingNumber ... Name : HighMAT Extension to Microsoft Windows XP CD Writing Wizard InstallDate : 20051022 InstallLocation : C:\Program Files\HighMAT CD Writing Wizard\ PackageCache : C:\WINDOWS\Installer\113b54.msi Vendor : Microsoft Corporation Version : 1.1.1905.1 IdentifyingNumber : {FCE65C4E-B0E8-4FBD-AD16-EDCBE6CD591F} ...
インストールされているアプリケーションの名前のみを表示する場合は、簡単な Format-Wide ステートメントを使用することで、簡潔な出力結果を取得できます。
Get-WmiObject -Class Win32_Product -ComputerName . | Format-Wide -Column 1
これまでは、インストールに Windows インストーラーが使用されたアプリケーションを調査する方法をいくつか紹介してきましたが、それ以外のアプリケーションについてはまだ説明していません。標準的なアプリケーションの多くは、そのアンインストーラーを Windows に登録します。そのため、こうしたアプリケーションは、Windows レジストリで検索することによって管理できます。
アンインストール可能なすべてのアプリケーションの一覧表示
システム上のすべてのアプリケーションを確実に検索する方法は存在しません。しかし、[プログラムの追加と削除] ダイアログ ボックスに表示されているすべてのプログラムを探して一覧表示することはできます。[プログラムの追加と削除] ダイアログ ボックスでは、アプリケーションを一覧表示する際に、次のレジストリ キーを検索します。
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall.
このキーを調べることで、アプリケーションを検索できます。次のように、このレジストリの場所に Windows PowerShell ドライブをマッピングすると、Uninstall キーに簡単にアクセスできるようになります。
PS> Name Provider Root CurrentLocation ---- -------- ---- --------------- Uninstall Registry HKEY_LOCAL_MACHINE\SOFTWARE\Micr...
注意事項: | |
HKLM: というドライブは HKEY_LOCAL_MACHINE のルートにマッピングされているため、そのドライブを Uninstall キーのパスに使用しました。レジストリ パスの指定には、HKLM: の代わりに、HKLM または HKEY_LOCAL_MACHINE を使用することもできます。既存のレジストリ ドライブを使用することの利点は、タブ補完を使ってキー名を入力できることです。 |
これで、"Uninstall" というドライブ名が作成されました。インストールされているアプリケーションは、このドライブ名を使用してすばやく簡単に検索できます。インストールされているアプリケーションの数を調べるには、Windows PowerShell ドライブである Uninstall: のレジストリ キーの数をカウントします。
PS> (Get-ChildItem -Path Uninstall:).Count 459
このアプリケーションの一覧は、Get-ChildItem をはじめとするさまざまな方法を使って検索できます。アプリケーションの一覧を取得して、$UninstallableApplications 変数に保存するには、次のコマンドを使用します。
$UninstallableApplications = Get-ChildItem -Path Uninstall:
注意事項: | |
ここでは、わかりやすいように長い変数名を使用しています。実際には、あえて長い名前を使用する必要はありません。変数名にはタブ補完を使用できますが、すばやく入力できるように 1 ~ 2 文字の名前を使用することもできます。再利用を想定してコードを作成する場合には、わかりやすく長い名前を使用するようにします。 |
Uninstall の下にあるレジストリ キーのレジストリ エントリの値を表示するには、レジストリ キーの GetValue メソッドを使用します。メソッドの値には、レジストリ エントリの名前を指定します。
たとえば、Uninstall キーからアプリケーションの表示名を検索するには、次のコマンドを使用します。
PS> Get-ChildItem -Path Uninstall: | ForEach-Object -Process { $_.GetValue("DisplayName") }
重複する値が出力される場合もあります。次の例では、インストールされている 2 つの項目が "Windows Media Encoder 9 Series" として表示されています。
PS> Get-ChildItem -Path Uninstall: | Where-Object -FilterScript { $_.GetValue("DisplayName") -eq "Windows Media Encoder 9 Series"} Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Micros oft\Windows\CurrentVersion\Uninstall SKC VC Name Property --- -- ---- -------- 0 3 Windows Media Encoder 9 {DisplayName, DisplayIcon, UninstallS... 0 24 {E38C00D0-A68B-4318-A8A6-F7... {AuthorizedCDFPrefix, Comments, Conta...
アプリケーションのインストール
Win32_Product クラスを使用すると、Windows インストーラー パッケージをリモートから、またはローカルでインストールできます。リモートからインストールする場合は、インストールする .msi パッケージのパスを、汎用名前付け規則 (UNC) 形式のネットワーク パスで指定する必要があります。WMI サブシステムでは、Windows PowerShell のパスは認識されません。たとえば、ネットワーク共有 \\AppServ\dsp にある NewPackage.msi をリモート コンピューター PC01 にインストールするには、Windows PowerShell プロンプトで次のコマンドを入力します。
(Get-WMIObject -ComputerName PC01 -List | Where-Object -FilterScript {$_.Name -eq "Win32_Product"}).Install(\\AppSrv\dsp\NewPackage.msi)
Windows インストーラー テクノロジが使用されていないアプリケーションには、そのアプリケーションのインストールを自動化する固有の方法が用意されていることがあります。インストールを自動化する方法が存在するかどうかを調べるには、アプリケーションのドキュメントを確認するか、またはアプリケーション製造元のサポート窓口に問い合わせる必要があります。アプリケーションの製造元が、特にインストールの自動化を意識してアプリケーションを設計していなくても、インストーラー ソフトウェアの製造元がなんらかの自動化技術を持っている場合もあります。
アプリケーションの削除
Windows PowerShell で Windows インストーラー パッケージを削除するには、パッケージのインストールとほぼ同じ方法を使用します。ここでは、名前に基づいて、アンインストールするパッケージを選択する例を紹介します。しかし、IdentifyingNumber でフィルター処理した方が簡単な場合もあります。
(Get-WmiObject -Class Win32_Product -Filter "Name='ILMerge'" -ComputerName . ).Uninstall()
それ以外のアプリケーションについては、ローカルで行ったとしても、それほど簡単には削除できません。これらのアプリケーションでは、UninstallString プロパティを抽出することで、コマンド ラインのアンインストール文字列を検索できます。この方法は、Windows インストーラー アプリケーションだけでなく、Uninstall キーに登録されている古いプログラムにも使用できます。
Get-ChildItem -Path Uninstall: | ForEach-Object -Process { $_.GetValue("UninstallString") }
必要に応じて、出力を表示名でフィルター処理することもできます。
Get-ChildItem -Path Uninstall: | Where-Object -FilterScript { $_.GetValue("DisplayName") -like "Win*"} | ForEach-Object -Process { $_.GetValue("UninstallString") }
ただし、これらの文字列は若干の修正が必要であり、Windows PowerShell のプロンプトから直接使用することはできません。
Windows インストーラー アプリケーションのアップグレード
アプリケーションをアップグレードするには、アプリケーションの名前と、アプリケーション アップグレード パッケージのパスが必要です。これらの情報が揃えば、1 つの Windows PowerShell コマンドでアプリケーションをアップグレードできます。
(Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='OldAppName'").Upgrade(\\AppSrv\dsp\OldAppUpgrade.msi)