WinRMとは?仕組みや有効化の方法・PowerShellでの使い方を解説|サイバーセキュリティ.com

WinRMとは?仕組みや有効化の方法・PowerShellでの使い方を解説



「WinRMって何のこと?」「PowerShellでリモート接続するにはどう設定すればいい?」「Invoke-CommandとEnter-PSSessionの違いは?」——そんな疑問をお持ちではないでしょうか。

WinRM(Windows Remote Management)とはWindowsのコンピューターをネットワーク経由で遠隔管理するためのサービスで、PowerShellによるリモート接続の基盤となる重要な機能です。

本記事ではWinRMの仕組み・有効化の方法・PowerShellでの使い方・セキュリティ設定・トラブルシューティングまで詳しく解説します。

先に結論を言うと
WinRMはWS-Managementプロトコルを使ってWindowsを遠隔操作する仕組みで、PowerShellのリモーティング機能の土台です。有効化はwinrm quickconfigコマンド1つで完了し、Invoke-CommandやEnter-PSSessionを使ってリモートPCを操作できます——これがポイントです。

WinRMとは

WinRM(Windows Remote Management)とはMicrosoftが提供するWindowsの標準リモート管理サービスです。

IPネットワークを通じて他のコンピューターのWindowsにアクセスし、PowerShellを操作したりコマンドラインを呼び出してコマンドの実行やプログラムの起動などを行うことができます。

Windows Server 2012 R2以降に組み込まれ、標準で有効に設定されています。サーバー側の待ち受けポート番号として、標準ではTCPの5985番・SSL/TLSによる暗号化を併用する場合は5986番を使用します。

WS-Managementプロトコルとは

WinRMはデータ伝送にHTTPを、管理データの記述と交換方法に「WS-Management(Web Services for Management)」を利用します。

WS-ManagementはDMTF(Distributed Management Task Force)が策定した業界標準のWebサービスベースのプロトコルで、SOAPメッセージを使ってシステム管理情報をやり取りします。

Windowsに限らず他のOSやネットワーク機器もWS-Managementに対応していれば相互に管理できる設計になっています。

ポート番号(5985・5986)

WinRMが使用するポート番号は通信の暗号化方式によって異なります。

ポート番号 プロトコル 暗号化 用途
5985番 HTTP メッセージレベルの暗号化 標準(LAN内での使用)
5986番 HTTPS SSL/TLSによるトランスポート暗号化 インターネット経由・高セキュリティ環境

5985番(HTTP)を使う場合でも、認証後の通信はメッセージレベルで暗号化されるため、社内LANでの使用であれば一定のセキュリティを確保できます。インターネット経由で接続する場合や高いセキュリティが求められる場合は5986番(HTTPS)の使用を推奨します。

認証方式(Kerberos・NTLM)

ユーザーの認証方式として、接続環境によって自動的に選択されます。

Kerberos認証はLAN内などでコンピューター名を使用してアクセス可能な場合(Active Directoryドメイン環境)に標準で選択されます。双方の交渉によって決定(デフォルトでは鍵長256ビットのAES)され、セキュリティが高い方式です。

NTLM認証はインターネットを経由するなどIPアドレスでアクセスする場合に標準で選択されます。鍵長128ビットのRC4で暗号化されます。

標準ではAdministratorsグループに属する管理者ユーザーしか使用できないようになっています。

WinRMの仕組み

WinRMの通信の流れ

WinRMを使った遠隔操作の通信フローは以下のとおりです。

  1. 管理PCのPowerShellからリモートPCに向けてWS-Managementのリクエストを送信する
  2. リモートPC側のWinRMリスナー(WSManサービス)がリクエストを受信する
  3. Kerberos認証またはNTLM認証でユーザーを認証する
  4. 認証が成功するとリモートPCでコマンドが実行され、結果が管理PCに返送される

管理PCのユーザーはローカルで操作しているような感覚でリモートPCを制御できます。

暗号化の仕組み

認証後のコマンド送信や結果の受信などのやり取りは暗号化されます。Kerberos認証の場合は双方の交渉によって決定(デフォルトでは鍵長256ビットのAES)され、NTLM認証の場合は鍵長128ビットのRC4で暗号化されます。

認証にHTTPのBASIC認証を用い、通信の暗号化を行わない構成を選択することもできますが、セキュリティリスクが高いため推奨されません。

WinRSとの違い

WinRSとはWinRM Remote ShellのことでWinRMを利用してリモートコマンドを実行するコマンドラインツールです。

