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

投稿者: Adam Bertram 投稿日: 2018年11月16

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

マネージド・ファイル・トランスファー・ソリューション、MOVEit を使うと、すべてのファイル転送アクティビティを単一システムに統合することができ、中核となる業務プロセスを確実に管理できます。


リモートコンピュータでタスクを実行するには、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 環境では、プロセスはシームレスであり、すべてのコンピュータでスクリプトやコマンドを実行しようと、オフィス全体を歩き回ってあれこれと煩わしいことをする必要がなくなります。


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.
著者が作成したブログ

関連タグ

関連記事

MOVEit 2018 の REST API で PowerShell を使う
MOVEit の利用形態として、MOVEit コンソールや Web インタフェースからログインして日々の管理業務を行ったり、1回限りのワークフローを設定して操作する作業は理にかなっており、首尾よくいきます。一方、MOVEit Automation の自動化を活用したいケースもあります。
PCI コンプライアンスへの障害と対策
米国の大手運送会社で PCI コンプライアンスを審査する監査が行われ、多くのファイル転送問題が明らかになったため不合格となりました。 この監査を行った監査者は、PCI DSS 3.1「日常業務」で規定されている義務要項に関連して、継続的なコンプライアンス状態を達成することの重要性を強調しました。
Prefooter Dots
Subscribe Icon

Latest Stories in Your Inbox

Subscribe to get all the news, info and tutorials you need to build better business apps and sites

The specified form no longer exists or is currently unpublished.