🎮

[PowerShell]PSSessionを使いリモート接続してCLIで操作する方法

2023/09/05に公開

概要

こちらの記事で自動変数「 $PSSenderInfo 」を調べた際、PSSessionでリモート接続して確認しました。

思いのほか事前の設定や設定の切り戻しが面倒だったので個別の記事として紹介します。

この記事のターゲット

  • Windowsユーザーの方
    ここではWindowsユーザーに限定していますが、PowerShellはmacOSやLinuxでも動作可能な為、
    他のOSでも実行できると思われます。(未検証)
  • PowerShell CLI(コマンドレット)で他の端末にリモート接続したい方
  • リモート接続元と接続先がスタンドアローン環境の方
    未検証ですが参考にしたリンクの情報では、Active Directoryによるドメイン参加している環境でも実現可能との記載がありました。

環境

PowerShellのバージョン
PS C:\WINDOWS\system32> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.19041.3031
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.3031
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1


PS C:\WINDOWS\system32>
スタンドアローン環境(PartOfDomain = False)である事を確認
PS C:\WINDOWS\system32> (Get-WMIObject Win32_ComputerSystem).PartOfDomain
False
PS C:\WINDOWS\system32>

参考情報:ドメイン参加有無をコマンドで確認する方法

https://zenn.dev/haretokidoki/articles/e295b7da5f8a21

事前の設定なくPSSessionコマンドを実行すると

エラーにより異常終了します。

コピー用
New-PSSession -ComputerName XXXX
PS C:\WINDOWS\system32> New-PSSession -ComputerName XXXX
New-PSSession : [XXXX] リモート サーバー XXXX への接続に失敗し、次のエラー メッセージが返されました: クライアン
トは、要求で指定された接続先に接続できません。 接続先のサービスが実行されていて、要求を受け付けられる状態であることを確
認してください。 接続先で実行されている WS-Management サービス (通常は IIS または WinRM) に関するログとドキュメントを参
照してください。 接続先が WinRM サービスの場合は、リモート ホスト上で次のコマンドを実行して、WinRM サービスを分析および
構成してください: "winrm quickconfig"詳細については、about_Remote_Troubleshooting のヘルプ トピックを参照してください。
発生場所 行:1 文字:1
+ New-PSSession -ComputerName XXXX
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OpenError: (System.Manageme....RemoteRunspace:RemoteRunspace) [New-PSSession], PSRemotin
   gTransportException
    + FullyQualifiedErrorId : CannotConnect,PSSessionOpenFailed
PS C:\WINDOWS\system32>

参考情報:他のPSSession関連のコマンドレット

コピー用
help *PSSession
helpコマンドで一覧を表示
PS C:\WINDOWS\system32> help *PSSession