比較項目 WinRS WinRM(PowerShell経由)
ツールの種類 コマンドラインツール PowerShellコマンドレット
実行できるコマンド コマンドプロンプトのコマンド PowerShellコマンドレット全般
複数台への同時実行 不可 可能(Invoke-Command)
主な用途 シンプルなコマンド実行 高度な管理・自動化

現在はPowerShellのInvoke-CommandやEnter-PSSessionを使う方法が主流で、WinRSは後方互換性のために存在しています。

WinRMの有効化方法

winrm quickconfigコマンドで有効化する

最も簡単な有効化方法はコマンドプロンプトまたはPowerShellを管理者として実行して以下のコマンドを入力することです。

winrm quickconfig

このコマンドを実行すると以下の設定が自動的に行われます。WinRMサービスの開始と自動起動の設定・HTTP(5985番)でのWinRMリスナーの作成・Windowsファイアウォールの例外ルールの追加です。確認プロンプトが表示されたら「y」と入力して設定を完了します。

PowerShellで有効化する

PowerShellを管理者として実行して以下のコマンドを使用する方法もあります。

Enable-PSRemoting -Force

-Forceオプションを付けることで確認プロンプトをスキップして自動的に有効化できます。

winrm quickconfigと同様にWinRMサービスの開始・リスナーの作成・ファイアウォール例外の追加が自動的に行われます。有効化後は以下のコマンドで設定状況を確認できます。

winrm enumerate winrm/config/listener

グループポリシーで有効化する(企業向け)

企業環境で多数のPCに一括でWinRMを有効化する場合はグループポリシーを使用します。グループポリシー管理コンソール(GPMC)を開き、対象のOUにリンクするGPOを作成または編集します。

「コンピューターの構成」→「ポリシー」→「Windowsの設定」→「セキュリティの設定」→「システムサービス」から「Windows Remote Management (WS-Management)」を「自動」に設定します。

さらに「管理用テンプレート」→「Windowsコンポーネント」→「Windows Remote Management」→「WinRMサービス」から「WinRMサービスによる自動ログオンを許可する」を有効にします。

PowerShellでのWinRMの使い方

TrustedHostsの設定

ドメイン環境外(ワークグループ環境やIPアドレスで接続する場合)ではTrustedHostsに接続先を追加する必要があります。以下のコマンドを管理者権限のPowerShellで実行します。

# 特定のPCを追加する場合
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "192.168.1.100"

# 複数のPCを追加する場合
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "192.168.1.100,192.168.1.101"

# すべてのホストを許可する場合(セキュリティリスクあり・テスト環境のみ推奨)
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "*"

設定後はWinRMサービスを再起動します。

Restart-Service WinRM

Invoke-Commandで遠隔コマンドを実行する

Invoke-CommandはリモートPCに対してコマンドを送信して結果を受信するコマンドレットです。複数台への同時実行が可能なため自動化・バッチ処理に最適です。

# 基本的な使い方
Invoke-Command -ComputerName "RemotePC01" -ScriptBlock { Get-Process }

# 認証情報を指定する場合
$cred = Get-Credential
Invoke-Command -ComputerName "RemotePC01" -Credential $cred -ScriptBlock { Get-Service }

# 複数台に同時実行する場合
Invoke-Command -ComputerName "PC01","PC02","PC03" -ScriptBlock { hostname }

Enter-PSSessionで対話的に接続する

Enter-PSSessionはリモートPCに対話的なセッションを開いて、ローカルで操作しているような感覚で操作できるコマンドレットです。

# コンピューター名で接続する場合
Enter-PSSession -ComputerName "RemotePC01"

# IPアドレスで接続する場合(認証情報が必要)
$cred = Get-Credential
Enter-PSSession -ComputerName "192.168.1.100" -Credential $cred

# 接続を切断する場合
Exit-PSSession

セッションに入るとプロンプトが`[RemotePC01]: PS C:\>`のように変わり、リモートPCを操作していることがわかります。

New-PSSessionでセッションを管理する

New-PSSessionを使うと明示的にセッションオブジェクトを作成して再利用できます。複数回コマンドを実行する場合に毎回接続・切断のオーバーヘッドを避けられるため効率的です。

# セッションを作成する
$session = New-PSSession -ComputerName "RemotePC01"

# 作成したセッションを使ってコマンドを実行する
Invoke-Command -Session $session -ScriptBlock { Get-Process }
Invoke-Command -Session $session -ScriptBlock { Get-EventLog -LogName System -Newest 10 }

# セッションを閉じる
Remove-PSSession $session

WinRMのセキュリティ設定・注意点

