コマンドをリモートコンピュータで実行することは、多くのIT管理者が毎日行っているよくある作業ですが、このブログでは PowerShell でこれを行う方法を説明します。
リモートコンピュータでタスクを実行するには、DCOM、RPCなどのリモートプロトコルを使用するだけでは不十分な場合があります。リモートコンピュータで実際にコマンドを実行するには、別のアプローチが必要になります。ある種のセッションを作成し、リモートコンピュータが使っているネットワークを介してコマンドを送信する必要があります。
これは PowerShell についてのブログであって、telnet に関するものではないので、ここでは PowerShell Remoting と呼ばれるテクノロジーにフォーカスを当てます。PowerShell Remoting は、Windows PowerShell v2 で導入された機能です。これを使うと、リモートコンピュータ上でセッションを開いたり閉じたり、管理したりでき、まるでローカルのコンソールの前に座っているかのように対話することができます。
PowerShell で PSSession と呼ばれるセッションを確立するには、リモートコンピュータで PowerShell Remoting が有効になっており、通常のファイアウォールの例外を除いて、ポート5985(HTTP)または5986(HTTPS)でリッスンする必要があります。ユーザーがどのように接続を確立したいかによって、クライアント設定が必要になる場合もあります。さまざまな設定がありますが、ここでは、ローカルとリモートの両方のコンピュータが同じ Active Directory ドメインにあると想定します。このコンテキストにおいては、PowerShell Remoting は Kerberos を使用して認証を行うので、別の認証情報をコマンドに渡す必要はありません。
リモートコンピュータで PowerShell Remoting が有効になっていると仮定した上で、まずリモートコンピュータで簡単なコマンドを実行してみましょう。コードがリモートコンピュータで実行されていることを確認するためのテストには、コンピュータの名前を返す hostname コマンドを使うと便利です。
PowerShell Remoting を使用してリモートコマンドを実行するには、2つの方法 - 対話的な方法と非対話的な方法 - があります。対話的な方法をとる場合は、コマンドを実行するとき、物理的にコンピュータの前にいる必要があります。まず、非対話的な例から見ていきましょう。
リモートコマンドを非対話形式で実行するには、Invoke-Command コマンドを使用します。このコマンドの ComputerName パラメータで、実行するコンピュータを指定します。また、リモートコンピュータ上で実行するコマンドをカプセル化する ScriptBlock パラメータもあります。以下をご覧ください。ローカルのコンピュータ上で hostname コマンドを実行してから、Invoke-Command でリモート実行しています。hostname に対して返ってくる結果が異なっています。
PS C:\> hostname
MACWINVM
PS C:\> Invoke-Command -ComputerName SRV1 -ScriptBlock {hostname}
SRV1
リモートコンピュータでコマンドが実行できたことが確認できました。ScriptBlock パラメータには何を入れても構いません。下に示す例では、コードがリモートで実行されていることを確認するテストとして $scriptblock の中に if/then ステートメントを入れています。
PS C:\> $scriptblock = { if ((hostname) -ne 'MACWINVM') { 'This is a remote computer' } else { 'We are local' }}
PS C:\> Invoke-Command -ComputerName SRV1 -ScriptBlock $scriptblock
This is a remote computer
わかりづらいかもしれませんが、Invoke-Command コマンドはバックグラウンドでコマンドを実行するための軽量セッションを作成し、コマンドが完了した時点でセッションを破棄します。これは、Enter-PSSession コマンドを使ってコマンドを対話的に実行する場合には、明白です。
Enter-PSSession コマンドを使用すると、リモートセッションにログインして、ローカルコンソールにコマンドを入力するのと同じようにコマンドを実行し、結果を得ることができます。まず、セッションを確立する必要がありますが、これを行うのに、下の例では、ComputerName パラメータを使用しています。コンピュータ名を指定してリモートセッションに入りますが、新しい PowerShell のプロンプトの前には、セッションが実行されているコンピュータ名が表示されています。
PS C:\> Enter-PSSession -ComputerName SRV1
[SRV1]: PS C:\>
この時点で、どんなコマンドでも、リモートコンピュータ上で実行することができます。Invoke-Command を使う必要はなく、コマンドはそのまま実行されます。終了したら、セッションを閉じる必要があります。そのためには、exit キーワードを使ってセッションを抜けます。exit と入力して Enter キーを押すと、すぐにローカルコンソールに戻ります。
[SRV1]: PS C:\>exit
PS C:\>
PowerShell Remoting は、リモートコンピュータでコマンドを実行するのに便利な方法です。リモートコンピュータがワンタイムセットアップとして PowerShell Remoting 用に設定されていれば、クライアントコンピュータにはほとんど追加設定をしなくても(あったとしても最小限の設定で)機能します。特に、Active Directory 環境では、プロセスはシームレスであり、すべてのコンピュータでスクリプトやコマンドを実行しようと、オフィス全体を歩き回ってあれこれと煩わしいことをする必要がなくなります。
Subscribe to get all the news, info and tutorials you need to build better business apps and sites