Windows で PowerShell リモート処理 (WinRM) を管理する方法

Windows で PowerShell リモート処理を有効にして管理する方法

PowerShell Remoting(略してPSRemoting)は、非常に便利な機能の1つですが、デスクトップ(特にWindows 10と11)ではデフォルトで無効になっていることがよくあります。複数のマシンを管理したり、スクリプトをリモートで実行したりする場合、すべてを壊さずにこの機能を有効にする方法を見つけるのは面倒な作業です。サーバーでは通常有効になっていますが、通常のWindowsではそうではありません。このガイドでは、設定方法、動作確認の方法、そして問題が発生した場合の対処法について解説します。最終的な目標は?あまり手間をかけずに、リモートPowerShellセッションに参加したり、ネットワーク経由でコマンドを実行したりできるようになることです。

一度使いこなせれば、まるで秘密のスーパーパワーを手に入れたような気分です。デスクから立ち上がることなくマシンを管理できるのです。しかしもちろん、リモート処理を有効にするとセキュリティリスクも伴うため、正しく設定する必要があります。WinRMEnable-PSRemotingサービスを操作するコマンドや、ファイアウォール設定の調整も必要になります。基本的には、WinRMとPowerShellがスムーズに連携できるようにすることが目的です。

Windows で PowerShell リモート処理の問題を修正する方法

Windows で PowerShell リモート処理 (WinRM) を有効にしてテストする

これはよくある手口です。PowerShell リモート処理が機能しない場合は、WinRM がまだ設定されていない可能性があります。Windows 10/11 のデスクトップ版では、デフォルトで無効になっているため、スクリプトやリモート管理を考えている場合には少々面倒です。Windows Server では通常既に有効になっていますが、通常のデスクトップ版ではそうではありません。

まず、次のコマンドを実行して、WinRM が実行されているかどうかを確認します。

Test-WSMan

「クライアントが接続できない」または「WinRMサービスが見つからない」というエラーが表示された場合は、WinRMサービスを有効にするサインです。以下のコマンドでWinRMサービスが実行されているかどうかを確認してください。

Get-Service -Name WinRM

停止しているかリスナーが見つからない場合は、有効化してください。最も簡単な方法は以下を実行することです。

Enable-PSRemoting

または

winrm quickconfig

このコマンドは、WinRMサービスを起動し、ポート5985(HTTP)と5986(HTTPS)のファイアウォールルールを設定し、リスナーを作成し、デフォルトのPowerShellセッション構成を登録するなど、様々な処理を裏で実行します。特にドメイン非依存環境では、ファイアウォールルールを手動で調整する必要がある場合や、ネットワークプロファイルに関するエラーが発生する場合があることにご注意ください。

を実行するとwinrm quickconfig、上記のすべてが自動的に実行されます。一部の設定、特にワークグループやパブリックネットワークの種類では、ネットワークプロファイルの制限に関するエラーが表示される場合があります。これを回避するには、次のコマンドを実行してください。

Enable-PSRemoting –SkipNetworkProfileCheck -Force

すると、ネットワークがパブリックに設定されている場合でも、すべて設定が完了します。ただし、セキュリティ保護されていないネットワークでは、WinRM で HTTPS を設定しない限り、リモートトラフィックは暗号化されないため、ご注意ください。

その後、リスナーが次のように設定されているかどうかを確認します。

WinRM enumerate winrm/config/listener

すべてがスムーズに進んだ場合、ポート 5985 に HTTP リスナーが表示されます。リモート コマンドが機能するかどうかをテストするには、次のコマンドを使用して信頼できるマシンに接続してみてください。

Test-WSMan -ComputerName TargetComputerName

エラーが返されなければ成功です。その後、次のコマンドでリモートセッションを開始できます。

  • Enter-PSSession -ComputerName TargetComputerName
  • Invoke-Command -ComputerName TargetComputerName -ScriptBlock { Get-Process }

注: 一部の設定では、特に IP 経由で接続する場合やワークグループで接続する場合は、リモート マシンを TrustedHosts リストに追加する必要がある場合があります。

Set-Item wsman:\localhost\client\TrustedHosts -Value "TargetIPOrName" -Force

または、手っ取り早く、すべてを許可します:

Set-Item wsman:\localhost\client\TrustedHosts -Value *

ほとんどの場合、これでリモート接続ができるようになります。ただし、デフォルトのKerberos認証は、両方のマシンが同じADドメインに属している場合にのみ機能します。そうでない場合は、HTTPSまたはNTLM(セキュリティレベルは低くなります)が必要になります。

管理者以外のユーザーによるリモート PowerShell アクセスを許可する