HTTPS(5986番ポート)を使った暗号化

インターネット経由の接続や高いセキュリティが求められる環境では、5986番ポートのHTTPS接続を使用することを推奨します。HTTPS接続を使用するにはリモートPC側でSSL証明書を用意してWinRMのHTTPSリスナーを設定する必要があります。

# 自己署名証明書を作成する
$cert = New-SelfSignedCertificate -DnsName "RemotePC01" -CertStoreLocation "cert:\LocalMachine\My"

# HTTPSリスナーを作成する
New-Item -Path WSMan:\localhost\Listener -Transport HTTPS -Address * -CertificateThumbPrint $cert.Thumbprint

TrustedHostsのリスクと適切な設定

TrustedHostsに「*」(ワイルドカード)を設定するとすべてのホストへの接続を信頼することになりセキュリティリスクが高まります。本番環境では接続先のIPアドレスまたはホスト名を明示的に指定してください。また使用しなくなったTrustedHostsのエントリは定期的に削除する運用を推奨します。

ファイアウォール設定の確認

winrm quickconfigを実行すると自動的にファイアウォールの例外が追加されますが、手動で設定する場合は以下のポートを許可します。HTTP接続には5985番(TCP)・HTTPS接続には5986番(TCP)を許可します。

特定のIPアドレスからのみ接続を許可するようにファイアウォールルールをスコープ設定することでセキュリティを強化できます。

WinRMのトラブルシューティング

接続できない場合の確認事項

WinRMで接続できない場合は以下の順番で確認してください。まずリモートPC側でWinRMが有効になっているか確認します。

Get-Service WinRM

Statusが「Running」でない場合はWinRMサービスを開始します。

Start-Service WinRM

次にリスナーが作成されているか確認します。

winrm enumerate winrm/config/listener

ファイアウォールの設定を確認します。5985番または5986番ポートへの接続が許可されているか確認してください。

よくあるエラーと対処法

「WinRM サービスが実行されていません」:リモートPC側でWinRMサービスが停止しています。`Start-Service WinRM`で起動してください。

「アクセスが拒否されました」:認証に失敗しています。ユーザー名・パスワードを確認するか`Get-Credential`で再入力してください。

「ホスト名がTrustedHostsに含まれていません」:`Set-Item WSMan:\localhost\Client\TrustedHosts`で接続先を追加してください。

「ネットワークパスが見つかりません」:ファイアウォールがブロックしているか、リモートPCへのネットワーク接続を確認してください。

よくある質問(FAQ)

WinRMとRDPの違いは?

WinRMはPowerShellコマンドやスクリプトをリモートで実行するためのCLI(コマンドライン)ベースのリモート管理プロトコルです。RDP(Remote Desktop Protocol)はリモートPCのデスクトップ画面をGUIで操作するためのプロトコルです。

サーバーの自動化・一括管理・スクリプト実行にはWinRM、GUIでの視覚的な操作が必要な場合はRDPという使い分けが一般的です。

WinRMはWindows Home版でも使える?

Windows Home版でもWinRMのクライアント機能(他のPCに接続する側)は使用できますが、サーバー機能(接続を受け付ける側)はWindows Pro以上のエディションが必要です。

ただしWindows Homeでもwinrm quickconfigを実行すること自体はできますが、一部の機能に制限があります。企業でのリモート管理にはWindows Pro以上のエディションを使用することを推奨します。

WinRMを無効にするには?

WinRMを無効にするにはPowerShellを管理者として実行して以下のコマンドを実行します。

Disable-PSRemoting -Force
Stop-Service WinRM
Set-Service WinRM -StartupType Disabled

Disable-PSRemotingはPowerShellのリモーティングを無効化し、Stop-ServiceとSet-ServiceでWinRMサービスを停止・無効化します。

まとめ

WinRM(Windows Remote Management)はWS-Managementプロトコルを使ってWindowsを遠隔管理するサービスで、PowerShellリモーティングの基盤です。

標準ポートはHTTPが5985番・HTTPSが5986番で、認証はKerberos(LAN内)またはNTLM(IP接続時)が自動選択されます。有効化はwinrm quickconfigまたはEnable-PSRemotingコマンド1つで完了します。

PowerShellからはInvoke-Command(バッチ処理・複数台同時実行)・Enter-PSSession(対話的操作)・New-PSSession(セッション再利用)を用途に応じて使い分けます。

本番環境ではHTTPS接続・TrustedHostsの適切な設定・ファイアウォールの制限を組み合わせたセキュリティ設定が重要です。

SNSでもご購読できます。