using-invoke-command-in-powershell

PowerShell の Invoke-Command の使用法

PowerShell の 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 リモート処理を行うことに問題はありません。

 

関連ブログ


Comments
Comments are disabled in preview mode.
Loading animation