Name                              Category  Module                    Synopsis
----                              --------  ------                    --------
Connect-PSSession                 Cmdlet    Microsoft.PowerShell.Core Reconnects to disconnected sessions.
Disconnect-PSSession              Cmdlet    Microsoft.PowerShell.Core Disconnects from a session.
Enter-PSSession                   Cmdlet    Microsoft.PowerShell.Core Starts an interactive session with a remote co...
Exit-PSSession                    Cmdlet    Microsoft.PowerShell.Core Ends an interactive session with a remote comp...
Get-PSSession                     Cmdlet    Microsoft.PowerShell.Core Gets the PowerShell sessions on local and remo...
New-PSSession                     Cmdlet    Microsoft.PowerShell.Core Creates a persistent connection to a local or ...
Receive-PSSession                 Cmdlet    Microsoft.PowerShell.Core Gets results of commands in disconnected sessions
Remove-PSSession                  Cmdlet    Microsoft.PowerShell.Core Closes one or more PowerShell sessions (PSSess...
Export-PSSession                  Cmdlet    Microsoft.PowerShell.U... Exports commands from another session and save...
Import-PSSession                  Cmdlet    Microsoft.PowerShell.U... Imports commands from another session into the...



PS C:\WINDOWS\system32>

対応方法

事前設定

PSSession関連のコマンドを実行する為には接続元と接続先で設定を変更する必要があります。

接続先の設定

  1. PowerShell CLIを管理者として実行

  2. PSRemothingの有効化

    コピー用
    Enable-PSRemoting -SkipNetworkProfileCheck
    
    PS C:\WINDOWS\system32> Enable-PSRemoting -SkipNetworkProfileCheck
    WinRM は要求を受信するように更新されました。
    WinRM サービスの種類を正しく変更できました。
    WinRM サービスが開始されました。
    
    WinRM はリモート管理用に更新されました。
    WinRM ファイアウォールの例外を有効にしました。
    ローカル ユーザーにリモートで管理権限を付与するよう LocalAccountTokenFilterPolicy を構成しました。
    
    PS C:\WINDOWS\system32>
    PS C:\WINDOWS\system32>
    

接続元の設定

  1. PowerShell CLIを管理者として実行
  2. PSRemothingの有効化
    上記の接続先の設定と同様「Enable-PSRemoting」コマンドを実行。
  3. 信頼できる接続先を設定
    • 作業前の状態

      コピー用
      Get-Item WSMan:\localhost\Client\TrustedHosts
      
      PS C:\WINDOWS\system32> Get-Item WSMan:\localhost\Client\TrustedHosts
      
      
         WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Client
      
      Type            Name                           SourceOfValue   Value
      ----            ----                           -------------   -----
      System.String   TrustedHosts
      
      
      PS C:\WINDOWS\system32>
      
    • 接続先の許可設定

      • 接続先の許可設定(接続先を指定して許可した場合)
        今回はこちらの設定を実施

        コピー用
        Set-Item WSMan:\localhost\Client\TrustedHosts -Value "192.168.XXX.XXX, Windows10.intra.local"
        
        接続先を指定して許可
        PS C:\WINDOWS\system32> Set-Item WSMan:\localhost\Client\TrustedHosts -Value "192.168.XXX.XXX, Windows10.intra.local"
        
        WinRM セキュリティの構成。
        このコマンドは WinRM クライアントの TrustedHosts の一覧を変更します。TrustedHosts
        の一覧内にあるコンピューターは認証されない可能性があります。クライアントはこれらのコンピューターに資格情報を送信する可
        能性があります。この一覧を変更しますか?
        [Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): y
        PS C:\WINDOWS\system32>
        PS C:\WINDOWS\system32>
        

      • 接続先の許可設定(すべての接続先を許可した場合)
        参考情報。今回はこの設定は実施していない。
        特定の接続先ではなくすべての接続先を許可する場合のコマンド。セキュリティの観点で見ると実施しない方が良い。

        コピー用
        Set-Item WSMan:\localhost\Client\TrustedHosts -Value "*"
        
        すべての接続先を許可
        PS C:\WINDOWS\system32> Set-Item WSMan:\localhost\Client\TrustedHosts -Value "*"
        
    • 作業後の状態
      今回は接続先を指定して許可の設定を行い設定内容に反映された事を確認。

      コピー用
      Get-Item WSMan:\localhost\Client\TrustedHosts
      
      PS C:\WINDOWS\system32> Get-Item WSMan:\localhost\Client\TrustedHosts
      
      
          WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Client
      
      Type            Name                           SourceOfValue   Value
      ----            ----                           -------------   -----
      System.String   TrustedHosts                                   192.168.XXX.XXX, Windows10.intra.local
      
      
      PS C:\WINDOWS\system32>
      

事前設定の切り戻し手順

これまでの手順の通り設定する際は簡単ですが、設定の切り戻しは手順が多く面倒です。
必要な場合、ご確認ください。

接続先の設定戻し

事前設定の切り戻し手順 - 接続先の設定戻し < クリックで折りたたみが開く >
  1. PowerShell CLIを管理者として実行

  2. PSRemotingの無効化

    • 作業前の状態
      Permission(権限)が「 AccessAllowed 」である事。

      コピー用
      Get-PSSessionConfiguration | Format-Table -Property Name, Permission
      
      PS C:\WINDOWS\system32> Get-PSSessionConfiguration | Format-Table -Property Name, Permission
      
      Name                          Permission
      ----                          ----------
      microsoft.powershell          NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\...
      microsoft.powershell.workflow BUILTIN\Administrators AccessAllowed, BUILTIN\Remote Management Users AccessAllowed
      microsoft.powershell32        NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Administrators AccessAllowed, BUILTIN\...
      
      
      PS C:\WINDOWS\system32>
      
    • PSRemotingの無効化を実行

      コピー用
      Disable-PSRemoting
      
      PS C:\WINDOWS\system32> Disable-PSRemoting
      警告: セッション構成を無効にしても、Enable-PSRemoting または Enable-PSSessionConfiguration
      コマンドレットによる変更がすべて元に戻るわけではありません。次の手順に従って、手動で変更を元に戻す必要がある可能性があ
      ります。
          1. WinRM サービスを停止または無効にします。
          2. IP アドレスを使用して要求を受け付けるリスナーを削除します。
          3. WS-Management 通信用のファイアウォール例外を無効にします。
          4. LocalAccountTokenFilterPolicy の値を 0 に戻します。これにより、リモート アクセスがこのコンピューターの
      Administrators グループのメンバーに制限されます。
      PS C:\WINDOWS\system32>
      

      上記のメッセージで記載されている4点が手動で戻す必要がある設定です。

    • 作業後の状態
      Permission(権限)が「 AccessDenied 」に変更された事。

      コピー用
      Get-PSSessionConfiguration | Format-Table -Property Name, Permission
      
      PS C:\WINDOWS\system32> Get-PSSessionConfiguration | Format-Table -Property Name, Permission
      
      Name                          Permission
      ----                          ----------
      microsoft.powershell          NT AUTHORITY\NETWORK AccessDenied, NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Adm...
      microsoft.powershell.workflow NT AUTHORITY\NETWORK AccessDenied, BUILTIN\Administrators AccessAllowed, BUILTIN\Remot...
      microsoft.powershell32        NT AUTHORITY\NETWORK AccessDenied, NT AUTHORITY\INTERACTIVE AccessAllowed, BUILTIN\Adm...
      
      
      PS C:\WINDOWS\system32>
      
  3. 無効化後の事後作業

    • HTTP WinRM リスナーを削除
      無効化時にメッセージでは“IP アドレスを使用して要求を受け付けるリスナー”とあり、
      わかり難いメッセージですが、“HTTP WinRM リスナー”の事を指しています。

      1. 削除対象のリスナー名を取得

        コピー用
        dir wsman:\localhost\listener
        
        PS C:\WINDOWS\system32> dir wsman:\localhost\listener
        
        
        WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Listener
        
        Type            Keys                                Name
        ----            ----                                ----
        Container       {Transport=HTTP, Address=*}         Listener_1084132640
        
        
        PS C:\WINDOWS\system32>
        

        上記のコマンド結果では、リスナー名「 Listener_1084132640 」が削除対象。

      2. 指定のリスナー名を削除

        コピー用
        Remove-Item -Path WSMan:\Localhost\listener\Listener_1084132640
        
        PS C:\WINDOWS\system32> Remove-Item -Path WSMan:\Localhost\listener\Listener_1084132640
        
        確認
        WSMan:\localhost\Listener\Listener_1084132640 の項目には子があり、Recurse
        パラメーターが指定されていませんでした。続行した場合、項目と共にすべての子が削除されます。続行しますか?
        [Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): y
        PS C:\WINDOWS\system32>
        
      3. 対象のリスナーが削除された事を確認
        今回の環境ではリスナーが1つのみで削除された為、何も表示されない。

        コピー用
        dir wsman:\localhost\listener
        
        PS C:\WINDOWS\system32> dir wsman:\localhost\listener
        PS C:\WINDOWS\system32>
        
    • WinRM(Windows Remote Management)のサービスの停止とスタートアップの種類の変更

      1. 作業前の状態
        ステータスが「 Running(実行中) 」であることを確認。
        ※ このコマンドでは“スタートアップの種類”は確認不可。確認方法は、GUIでサービス画面(services.msc)を確認するか自作のスクリプトで確認する方法がある。

        コピー用
        Get-Service WinRM
        
        PS C:\WINDOWS\system32> Get-Service WinRM
        
        Status   Name               DisplayName
        ------   ----               -----------
        Running  WinRM              Windows Remote Management (WS-Manag...
        
        
        PS C:\WINDOWS\system32>
        
        参考:スタートアップの種類を自作スクリプトで確認する場合 < クリックで折りたたみが開く >
        • 確認結果

          コピー用
          # 情報を取得し変数に代入
          $triggers = Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Services" |
              Where-Object { $_.GetSubkeyNames().Contains("TriggerInfo") } |
              ForEach-Object { $_.Name.Split("\")[-1] }
          
          $startMode = @{ Manual = "手動"; Disabled = "無効"; Auto = "自動"; Unknown = "不明" }
          $startOption = @{ 01 = " (トリガー開始)"; 10 = " (遅延開始)"; 11 = " (遅延開始、トリガー開始)" }
          
          $serviceData = Get-CimInstance -ClassName Win32_Service | Select-Object @(
              @{ n = "表示名";              e = { $_.DisplayName } }
              @{ n = "サービス名";          e = { $_.Name } }
              @{ n = "スタートアップの種類"; e = { $startMode[$_.StartMode] + $startOption[10 * ($_.StartMode -eq "Auto" -and $_.DelayedAutoStart) + $triggers.Contains($_.Name)] } }
              @{ n = "状態";                e = { if($_.State -eq "Running") { "実行" } else { "停止" } } }
          )
          
          # 変数の内容を見やすく表示
          $serviceData | select サービス名,スタートアップの種類,状態 | Where-Object {$_.サービス名 -eq 'WinRM'}
          
          コマンド結果
          PS C:\WINDOWS\system32> $triggers = Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Services" |
          >>     Where-Object { $_.GetSubkeyNames().Contains("TriggerInfo") } |
          >>     ForEach-Object { $_.Name.Split("\")[-1] }
          >>
          >> $startMode = @{ Manual = "手動"; Disabled = "無効"; Auto = "自動"; Unknown = "不明" }
          >> $startOption = @{ 01 = " (トリガー開始)"; 10 = " (遅延開始)"; 11 = " (遅延開始、トリガー開始)" }
          >>
          >> $serviceData = Get-CimInstance -ClassName Win32_Service | Select-Object @(
          >>     @{ n = "表示名";              e = { $_.DisplayName } }
          >>     @{ n = "サービス名";          e = { $_.Name } }
          >>     @{ n = "スタートアップの種類"; e = { $startMode[$_.StartMode] + $startOption[10 * ($_.StartMode -eq "Auto" -and $_.DelayedAutoStart) + $triggers.Contains($_.Name)] } }
          >>     @{ n = "状態";                e = { if($_.State -eq "Running") { "実行" } else { "停止" } } }
          >> )
          >> $serviceData | select サービス名,スタートアップの種類,状態 | Where-Object {$_.サービス名 -eq 'WinRM'}
          
          サービス名 スタートアップの種類 状態
          ---------- -------------------- ----
          WinRM      自動 (遅延開始)      実行
          
          
          PS C:\WINDOWS\system32>
          
        • 参考情報
          https://qiita.com/Mr-K/items/0ab787135eb4ec3b3a1c

      2. WinRMのサービス停止
        ステータスが「 Stopped(停止中) 」に変更されたことを確認。
        ※ このコマンドでは“スタートアップの種類”は確認不可。確認方法は、GUIでサービス画面(services.msc)を確認するか自作のスクリプトで確認する方法がある。

        コピー用
        Stop-Service WinRM -PassThru
        
        PS C:\WINDOWS\system32> Stop-Service WinRM -PassThru
        
                    Status   Name               DisplayName
                    ------   ----               -----------
                    Stopped  WinRM              Windows Remote Management (WS-Manag...
        
        
                    PS C:\WINDOWS\system32>
        
      3. WinRMのスタートアップの種類を「 手動 」に変更

        コピー用
        Set-Service WinRM -StartupType Manual -PassThru
        
        PS C:\WINDOWS\system32> Set-Service WinRM -StartupType Manual -PassThru
        
        Status   Name               DisplayName
        ------   ----               -----------
        Stopped  WinRM              Windows Remote Management (WS-Manag...
        
        
        PS C:\WINDOWS\system32>
        
        • サービス画面より手動になった事を確認
          サービス画面よりWindows Remote Management (WS-Management)”のスタートアップの種類が「 手動 」になったことを確認
          画像:サービス - “Windows Remote Management (WS-Management)”の状態

          参考:スタートアップの種類を自作スクリプトで確認する場合 < クリックで折りたたみが開く >
          • 確認結果

            コピー用
            # 情報を取得し変数に代入
            $triggers = Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Services" |
                Where-Object { $_.GetSubkeyNames().Contains("TriggerInfo") } |
                ForEach-Object { $_.Name.Split("\")[-1] }
            
            $startMode = @{ Manual = "手動"; Disabled = "無効"; Auto = "自動"; Unknown = "不明" }
            $startOption = @{ 01 = " (トリガー開始)"; 10 = " (遅延開始)"; 11 = " (遅延開始、トリガー開始)" }
            
            $serviceData = Get-CimInstance -ClassName Win32_Service | Select-Object @(
                @{ n = "表示名";              e = { $_.DisplayName } }
                @{ n = "サービス名";          e = { $_.Name } }
                @{ n = "スタートアップの種類"; e = { $startMode[$_.StartMode] + $startOption[10 * ($_.StartMode -eq "Auto" -and $_.DelayedAutoStart) + $triggers.Contains($_.Name)] } }
                @{ n = "状態";                e = { if($_.State -eq "Running") { "実行" } else { "停止" } } }
            )
            
            # 変数の内容を見やすく表示
            $serviceData | select サービス名,スタートアップの種類,状態 | Where-Object {$_.サービス名 -eq 'WinRM'}
            
            コマンド結果
            PS C:\WINDOWS\system32> $triggers = Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Services" |
            >>     Where-Object { $_.GetSubkeyNames().Contains("TriggerInfo") } |
            >>     ForEach-Object { $_.Name.Split("\")[-1] }
            >>
            >> $startMode = @{ Manual = "手動"; Disabled = "無効"; Auto = "自動"; Unknown = "不明" }
            >> $startOption = @{ 01 = " (トリガー開始)"; 10 = " (遅延開始)"; 11 = " (遅延開始、トリガー開始)" }
            >>
            >> $serviceData = Get-CimInstance -ClassName Win32_Service | Select-Object @(
            >>     @{ n = "表示名";              e = { $_.DisplayName } }
            >>     @{ n = "サービス名";          e = { $_.Name } }
            >>     @{ n = "スタートアップの種類"; e = { $startMode[$_.StartMode] + $startOption[10 * ($_.StartMode -eq "Auto" -and $_.DelayedAutoStart) + $triggers.Contains($_.Name)] } }
            >>     @{ n = "状態";                e = { if($_.State -eq "Running") { "実行" } else { "停止" } } }
            >> )
            >> $serviceData | select サービス名,スタートアップの種類,状態 | Where-Object {$_.サービス名 -eq 'WinRM'}
            
            サービス名 スタートアップの種類 状態
            ---------- -------------------- ----
            WinRM      手動                 停止
            
            
            PS C:\WINDOWS\system32>
            
          • 参考情報
            https://qiita.com/Mr-K/items/0ab787135eb4ec3b3a1c

      4. 作業後の状態
        前述にもある通り下記コマンドでは、実行中(Running)か停止中(Stopped)等のステータスしかわからない。
        スタートアップの種類を確認する場合は、GUIのサービス画面(services.msc)を確認するか自作のスクリプトで確認する必要あり。

        コピー用
        Get-Service WinRM
        
        PS C:\WINDOWS\system32> Get-Service WinRM
        
        Status   Name               DisplayName
        ------   ----               -----------
        Stopped  WinRM              Windows Remote Management (WS-Manag...
        
        
        PS C:\WINDOWS\system32>
        
        参考:スタートアップの種類を自作スクリプトで確認する場合 < クリックで折りたたみが開く >
        • 確認結果

          コピー用
          # 情報を取得し変数に代入
          $triggers = Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Services" |
              Where-Object { $_.GetSubkeyNames().Contains("TriggerInfo") } |
              ForEach-Object { $_.Name.Split("\")[-1] }
          
          $startMode = @{ Manual = "手動"; Disabled = "無効"; Auto = "自動"; Unknown = "不明" }
          $startOption = @{ 01 = " (トリガー開始)"; 10 = " (遅延開始)"; 11 = " (遅延開始、トリガー開始)" }
          
          $serviceData = Get-CimInstance -ClassName Win32_Service | Select-Object @(
              @{ n = "表示名";              e = { $_.DisplayName } }
              @{ n = "サービス名";          e = { $_.Name } }
              @{ n = "スタートアップの種類"; e = { $startMode[$_.StartMode] + $startOption[10 * ($_.StartMode -eq "Auto" -and $_.DelayedAutoStart) + $triggers.Contains($_.Name)] } }
              @{ n = "状態";                e = { if($_.State -eq "Running") { "実行" } else { "停止" } } }
          )
          
          # 変数の内容を見やすく表示
          $serviceData | select サービス名,スタートアップの種類,状態 | Where-Object {$_.サービス名 -eq 'WinRM'}
          
          コマンド結果
          PS C:\WINDOWS\system32> $triggers = Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Services" |
          >>     Where-Object { $_.GetSubkeyNames().Contains("TriggerInfo") } |
          >>     ForEach-Object { $_.Name.Split("\")[-1] }
          >>
          >> $startMode = @{ Manual = "手動"; Disabled = "無効"; Auto = "自動"; Unknown = "不明" }
          >> $startOption = @{ 01 = " (トリガー開始)"; 10 = " (遅延開始)"; 11 = " (遅延開始、トリガー開始)" }
          >>
          >> $serviceData = Get-CimInstance -ClassName Win32_Service | Select-Object @(
          >>     @{ n = "表示名";              e = { $_.DisplayName } }
          >>     @{ n = "サービス名";          e = { $_.Name } }
          >>     @{ n = "スタートアップの種類"; e = { $startMode[$_.StartMode] + $startOption[10 * ($_.StartMode -eq "Auto" -and $_.DelayedAutoStart) + $triggers.Contains($_.Name)] } }
          >>     @{ n = "状態";                e = { if($_.State -eq "Running") { "実行" } else { "停止" } } }
          >> )
          >> $serviceData | select サービス名,スタートアップの種類,状態 | Where-Object {$_.サービス名 -eq 'WinRM'}
          
          サービス名 スタートアップの種類 状態
          ---------- -------------------- ----
          WinRM      手動                 停止
          
          
          PS C:\WINDOWS\system32>
          
        • 参考情報
          https://qiita.com/Mr-K/items/0ab787135eb4ec3b3a1c

    • WS-Management 通信用のファイアウォール例外を無効化

      1. 作業前の状態
        WAF(Web Application Firewall)の設定を確認

        コピー用
        Get-NetFirewallRule -Name "WINRM-HTTP-In-TCP*" | Select -Property DisplayName, Profile, Enabled
        
        PS C:\WINDOWS\system32> Get-NetFirewallRule -Name "WINRM-HTTP-In-TCP*" | Select -Property DisplayName, Profile, Enabled
        
        DisplayName                              Profile Enabled
        -----------                              ------- -------
        Windows リモート管理 (HTTP 受信) Domain, Private    True
        Windows リモート管理 (HTTP 受信)          Public    True
        
        
        PS C:\WINDOWS\system32>
        
      2. WS-Management 通信用のファイアウォール例外を無効
        無効化コマンドを実行後、変更後のステータスが自動で表示される。

        コピー用
        Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP*" -Enabled False -PassThru | Select -Property DisplayName, Profile, Enabled
        
        PS C:\WINDOWS\system32> Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP*" -Enabled False -PassThru | Select -Property DisplayName, Profile, Enabled
        
        DisplayName                              Profile Enabled
        -----------                              ------- -------
        Windows リモート管理 (HTTP 受信) Domain, Private   False
        Windows リモート管理 (HTTP 受信)          Public   False
        
        
        PS C:\WINDOWS\system32>
        
    • ローカル ユーザーのリモート管理権限のオフ(スタンドアローン環境のみ実施)
      レジストリーのLocalAccountTokenFilterPolicy の値を「 1 」から「 0 」に戻す。

      1. 作業前の状態
        下記の通り「 LocalAccountTokenFilterPolicy : 1 」である事を確認

        コピー用
        Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system -Name LocalAccountTokenFilterPolicy
        
        PS C:\WINDOWS\system32> Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system -Name LocalAccountTokenFilterPolicy
        
        
        LocalAccountTokenFilterPolicy : 1
        PSPath                        : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curre
                                        ntVersion\policies\system
        PSParentPath                  : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curre
                                        ntVersion\policies
        PSChildName                   : system
        PSDrive                       : HKLM
        PSProvider                    : Microsoft.PowerShell.Core\Registry
        
        
        
        PS C:\WINDOWS\system32>
        
      2. ローカル ユーザーのリモート管理権限のオフ

        コピー用
        Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system -Name LocalAccountTokenFilterPolicy -Value 0
        
        PS C:\WINDOWS\system32> Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system -Name LocalAccountTokenFilterPolicy -Value 0
        PS C:\WINDOWS\system32>
        
      3. 作業後の状態
        下記の通り「 LocalAccountTokenFilterPolicy : 0 」に変更されている事を確認

        コピー用
        Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system -Name LocalAccountTokenFilterPolicy
        
        PS C:\WINDOWS\system32> Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system -Name LocalAccountTokenFilterPolicy
        
        
        LocalAccountTokenFilterPolicy : 0
        PSPath                        : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curre
                                        ntVersion\policies\system
        PSParentPath                  : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curre
                                        ntVersion\policies
        PSChildName                   : system
        PSDrive                       : HKLM
        PSProvider                    : Microsoft.PowerShell.Core\Registry
        
        
        
        PS C:\WINDOWS\system32>
        

接続元の設定戻し

事前設定の切り戻し手順 - 接続元の設定戻し < クリックで折りたたみが開く >
  • 信頼できる接続先の削除

    1. 作業前の状態

      コピー用
      Get-Item WSMan:\localhost\Client\Trustedhosts
      
      PS C:\WINDOWS\system32> Get-Item WSMan:\localhost\Client\Trustedhosts
      
      
      WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Client
      
      Type            Name                           SourceOfValue   Value
      ----            ----                           -------------   -----
      System.String   TrustedHosts                                   192.168.XXX.XXX, Windows10.intra.local
      
      
      PS C:\WINDOWS\system32>
      
    2. 設定のクリア(設定戻し)

      コピー用
      Clear-Item WSMan:\localhost\Client\Trustedhosts
      
      PS C:\WINDOWS\system32> Clear-Item WSMan:\localhost\Client\Trustedhosts
      
      WinRM セキュリティの構成。
      このコマンドは WinRM クライアントの TrustedHosts の一覧を変更します。TrustedHosts
      の一覧内にあるコンピューターは認証されない可能性があります。クライアントはこれらのコンピューターに資格情報を送信する可
      能性があります。この一覧を変更しますか?
      [Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): y
      PS C:\WINDOWS\system32>
      
    3. 作業後の状態

      コピー用
      Get-Item WSMan:\localhost\Client\Trustedhosts
      
      PS C:\WINDOWS\system32> Get-Item WSMan:\localhost\Client\Trustedhosts
      
      
      WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Client
      
      Type            Name                           SourceOfValue   Value
      ----            ----                           -------------   -----
      System.String   TrustedHosts
      
      
      PS C:\WINDOWS\system32>
      
  • PSRemotingの無効化
    接続先の設定戻しと同様、下記の手順を実施

    • Disable-PSRemotingコマンド
    • HTTP WinRM リスナーの削除
    • WinRMのサービスの停止とスタートアップの種類の変更
    • WS-Management 通信用のファイアウォール例外を無効化

参考情報:事前設定の切り戻し手順で参考になる情報

実際にPSSessionのコマンドレットでリモート接続してみる

PSSession関連のコマンドレットそれぞれの公式リファレンスの説明文を表にしてみました。

コマンド名 使用用途
Connect-PSSession 切断されたセッションに再接続するコマンド
Disconnect-PSSession セッションから切断するコマンド
Enter-PSSession リモートコンピューターと対話形式のセッションを開始するコマンド
Exit-PSSession リモートコンピューターと対話形式のセッションを終了する
Get-PSSession ローカルおよびリモートコンピューター上のPowerShellセッションを取得する
New-PSSession ローカルまたはリモートコンピューターへの永続的なコネクションを作成するコマンド
Receive-PSSession 切断されたセッションのコマンド結果を取得する
Remove-PSSession 1つまたは複数のPowerShellセッションを閉じる
Export-PSSession 他のセッションのコマンドをエクスポートし、PowerShellモジュールに保存する。
Import-PSSession 他のセッションのコマンドを現在のセッションにインポートする。

上記の内、今回はEnter-PSSessionNew-PSSessionを使って接続可能か検証してみます。

Enter-PSSessionによるリモート接続

リモートコンピューターと対話形式のセッションを開始するコマンド

  1. 接続先につなげる

    コピー用
    Enter-PSSession -ComputerName 192.168.XXX.XXX -Credential "ユーザー名"
    
    Enter-PSSessionコマンドの実行
    PS C:\WINDOWS\system32> Enter-PSSession -ComputerName 192.168.XXX.XXX -Credential "ユーザー名"
    [192.168.XXX.XXX]: PS D:\ドキュメント>
    

    Enter-PSSessionコマンドを実行後、表示されるアカウント認証の画面
    画像:Enter-PSSessionコマンドを打った直後、アカウント認証(資格情報の要求)が表示

  2. 接続先でコマンドを実行
    接続先の任意の場所に移動しdirコマンドを実行する。

    接続先のC
    [192.168.XXX.XXX]: PS D:\ドキュメント> cd C:\Windows\Logs\
    [192.168.XXX.XXX]: PS C:\Windows\Logs>
    [192.168.XXX.XXX]: PS C:\Windows\Logs> dir
    
    
        ディレクトリ: C:\Windows\Logs
    
    
    Mode                 LastWriteTime         Length Name
    ----                 -------------         ------ ----
    d-----        2023/08/25     11:12                CBS
    d-----        2022/11/17     10:09                DISM
    d-----        2023/08/28      8:23                DPX
    d---s-        2023/08/10     16:44                MeasuredBoot
    d-----        2023/08/10     16:10                MoSetup
    d-----        2023/08/24     16:21                NetSetup
    d-----        2021/11/25     11:28                Paragon Software
    d-----        2023/08/28      8:23                SIH
    d-----        2023/08/24     13:28                SystemRestore
    d-----        2023/08/28     13:14                waasmedic
    d-----        2023/08/28      8:25                waasmediccapsule
    d-----        2022/09/21     13:30                WindowsBackup
    d-----        2023/08/28     13:35                WindowsUpdate
    d-----        2021/10/13      5:44                WinREAgent
    -a----        2023/08/17      8:30          90031 StorGroupPolicy.log
    
    
    [192.168.XXX.XXX]: PS C:\Windows\Logs>
    [192.168.XXX.XXX]: PS C:\Windows\Logs>
    
  3. 接続先から抜ける

    exitコマンドの実行
    [192.168.XXX.XXX]: PS C:\Windows\Logs> exit
    PS C:\WINDOWS\system32>
    

New-PSSession によるリモート接続

合わせて Get-PSSession と Remove-PSSession も使用。

  1. New-PSSessionコマンドでPSSessionによるコネクション作成

    コピー用
    New-PSSession -ComputerName 192.168.XXX.XXX -Name TestTask
    
    PS C:\WINDOWS\system32> New-PSSession -ComputerName 192.168.XXX.XXX -Name TestTask
    
    Id Name            ComputerName    ComputerType    State         ConfigurationName     Availability
    -- ----            ------------    ------------    -----         -----------------     ------------
    6 TestTask        192.168.XXX.XXX RemoteMachine   Opened        Microsoft.PowerShell     Available
    
    
    PS C:\WINDOWS\system32>
    
  2. 作成できた事を確認

    コピー用
    Get-PSSession
    
    PS C:\WINDOWS\system32> Get-PSSession
    
    Id Name            ComputerName    ComputerType    State         ConfigurationName     Availability
    -- ----            ------------    ------------    -----         -----------------     ------------
    6 TestTask        192.168.XXX.XXX RemoteMachine   Opened        Microsoft.PowerShell     Available
    
    
    PS C:\WINDOWS\system32>
    
  3. PSSessionによるコネクションを削除

    コピー用
    Remove-PSSession -Name TestTask
    
    PS C:\WINDOWS\system32> Remove-PSSession -Name TestTask
    PS C:\WINDOWS\system32>
    
  4. 削除できた事を確認

    コピー用
    Get-PSSession
    
    PS C:\WINDOWS\system32> Get-PSSession
    PS C:\WINDOWS\system32>
    

公式リファレンス

https://github.com/MicrosoftDocs/PowerShell-Docs/tree/main/reference/5.1/Microsoft.PowerShell.Core
https://github.com/MicrosoftDocs/PowerShell-Docs/blob/main/reference/5.1/Microsoft.PowerShell.Utility

参考情報:本作業の実施する上で全般的に参考となる情報

まとめ

Windows環境でPSSessionを使う為の設定と方法を紹介しました。

当初はもっと簡単に設定できると思っていましたが、思い違いでした。
この記事ではWindows環境に絞って紹介しましたが、おそらく他のOS(macOS, Linux)の場合、
少し違う手順になりそうですね。機会があれば調べようと思います。

関連記事

https://haretokidoki-blog.com/pasocon_powershell-startup/
https://zenn.dev/haretokidoki/articles/7e6924ff0cc960

GitHubで編集を提案

Discussion