Translate

2018年1月26日金曜日

PowerShellでクライアントのアプリケーション一覧を取得する

 多数のクライアントPCを管理していると、どこにどのアプリケーションをインストールしたか覚えていられなくなります。各部署の長さんがしっかり管理してくれてるといいんですが、適当に要望を上げるだけだから次第にどこに何がインストールされてるのかわからなくなっていきます。
 クライアント管理用のソフトウェアがあると簡単に解決できるのですが、これが結構高価なもので年間ライセンスで普通にクライアントPC数台買えるようなレベルだったりします。
 そこでPowerShellを使ってクライアントPCにインストールされているアプリケーションの一覧を取得する方法について説明します。

準備作業

 まずは準備作業として監理したいクライアントPCで、リモートからPowerShellが実行できるように設定する必要があります。
 クライアントPCの管理者モードのPowerShellで次のコマンドを実行するだけなんですが、1台ずつ実行していくのは結構大変です。
Enable-PSRemoting -Force
 そこで次のコマンドラインをGPOのスクリプトや、ウィルス検知ソフトの管理システムなどを使って一斉に実行させます。
powershell -command "& {Enable-PSRemoting -Force}"
 ※注意 リモートからPowerShellを実行できるようにすると、リモートからいろいろなことが実行できてしまいますので、セキュリティ上の検討をよく行ってから実行してください。

一覧の取得

 次に一覧を取得するには、PC上(サーバである必要はありません)でドメイン管理者の権限でPowerShellを起動します。
 立ち上げたPowerShellに次のコマンドを入力して実行します。[]はオプショナル、<>内は適所修正してください。
Invoke-Command -ComputerName <コンピュータ名1>[, <コンピュータ名2>] -ScriptBlock {
>> Get-WmiObject Win32_Product [-Filter "Name like '<アプリケーション名>'"]} |
>> Select-Object Name, PSComputerName |
>> Export-CSV -Path <出力先のパス> -Encoding Default
 例えば2台のPC(computer1、computer2)から名前に"Microsoft"が含まれるアプリケーションの一覧を取得して、"C:\test.csv"に出力する例は次の通りです。
Invoke-Command -ComputerName computer1, computer2 -ScriptBlock {
>> Get-WmiObject Win32_Product -Filter "Name like '%Microsoft%'"} |
>> Select-Object Name, PSComputerName |
>> Export-CSV -Path C:\test.csv -Encoding Default
 出力したデータはExcelで集計するなどするとどのPCに何がインストールされているかの一覧が簡単にできると思います。

コマンドの説明

各コマンドについて軽く触れておきます。

Enable-PSRemoting

PowerShellのリモート実行を有効にします。WinRMの実行やファイヤーウォールの例外設定などが実行されます。

Disable-PSRemoting

PowerShellのリモート実行を無効にします。Enable-PSRemotingを実行すると再起動しても無効化されませんので注意してください。

Invoke-Command

 1台以上のリモートPC上でPowerShellのコマンドを実行します。出力はコマンドを入力したPCに返されます。

Select-Object

出力する列を選択します。

Export-CSV

出力をCSV形式にして保存します。"-Encoding Default"を付けずに実行すると日本語が文字化けします。