[PowerShell]PSSessionを使いリモート接続してCLIで操作する方法
概要
こちらの記事で自動変数「 $PSSenderInfo
」を調べた際、PSSessionでリモート接続して確認しました。
思いのほか事前の設定や設定の切り戻しが面倒だったので個別の記事として紹介します。
この記事のターゲット
- Windowsユーザーの方
ここではWindowsユーザーに限定していますが、PowerShellはmacOSやLinuxでも動作可能な為、
他のOSでも実行できると思われます。(未検証) - PowerShell CLI(コマンドレット)で他の端末にリモート接続したい方
- リモート接続元と接続先がスタンドアローン環境の方
未検証ですが参考にしたリンクの情報では、Active Directoryによるドメイン参加している環境でも実現可能との記載がありました。
環境
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>
PS C:\WINDOWS\system32> (Get-WMIObject Win32_ComputerSystem).PartOfDomain
False
PS C:\WINDOWS\system32>
参考情報:ドメイン参加有無をコマンドで確認する方法
事前の設定なく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
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関連のコマンドを実行する為には接続元と接続先で設定を変更する必要があります。
接続先の設定
-
PowerShell CLIを管理者として実行
-
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>
- 参考情報
Enable-PSRemotingに関する情報(Active Diretory ドメイン環境下における対応方法の記載もあり)
https://4sysops.com/archives/enabling-powershell-remoting-fails-due-to-public-network-connection-type/
- 参考情報
接続元の設定
- PowerShell CLIを管理者として実行
- PSRemothingの有効化
上記の接続先の設定と同様「Enable-PSRemoting」コマンドを実行。 - 信頼できる接続先を設定
-
作業前の状態
コピー用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>
-
事前設定の切り戻し手順
これまでの手順の通り設定する際は簡単ですが、設定の切り戻しは手順が多く面倒です。
必要な場合、ご確認ください。
接続先の設定戻し
事前設定の切り戻し手順 - 接続先の設定戻し < クリックで折りたたみが開く >
-
PowerShell CLIを管理者として実行
-
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>
-
-
無効化後の事後作業
-
HTTP WinRM リスナーを削除
無効化時にメッセージでは“IP アドレスを使用して要求を受け付けるリスナー”とあり、
わかり難いメッセージですが、“HTTP WinRM リスナー”の事を指しています。-
削除対象のリスナー名を取得
コピー用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
」が削除対象。 -
指定のリスナー名を削除
コピー用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>
-
対象のリスナーが削除された事を確認
今回の環境ではリスナーが1つのみで削除された為、何も表示されない。コピー用dir wsman:\localhost\listener
PS C:\WINDOWS\system32> dir wsman:\localhost\listener PS C:\WINDOWS\system32>
-
-
WinRM(Windows Remote Management)のサービスの停止とスタートアップの種類の変更
-
作業前の状態
ステータスが「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>
-
-
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>
-
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)”の状態参考:スタートアップの種類を自作スクリプトで確認する場合 < クリックで折りたたみが開く >
-
確認結果
コピー用# 情報を取得し変数に代入 $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>
-
-
-
作業後の状態
前述にもある通り下記コマンドでは、実行中(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>
-
-
-
WS-Management 通信用のファイアウォール例外を無効化
-
作業前の状態
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>
-
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
」に戻す。-
作業前の状態
下記の通り「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>
-
ローカル ユーザーのリモート管理権限のオフ
コピー用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>
-
作業後の状態
下記の通り「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>
-
-
接続元の設定戻し
事前設定の切り戻し手順 - 接続元の設定戻し < クリックで折りたたみが開く >
-
信頼できる接続先の削除
-
作業前の状態
コピー用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>
-
設定のクリア(設定戻し)
コピー用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>
-
作業後の状態
コピー用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 通信用のファイアウォール例外を無効化
参考情報:事前設定の切り戻し手順で参考になる情報
- ショートカットキー
- 「 サービス 」の起動
⊞Winキー + R → 「services.msc
」 → Ctrl + Shift + Enter - 「 コンピューターの管理 」の起動
⊞Winキー + R → 「compmgmt.msc
」 → Ctrl + Shift + Enter
- 「 サービス 」の起動
- 参考リンク
https://4sysops.com/wiki/disable-powershell-remoting-disable-psremoting-winrm-listener-firewall-and-localaccounttokenfilterpolicy/
https://www.ipentec.com/document/windows-windows-10-add-winrm-trasted-hosts
https://unarist.hatenadiary.org/entry/20131020/1382287767
実際に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-PSSession
とNew-PSSession
を使って接続可能か検証してみます。
Enter-PSSessionによるリモート接続
リモートコンピューターと対話形式のセッションを開始するコマンド
-
接続先につなげる
コピー用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コマンドを打った直後、アカウント認証(資格情報の要求)が表示 -
接続先でコマンドを実行
接続先の任意の場所に移動し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>
-
接続先から抜ける
exitコマンドの実行[192.168.XXX.XXX]: PS C:\Windows\Logs> exit PS C:\WINDOWS\system32>
New-PSSession によるリモート接続
合わせて Get-PSSession と Remove-PSSession も使用。
-
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>
-
作成できた事を確認
コピー用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>
-
PSSessionによるコネクションを削除
コピー用Remove-PSSession -Name TestTask
PS C:\WINDOWS\system32> Remove-PSSession -Name TestTask PS C:\WINDOWS\system32>
-
削除できた事を確認
コピー用Get-PSSession
PS C:\WINDOWS\system32> Get-PSSession PS C:\WINDOWS\system32>
公式リファレンス
参考情報:本作業の実施する上で全般的に参考となる情報
- Enter-PSSessionを使うまでの解説
https://www.kayura-se.com/entry/2020/03/30/004146 - Microsoft公式「PSSessionについて」
https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_pssessions?view=powershell-7.3 - Enter-PSSessionのパスワードを自動的に入力
https://yanor.net/wiki/?PowerShell/リモート接続/Enter-PSSessionのパスワード入力を自動化する
まとめ
Windows環境でPSSessionを使う為の設定と方法を紹介しました。
当初はもっと簡単に設定できると思っていましたが、思い違いでした。
この記事ではWindows環境に絞って紹介しましたが、おそらく他のOS(macOS, Linux)の場合、
少し違う手順になりそうですね。機会があれば調べようと思います。
関連記事
Discussion