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

PowerShell を使ってリモートコンピュータでコマンドを実行する方法

Adam Bertram| November 16 2018

| IT insights, PowerShell

how-to-run-commands-on-remote-computers-with-powershell

コマンドをリモートコンピュータで実行することは、多くのIT管理者が毎日行っているよくある作業ですが、このブログでは PowerShell でこれを行う方法を説明します。

リモートコンピュータでタスクを実行するには、DCOMRPCなどのリモートプロトコルを使用するだけでは不十分な場合があります。リモートコンピュータで実際にコマンドを実行するには、別のアプローチが必要になります。ある種のセッションを作成し、リモートコンピュータが使っているネットワークを介してコマンドを送信する必要があります。

これは PowerShell についてのブログであって、telnet に関するものではないので、ここでは PowerShell Remoting と呼ばれるテクノロジーにフォーカスを当てます。PowerShell Remoting は、Windows PowerShell v2 で導入された機能です。これを使うと、リモートコンピュータ上でセッションを開いたり閉じたり、管理したりでき、まるでローカルのコンソールの前に座っているかのように対話することができます。

PowerShell で PSSession と呼ばれるセッションを確立するには、リモートコンピュータで PowerShell Remoting が有効になっており、通常のファイアウォールの例外を除いて、ポート5985HTTP)または5986HTTPS)でリッスンする必要があります。ユーザーがどのように接続を確立したいかによって、クライアント設定が必要になる場合もあります。さまざまな設定がありますが、ここでは、ローカルとリモートの両方のコンピュータが同じ 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 環境では、プロセスはシームレスであり、すべてのコンピュータでスクリプトやコマンドを実行しようと、オフィス全体を歩き回ってあれこれと煩わしいことをする必要がなくなります。PowerShell を使って自動化する方法

Topics: IT insights, PowerShell

Default HTML block

コメントをどうぞ

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

THIS POST WAS WRITTEN BY Adam Bertram

Adam Bertram is a 20-year veteran of IT. He’s currently an automation engineer, blogger, independent consultant, freelance writer, author, and trainer. Adam focuses on DevOps, system management, and automation technologies as well as various cloud platforms. He is a Microsoft Cloud and Datacenter Management MVP and efficiency nerd that enjoys teaching others a better way to leverage automation.

無料試用版

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

無料試用版を試す

コンタクト

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

連絡先

ブログの定期メール便

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