【PowerShell】複数のリモートPCに同時コマンドを実行する方法(Invoke-Commandの活用)

【PowerShell】複数のリモートPCに同時コマンドを実行する方法(Invoke-Commandの活用) PowerShell

IT管理者が複数のWindowsマシンを管理する際、すべての端末に個別でログインしてコマンドを実行するのは非常に手間がかかります。こうした作業を効率化する手段として、PowerShellのInvoke-Commandを活用すれば、複数のリモートPCに対して同時にコマンドを送信して実行することが可能です。本記事では、Invoke-Commandの基本的な使い方から、複数PCへの同時実行方法までをわかりやすく解説します。

事前準備とリモート接続の有効化

リモートPCにPowerShellコマンドを送るには、まず接続先でPowerShellリモートを許可しておく必要があります。対象のPCで次のコマンドを管理者権限で実行することで、リモート受信が可能になります。

Enable-PSRemoting -Force

この設定により、WinRM(Windows Remote Management)が有効化され、外部からのPowerShell接続が許可されます。同一ドメイン内であればこの設定だけで通信できるケースが多く、ワークグループ環境の場合は信頼関係の設定が別途必要です。

単一のリモートPCにコマンドを実行する基本構文

Invoke-Commandを使えば、リモートマシンに対して直接コマンドを送ることができます。以下はリモートPCのホスト名がPC01である場合の例です。

Invoke-Command -ComputerName PC01 -ScriptBlock { Get-Process }

このコマンドでは、PC01上で現在稼働中のプロセス一覧を取得し、結果を実行元のPowerShellに表示します。

複数のPCに同時にコマンドを送る方法

複数のPCに対して一括でコマンドを実行したい場合は、-ComputerNameに複数のホスト名を渡すことで可能になります。たとえば以下のように記述します。

$computers = @("PC01", "PC02", "PC03")

Invoke-Command -ComputerName $computers -ScriptBlock {
    Get-Date
}

この例では、3台のPCすべてで現在時刻を取得し、それぞれの結果がまとめて表示されます。PCの台数が多くなる場合は、CSVファイルやテキストファイルに一覧を保存しておき、Import-CsvやGet-Contentで読み込んで配列として処理することも可能です。

認証情報を指定する場合

接続先が異なるアカウントで管理されている場合は、ユーザー名とパスワードを明示的に渡すことで接続が可能です。

$cred = Get-Credential
Invoke-Command -ComputerName $computers -Credential $cred -ScriptBlock {
    Get-Service -Name "wuauserv"
}

このようにすれば、別のアカウント権限でも対象マシン上の操作が可能になります。Windows Updateサービスなどの管理操作も一括で行えるため非常に便利です。

処理結果の整形とエラーハンドリング

実行結果を整形したい場合や、エラー時の動作を制御したい場合は、Try-Catch構文やログ出力処理を組み込むと、より安定したスクリプトになります。たとえば次のように出力をファイルに記録することもできます。

Invoke-Command -ComputerName $computers -ScriptBlock {
    Get-Service
} | Out-File "C:\Logs\service_report.txt"

まとめ

PowerShellのInvoke-Commandを使えば、複数のリモートPCに対して一括でコマンドを実行することができ、管理業務の効率が大幅に向上します。日常的な確認作業からサービスの制御、ファイルの配布処理まで幅広く活用できます。対象マシンでのリモート有効化と認証管理を正しく整えた上で、ぜひ業務に取り入れてみてください。