通常、PowerShell を使用してリモート接続できるのは、ローカルの Administrators グループまたは「Remote Management Users」グループのメンバーのみです。ただし、権限のないユーザーにもアクセスを許可したい場合は、すべての管理者権限を付与することなく、アクセスを許可することも可能です。

通常ユーザーとして接続しようとすると、「アクセス拒否」エラーが表示される可能性があります。これは当然のことです。デフォルトの権限では、特定のグループのみがアクセスを許可されます。

(Get-PSSessionConfiguration -Name Microsoft. PowerShell).Permission

これは通常、次のような組み込みグループに対して「AccessAllowed」を返します。

  • 管理者
  • リモート管理ユーザー

したがって、ユーザーにリモート接続の権限を与えるには、そのユーザーを「リモート管理ユーザー」グループに追加するだけです。

Add-LocalGroupMember -Group "Remote Management Users" -Member "username"

コマンドラインまたはGUI(「コンピューターの管理」>「ローカルユーザーとグループ」)から実行できます。追加したら、そのユーザーで再度接続してみてください。問題なく動作するはずです。

PowerShell セッション構成の正確なセキュリティ権限を調整する必要がある場合は、次のコマンドでセキュリティ記述子 UI を開くことができます。

Set-PSSessionConfiguration -Name Microsoft. PowerShell -showSecurityDescriptorUI

ここでは、特定のユーザー/グループを追加したり、「フルコントロール」/「実行」権限を設定したりできます。上級者であれば、現在の権限を文字列としてエクスポートすると、システム間での複製に便利です。

(Get-PSSessionConfiguration -Name "Microsoft. PowerShell").SecurityDescriptorSDDL

その後、次のようにして同じ権限を他の場所に割り当てることができます。

$SDDL = "..." // your SDDL string"
Set-PSSessionConfiguration -Name Microsoft. PowerShell -SecurityDescriptorSddl $SDDL

これにより、PowerShell コマンドをリモートで実行できるユーザーを微調整できるため、安全性を保ちながら柔軟性も維持できます。

必要のないときに PowerShell リモート処理を無効にする方法

これをオフにしたい場合は、次のコマンドを実行します。

Disable-PSRemoting -Force

これにより、WinRMサービスが停止し、リスナーが削除され、ファイアウォールルールが無効化されます。ただし、すべての設定が自動的に元に戻るわけではないため、リスナーを手動で削除する必要がある場合があります。

Remove-Item -Path WSMan:\Localhost\Listener\listener* -Recurse

最後に、WinRM サービスを停止して無効にします。

Stop-Service WinRM; Set-Service WinRM -StartupType Disabled -PassThru

また、オフラインで使用しようと考えている場合は、ファイアウォール ルールを無効にすることを忘れないでください。

Get-NetFirewallRule -DisplayGroup "Windows Remote Management" | Where-Object {$_. Enabled -eq "True"} | Disable-NetFirewallRule 

ローカル アカウント トークンによるリモート管理アクセス (特に管理者) を防止するには、レジストリ キー "LocalAccountTokenFilterPolicy" を次のように調整する必要がある場合もあります。

reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v "LocalAccountTokenFilterPolicy" /t REG_DWORD /d 0 /f

追加: 必要に応じて Exchange ユーザーのリモート PowerShell をオフにする

Exchange Server(またはExchange Online)を管理している場合、ユーザーによるリモートPowerShellへのアクセスがデフォルトで有効になっていることがよくあります。しかし、セキュリティの観点から、特に管理者以外のユーザーやサービスアカウントについては、アクセスを制限することをお勧めします。リモートPowerShellの権限を持つユーザーは、以下のコマンドで確認できます。

Get-User -ResultSize Unlimited -Filter 'RemotePowerShellEnabled -eq $true'

次のコマンドを実行して、特定のユーザーのリモート アクセスをオフにします。

Set-User -Identity "[email protected]" -RemotePowerShellEnabled $false

これにより、セキュリティが強化され、権限の低いアカウントによる偶発的なアクションや悪意のあるアクションを防ぐことができます。

まとめ

PowerShell Remoting の導入はそれほど複雑ではありませんが、ネットワークプロファイル、ファイアウォール設定、権限設定など、いくつか落とし穴があります。一度設定してしまえば、複数の.remote サーバーやマシンを管理する際に、大幅な時間節約につながります。特にパブリックネットワークやセキュリティの低い環境では、セキュリティに留意し、変更後は必ずテストを実施してください。

まとめ

  • Enable-PSRemotingまたはでPSRemotingを有効にするwinrm quickconfig
  • サービスとリスナーのステータスを確認する
  • 必要に応じて信頼できるホストを追加する
  • グループ経由で管理者以外のユーザーにリモートアクセスを許可する
  • 不要になったら無効にするDisable-PSRemoting

これが役に立つことを祈る