PowerShell リモーティングを使用してコマンドを実行する方法
- PowerShell リモーティングとは
-
PowerShell での
WinRM
リスナーの設定 - 新しい PowerShell セッションを作成する
- PowerShell でクイックコマンドをリモート実行するための Invoke メソッドの使用

Windows PowerShell を使用すると、ローカルまたはリモートコンピュータでコマンドを実行する方法が複数あります。一つの方法は、PowerShell リモーティングを有効にし、PowerShell セッションコマンドを使用することです。
この記事では、PowerShell リモーティングの仕組み、WinRM
の設定、いくつかの PowerShell セッションコマンドの例、そして管理者アクセスでコンピュータにリモート接続する方法について説明します。
PowerShell リモーティングとは
PowerShell リモーティング(または PSRemoting
)は、PowerShell で頻繁に使用される機能の一つです。その結果、私たちは 1つまたは複数のリモートコンピュータにシームレスに接続し、単一のコマンドでコマンドを実行することができます。
簡単に言えば、PSRemoting
を使用すると、まるでリモートコンピュータの前に座っているかのように、そのコンピュータ上でコマンドを実行することができます。さらに、PSRemoting
は、ユーザーを接続および認証し、リモート cmdlet を実行し、その cmdlet からの出力をローカルコンピュータに表示する機能を提供します。
PSRemoting
を SSH
や telnet
、さらには psexec
のように考えてください。これは、PowerShell 内のコンピュータでコマンドを実行するための方法です。
PSRemoting
は、セッション内でコマンドを実行することに大きく依存しています。セッションは、コマンドが内部で実行されるリモートシェルです。
これらのセッションを作成するには、PowerShell コンソールのバックグラウンドで多くのステップを経る必要があります。
PSRemoting
セッションを開始すると、以下の粗いステップが実行されます:
-
ユーザーは、
WinRM
リスナー上の宛先サーバーに接続を試みます。WinRM
リスナーはサーバー上で実行される小さな Web サービスです。WinRM
は、Microsoft の実装標準であるWSMan
のバージョンです。WSMan
は、当時 Intel、Dell、Sun Microsystems など多くの大手 IT 企業とともに作成されたオープンソースの標準です。 -
クライアントが HTTP または HTTPS プロトコルを介してリスナーに接続すると、認証プロセスが始まります。
-
クライアントがサーバーに接続し、認証すると、
PSRemoting
はセッションを生成します。 -
PSRemoting
がセッションを生成すると、それはビジネスを開始する準備が整います。クライアントはサーバーに情報を送信し、必要な出力をシリアル化として戻すことができます。この通信は通常、暗号化されています。
PSRemoting
を有効にするには、以下のコマンドを PowerShell コンソールに入力してください。
Enable-PSRemoting –Force
PowerShell での WinRM
リスナーの設定
クライアントはネットワークを介して接続する場所が必要です。クライアントは、向こう側で「聞いている」ものと「話す」必要があります。「聞いている」部分は WinRM
リスナーの役割です。
以下の winrm
コマンドを使用して、任意の Windows コンピュータで実行中のすべての WinRM
リスナーを発見できます。
winrm e winrm/config/listener
WinRM
リスナーにはいくつかの重要なコンポーネントがあります。
- リスニングアドレス - バインドされる IP アドレス。リスニングアドレスは、クライアントが接続するサーバーの IP アドレスです。
- トランスポートの種類 - 各
WinRM
リスナーは、クライアントと通信する手段を必要とします。これを HTTP または HTTPS を介して行います。 - オプションの証明書サムプリント -
WinRM
リスナーがトランスポートに HTTPS を使用する場合、クライアントを認証するためのプライベートキーを知っている必要があります。このキーは証明書サムプリントを利用して見つけられます。
WinRM
でローカルコンピュータの信頼されたホストのリストにリモートコンピュータを追加するには、以下のコマンドを入力します。
winrm s winrm/config/client '@{TrustedHosts="RemoteComputer"}'
WinRM
の設定を確認およびチェックするには、以下のコマンドを入力します。
winrm quickconfig
新しい PowerShell セッションを作成する
New-PSSession
コマンドは、ローカルまたはリモートコンピュータ上に Windows PowerShell セッション(PSSession
)を作成します。PSSession
を作成すると、PowerShell はリモートコンピュータへの永続的な接続を確立します。
Enter-PSSession
または Invoke-Command
の–ComputerName
パラメーターを使用することで、PSSession
を作成せずにリモートコンピュータでコマンドを実行できます。
–ComputerName
パラメーターを使用すると、PowerShell は cmdlet に使用される一時接続を作成し、実行後に閉じられます。
Windows PowerShell 6.0 以降、ローカルコンピュータで SSH が有効になっていて、リモートコンピュータに Windows PowerShell SSH エンドポイントが設定されている場合、Secure Shell(SSH)を使用してリモートマシン上にセッションを作成および確立できます。
SSH ベースの Windows PowerShell リモート開始セッションのメリットの一つは、複数のプラットフォーム(Windows、Linux、macOS)やクロスプラットフォームで動作することです。
SSH ベースのセッションでは、-HostName
または -SSHConnection
パラメーターを使用してリモートコンピュータやその他の関連接続情報を指定できます。
New-PSSession -ComputerName DC01 -Credential (Get-Credential)
New-PSSession
コマンドによって生成されたセッションは永続的であることを忘れないでください。つまり、複数回使用できます。
しかし、セキュリティリスクを避けるために、Remove-PSSession
コマンドを使用してセッションを閉じる必要があることを忘れないでください。
PowerShell でクイックコマンドをリモート実行するための Invoke メソッドの使用
実行されたコマンドを書く際には、Invoke-Command
cmdlet を使用することが好ましいです。これにより、IDE 内で IntelliSense が保持されます。また、Invoke-Command
は、クイックで簡単な一時的なコマンドを実行する場合に便利です。
任意の Invoke
メソッドのセッションは非永続的であり、悪意のあるユーザーが悪用できるセッションを保持しません。
以下のスニペットは、管理者レベルでコマンドを実行できるように、ユーザー名とセキュア文字列のパスワードを渡す Invoke-Command
の例です。
スクリプトサンプル:
$username = "Username"
$password = "Password"
$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object { $secstr.AppendChar($_) }
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username, $secstr
Invoke-Command -ComputerName RemoteServer -ScriptBlock { Get-Process } -Credential $cred
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn