WinRMポート:デフォルト設定とカスタマイズガイド

WinRMおよびPowerShellリモート操作は、リモートのWindowsコンピュータを管理する際に重要な機能です。他のサービスと同様に、WinRMは特定のポートで特定の状況下で待ち受けます。このチュートリアルでは、それらのWinRMポートを学び、必要に応じて変更する方法を学びます。

関連記事:PowerShellリモート操作:究極のガイド

WinRMリスナー

WinRM(およびその実行ポート)の最も重要な部分の1つは、WinRMリスナーです。

WinRMリスナーは、本質的にはWebサーバーです。HTTPとHTTPSで通信し、Windows 7以前の時代では、ほとんどのWebサーバーが使用するポート80と443がデフォルトで使用されていたことさえありました。

リスナーは、通常のWebサーバーと同様に、接続の確立を試みるための待機中のコンピュータ上でサービスとして実行されます。

A WinRm listener can listen two different ways; HTTP or HTTPS. The WinRM port for HTTP is 5985 while the WinRm port for HTTPS is 5986, by default.

  • HTTP – ポート5985
  • HTTPS – ポート5986

関連記事:PowerShellリモート操作:究極のガイド

間違ったポートへの接続エラー

ポートを変更した場合には、ファイアウォールのルールを追加しないと、ポートを指定しても同じメッセージが表示されます。

WinRMポートの変更

Microsoftは互換性と使いやすさのためにデフォルトの待ち受けポートを使用することを推奨していますが、必要に応じて変更することもできます。これは、デフォルトのポートとの競合や、ファイアウォールによるこれらのポートの使用の制限がある場合に役立ちます。

おそらく、カスタムポートを介してWinRMに接続するように構成されたシステムがあります。通常通りに接続しようとすると、次のエラーメッセージが表示されます:

Failed WinRM connection due to wrong port

その場合、サーバー側でWinRMポートを変更する必要があります!

WinRmポートを変更するには、まずそのポートで既にリッスンしているサービスがあるかどうかを確認する必要があります。

既存の接続を追跡する

Windowsマシンで使用中のポートを確認する最も簡単な方法は、netstat ツールを使用することです。Netstatはシステム上のすべてのアクティブなポートをチェックし、アクティブな場合は使用されているソースと宛先のIPとポートを返します。

WinRmポートの変更前にリスニングポートを特定するには、netstat -aonを実行します。 -aonスイッチ:

  • すべてのアクティブな接続を表示する(a
  • 接続を開いたプロセスのプロセスIDを表示する(o
  • 宛先IPのDNS名を解決しようとしない(n
Running netstat to find listening connections

たとえば、ポート80でWebサーバーがリッスンしている場合、Local Address列のローカルアドレスが:80で終わる行が表示されます。この行には、接続に使用されているPIDまたはプロセスIDが表示されます。

PIDを知っていると、Get-ProcessのようなPowerShellのコマンドレットを使用して、PIDを参照してプロセス名を見つけることができます。

Running Get-Process to find process name

しかし、この場合は上記でわかるように、プロセス名はSystemとなっています。これは、プロセスがOS内に高度に統合されており、おそらくWindowsに組み込まれていることを意味します。

WinRM互換ポートの設定

WinRMには、互換ポートという機能があります。互換ポートは、ポート80のHTTPとポート443のHTTPSのみで動作する一部の旧バージョンのシステムとの後方互換性を持つために存在します。WinRmをこれらのポートでリッスンするように変更する必要がある場合は、互換性リスナーを有効にします。

ポート80と443で実行中の他のプロセスがないことを確認したら、WSManリスナーを互換性ポート(HTTPの場合は80、HTTPSの場合は443)を使用するように設定します。

Set-Item WSMan:\localhost\Service\EnableCompatibilityHttpListener -Value $true
 Set-Item WSMan:\localhost\Service\EnableCompatibilityHttpsListener -Value $true

WinRMを任意のポートでリッスンするように設定する

何らかの理由でWinRMを標準ではないポートでリッスンする必要がある場合は、それも可能です。次の手順に従って設定します:

  1. リスナー名を見つけます。これは、Get-Itemコマンドレットを使用して、すべてのWinRMリスナーを列挙することで行うことができます。以下のコマンドは、現在インストールされているすべてのリスナー(*)をリスト表示しています。
Get-Item WSMan:\localhost\Listener*
Getting all existing WinRm listeners

2. 次に、上記に表示されたリスナー名を使用して、各リスナーをSet-Itemを使用して構成し、リスナーのパスと変更するポート番号を指定します。

Set-Item WSMan:\localhost\Listener\\Port -Value 

3. この時点で、WinRMリスナーは正しいポートでリスニングしていますが、Windowsファイアウォールはおそらくそれらのポートへのリモート接続を拒否しています。これらのポートを開く必要があります。次のコマンドを実行してください。以下のNew-NetFirewallRuleは、カスタムポートへのすべてのインバウンドTCP接続を許可するWindowsファイアウォールルールを作成しています。

$FirewallParam = @{
     DisplayName = 'Custom WinRM Port Rule'
     Direction = 'Inbound'
     LocalPort = 
     Protocol = 'TCP'
     Action = 'Allow'
     Program = 'System'
 }
 New-NetFirewallRule @FirewallParam

関連:Windowsファイアウォールを無効にする:さまざまな方法を発見する

適切なWindowsファイアウォールポートを開かなかった場合、接続しようとすると次のようなメッセージが表示されます:

Failed WinRM connection due to Windows firewall

PSRemotingを使用したカスタムポートへの接続

WinRMサーバーでWinRMを正常に設定および構成したので、WinRMクライアントでの接続をテストする必要があります。それには追加のパラメータであるPortが必要です。

Invoke-CommandEnter-PSSessionなどのいずれかのPSRemotingコマンドを使用して、Portパラメータと正常に接続を行うために設定されたポートを指定してください。

Enter-PSSession -ComputerName <hostname> -Port 1111
Successful WinRm connection

関連:Invoke-Command:リモートコードを実行する最良の方法

Source:
https://adamtheautomator.com/winrm-port/