【PowerShell】WinRM で リモートサーバ接続


接続先(操作される側)の設定

Windows Server 2012 以降では、既定で WinRM が有効になっているので、特別な作業は必要ない。

以下のようなサービスと Windows Defender ファイアウォールが構成済みとなっている。

  • サービス

    • サービス名 : WinRM
    • 表示名 : Windows Remote Management
  • Windows Defender ファイアウォール

    • Windows リモート管理(HTTP受信)
      • プロファイル : パブリック
      • プロトコル : TCP 5985
      • スコープ : ローカルサブネットからの接続許可
    • Windows リモート管理(HTTP受信)
      • プロファイル : ドメイン,プライベート
      • プロトコル : TCP 5985
      • スコープ : 任意IPからの接続許可


WinRM が無効になっている場合は以下で有効化する。

Enable-PSRemoting

Enable-PSRemoting は WinRM を使うにあたって必要な設定を一括で行う。

  • WinRM サービスを開始
  • WinRM サービスのスタートアップの種類を [自動] に設定
  • 任意の IP アドレスで要求を受け入れるリスナーを作成
  • WS-Management 通信のファイアウォール例外を有効にする(TCP 5985)
  • Microsoft.PowerShell を登録し、まだ登録されていない場合は、Microsoft.PowerShell.Workflow セッションを構成する
  • Microsoft.PowerShell32 セッション構成を 64 ビットコンピューターに登録(まだ登録されていない場合)
  • すべてのセッション構成を有効にする
  • リモート アクセスを許可するように、すべてのセッション構成のセキュリティ記述子を変更する

ネットワークの設定が「プライベート」でない場合にエラーが発生して停止する場合、ネットワークの設定を変更するか、以下のコマンドで WinRM を有効にできる。

Enable-PSRemoting -SkipNetworkProfileCheck

WinRM を無効にする場合は以下。

Disable-PSRemoting


クライアント(操作する側)の設定

WinRM サービスが起動していない場合は、管理者権限で WinRM サービスを開始。

Start-Service WinRM

-Name WinRM と明示的に指定しても良い。


リモートへの接続は以下のように行うことができる。

Enter-PSSession -ComputerName <ホスト名 or IPアドレス> -Credential <ログイン名>

多くの場合、以下のエラーとなる(Active Directory に所属していない場合など)。

Enter-PSSession: Connecting to remote server xxxxxxxxxx failed with the following error message : 
WinRM クライアントは 要求を処理できません。認証スキームが Kerberos と異なる場合、またはクライアント コンピューターがドメインに参加していない 場合は、 HTTPS トランスポートを使用するか、または宛先コンピューターが TrustedHosts 構成設定に追加されている必要があります。 TrustedHosts を構成するには winrm.cmd を使用します。TrustedHosts 一覧に含まれるコンピューターは認証されていない可能性があります。
winrm help config コマンドを実行すると、詳細が表示されます。 For more information, see the about_Remote_Troubleshooting Help topic.

エラーメッセージの通り、HTTPS トランスポートか TrustedHosts を構成する必要がある。

HTTPS トランスポートは証明書を作成する必要があるなど面倒なので、通常は TrustedHosts を構成すれば良い。


クライアント側で、管理者権限で以下のように登録する。

Set-Item WSMan:\localhost\Client\TrustedHosts -Value <ホスト名 or IPアドレス>

WinRM Security Configuration.
This command modifies the TrustedHosts list for the WinRM client. The computers in the TrustedHosts list might not be
authenticated. The client might send credential information to these computers. Are you sure that you want to modify
this list?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): Y

現在の設定を確認するには以下

Get-Item WSMan:\localhost\Client\TrustedHosts

なお、TrustedHosts 構成は追加設定することができない。複数の値を設定するには以下のようにカンマ区切りで設定する。

Set-Item WSMan:\localhost\Client\TrustedHosts -Value "xxx,yyy"

クリアは以下。

Clear-Item WSMan:\localhost\Client\TrustedHosts


再度接続。

Enter-PSSession -ComputerName <ホスト名 or IPアドレス> -Credential <ログイン名>

セッションを終了するには

exit

とする(Exit-PSSession でも可)。


接続時に以下のようなエラーとなる場合は、サーバ側のサービスが起動していること、サーバ側のファイアウォールでクライアントが許可されていること、EC2 などではセキュリティグループで 5985 ポートが許可されていること などを確認する。

Enter-PSSession: Connecting to remote server xxxxxxxxxx failed with the following error message :
WinRM は処理を完了で きません。 指定したコンピューター名が有効であること、コンピューターにネットワーク経由でアクセスできること、および WinRM サービスのファイアウォールの例外が有効になっていてこのコンピューターからアクセスできることを確認してください。 既定では 、パブリック プロファイルの WinRM ファイウォールの例外によって、同一のローカル サブネット内のリモート コンピューターへのアクセスは制限されます。
For more information, see the about_Remote_Troubleshooting Help topic.