ITインフラの管理や運用の現場では、複数のマシンに対して同じ作業を繰り返し実行する場面が少なくありません。そんなときに便利なのが、PowerShellのInvoke-Command
コマンドです。
このコマンドを使えば、ネットワーク越しにリモートマシンに対してスクリプトやコマンドを実行することができ、作業の効率化や自動化を実現できます。
この記事では、PowerShellのInvoke-Command
の基本的な使い方から、複数台の同時処理、資格情報の設定方法、よくあるエラーと対処法まで、実例を交えてわかりやすく解説します。リモート操作に不安のある方も、ぜひこの記事で基本を身につけてください。
Invoke-Commandとは?
Invoke-Command
は、PowerShellでリモートコンピューターに対してコマンドやスクリプトブロックを実行できる非常に便利なコマンドレットです。
このコマンドを使用することで、以下のような作業が可能になります。
- ネットワーク内の他のPCでPowerShellコマンドを実行
- 一括で複数のマシンにパッチ適用やログ収集
- 管理者権限でのリモート操作
Invoke-Command -ComputerName SERVER01 -ScriptBlock { Get-Process }
上記は、SERVER01
というホスト名のマシンで、Get-Process
コマンドを実行する例です。
結果は自分のコンソール上に表示されます。
事前準備:リモート接続を有効にする
Windowsでは、リモート実行を行う前にいくつかの設定が必要です。
WinRMの有効化
PowerShellのリモート実行は、**WinRM(Windows Remote Management)**を利用しています。
まず、WinRMが有効になっているか確認し、必要に応じて設定しましょう。
Enable-PSRemoting -Force
このコマンドを管理者権限で実行することで、WinRMが有効になり、ファイアウォールの例外設定も自動で行われます。
信頼済みホストの設定(必要に応じて)
ドメインに所属していない場合、信頼できるリモートホストを指定する必要があります。
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "SERVER01"
全てのホストを許可する場合は "*"
を指定しますが、セキュリティには注意してください。
単一のリモートマシンにコマンドを実行する
以下は基本的な使用例です。
Invoke-Command -ComputerName "SERVER01" -ScriptBlock {
Get-Service | Where-Object { $_.Status -eq "Running" }
}
この例では、SERVER01
にあるすべての起動中のサービス一覧を取得します。
ポイントは-ScriptBlock
に渡す部分が、実際にリモートで実行されるコードである点です。
複数のリモートマシンで同時に処理する
複数台のマシンで同じコマンドを実行する場合は、-ComputerName
に配列を指定します。
$computers = @("SERVER01", "SERVER02", "SERVER03")
Invoke-Command -ComputerName $computers -ScriptBlock {
Get-Date
}
このコマンドは、3台のサーバーで同時にGet-Date
(現在の日時)を取得する例です。
認証情報を指定する場合(-Credential)
ドメイン環境外や、異なるアカウントでアクセスしたい場合には-Credential
パラメーターを使用します。
$cred = Get-Credential
Invoke-Command -ComputerName "SERVER01" -ScriptBlock {
Get-Process
} -Credential $cred
Get-Credential
を実行すると、ユーザー名とパスワードの入力ダイアログが表示され、認証情報を指定することができます。
スクリプトをリモート実行する(外部スクリプトの活用)
大きな処理や定型スクリプトをリモート実行する場合、事前に用意した.ps1
ファイルを使うこともできます。
Invoke-Command -ComputerName "SERVER01" -FilePath "C:\Scripts\check_disk.ps1"
この方法で、あらかじめ作成したスクリプトファイルを指定してリモート実行することが可能です。
よくあるエラーとその対処法
エラー1:WinRMが無効
[SERVER01] Connecting to remote server failed with the following error message...
→ 対処法:Enable-PSRemoting -Force
を管理者権限で実行してWinRMを有効化
エラー2:接続が拒否される
Access is denied.
→ 対処法:指定した認証情報が正しいか確認。-Credential
を活用
エラー3:信頼済みホストではない
The server certificate on the destination computer...
→ 対処法:Set-Item WSMan:\localhost\Client\TrustedHosts -Value "対象ホスト名"
を実行
実用的な活用例
ログファイルの取得
Invoke-Command -ComputerName "SERVER01" -ScriptBlock {
Get-Content "C:\Logs\AppLog.txt" -Tail 10
}
→ アプリケーションログの最新10行を取得
ディスク使用率のチェック
Invoke-Command -ComputerName "SERVER01" -ScriptBlock {
Get-PSDrive -PSProvider FileSystem
}
→ 各ドライブの使用状況を確認できます。
セキュリティ上の注意点
- WinRMはHTTPポート(5985)を使用するため、HTTPSの設定も検討してください。
- TrustedHostsにワイルドカード(
*
)を設定すると、すべてのホストを許可することになります。業務環境では慎重に扱いましょう。 - リモート実行では、実行先に悪意あるスクリプトを送らないよう、コードの安全性をしっかり確認することが重要です。
まとめ
PowerShellのInvoke-Command
は、IT管理者にとって非常に強力なツールです。
複数台のマシンへの一括操作や、リモートログの取得、メンテナンス作業の自動化など、活用方法は多岐に渡ります。
最初は設定や認証などでつまずくこともありますが、基本をしっかり押さえておけば確実に活用できるようになります。
今後の業務効率化のためにも、Invoke-Command
をマスターしてみてはいかがでしょうか?