<img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=1678611822423757&amp;ev=PageView&amp;noscript=1">

PowerShell の Invoke-Command の使用法

Dan Franciscus| October 23 2019

| IT insights, PowerShell

using-invoke-command-in-powershell

< このブログでは、Dan Franciscus が、重宝してよく利用する、Invoke-Command の使用方法を説明しています。 >

PowerShell をコマンドプロンプトとスクリプト言語として使用し始めてから、いろいろな感心させられるコマンドレットを見てきました。筆者にとっては、Invoke-Command が、数年前から一番のお気に入りのコマンドレットで、重宝して使っています。

Invoke-Command は、ローカルまたはリモートコンピュータでスクリプトブロックやスクリプトを実行するだけのシンプルなコマンドですが、Invoke-Command の重宝な点は、パラレルに実行する方法があることです。つまり、コンソールに出力を返すか、バックグラウンドジョブとして動くコマンドを、複数のマシンで同時に実行することができます。Invoke-Command の使用例は数々ありますが、筆者としては Chocolatey でソフトウェアをリモートインストールする手法が特に気に入っています。

このブログでは、Invoke-Command の使用法を説明します。

コマンドをリモートで実行

リモートで実行できるよう、Invoke-Command を使用する前に、接続するマシンでの PowerShell リモート処理を有効にしておきます。いろいろな方法がありますが、ポート5985を有効にして、リモートマシン上の WinRM サービスがリモート処理をリッスンできるようにする必要があります。グループポリシーを使用して簡単に設定できます。Kerberos 認証を使うので資格情報を渡す必要がありません。

リモートマシンでリモート処理が有効になったら、Invoke-Command を実行できます。

  C:\> Invoke-Command -ComputerName Test-1 -ScriptBlock {Get-Service winrm}




Status   Name               DisplayName                            PSComputerName

------   ----               -----------                            --------------

Running  winrm              Windows Remote Management (WS-Manag... Test-1

リモートマシンで Get-Service を実行したところ、ローカルコンソールに出力が返されました。

では、一度に多くのマシンでスクリプトを実行するにはどうすればいいでしょうか?筆者がよく使うのは、Get-ADComputer を使って、スクリプトを実行するマシン名を Active Directory に照会する方法です。

C:\> Invoke-Command -ComputerName (Get-ADComputer -Filter * -SearchBase "DC=SERVERS,DC=DOMAIN,DC=COM" -SearchScope Subtree | Select-Object -ExpandProperty Name) -ScriptBlock {Get-Service RemoteRegistry}




Status   Name               DisplayName                            PSComputerName

------   ----               -----------                            --------------

Stopped  RemoteRegistry     Remote Registry                        TEST-1

Stopped  RemoteRegistry     Remote Registry                        TEST-2

Stopped  RemoteRegistry     Remote Registry                        TEST-3

Stopped  RemoteRegistry     Remote Registry                        TEST-4

-SearchBase を使用してActive Directoryの組織単位「サーバー」のマシンを検索し、返ってきたホスト名を -ComputerName パラメータに使用しています。

ここで、もう少し踏み込んで、Chocolatey でソフトウェアをインストールしてみましょう。使用するソフトウェアリポジトリは、デフォルトで機能するWebサーバーである必要があることに注意してください。SMB 共有は、PowerShell リモート処理のダブルホップシナリオのためにエラーになります。

この場合も、Active Directory にクエリを実行しますが、ただサービスが実行されているかどうかを表示する代わりに Google Chrome をインストールします。

   C:\> Invoke-Command -ComputerName (Get-ADComputer -Filter * -SearchBase "DC=SERVERS,DC=DOMAIN,DC=COM" -SearchScope Subtree | Select-Object -ExpandProperty Name) -ScriptBlock {

        choco install googlechrome -y --source=https://myrepo

    }

まとめ

PowerShell を使用してリモートシステムをアドホックに変更する場合、Invoke-Command は大変便利です。Active Directory 環境で PowerShell リモート処理を有効にすると、リモートマシンでのコードの実行が非常に簡単かつ高速になります。システムの変更には正式な設定管理ツールを利用することが望ましいのは確かですが、リモートマシンを管理するのに、Invoke-Command を使用して PowerShell リモート処理を行うことに問題はありません。

PowerShell を使って自動化する方法

Topics: IT insights, PowerShell

Default HTML block

コメントをどうぞ

メールアドレスは公開されません。アスタリスクマーク*のついたフィールドは必須項目です。

THIS POST WAS WRITTEN BY Dan Franciscus

Dan Franciscus is a systems engineer and VMware Certified Professional (VCP) specializing in VMware, PowerShell, and other Microsoft-based technologies. You can reach Dan at his blog (http://www.winsysblog.com/) or Twitter at @dan_franciscus.

無料試用版

無料試用版をお気軽にお試しください。

無料試用版を試す

コンタクト

ご質問、ご意見をお寄せください。

連絡先

ブログの定期メール便

ブログを定期的にメール配信いたします。