リモート
PowerShellで複数のPC間で通信・制御する方法
PowerShellの遠隔操作
- WinRM
- ssh(PowerShell 6以降)
WinRMの場合
準備
2台のPCを用意します。(ローカルPC、リモートPC)
PowerShellを管理者権限で起動する。
1行目は、WinRMを有効にする設定。
2行目は、WinRMに信頼できる接続先を設定する。「-Value *」で全ホストを信頼としている。接続先を制限したい場合は、ここで指定します(非ドメイン環境用)。
PS> Enable-PSRemoting -Force
PS> Set-Item wsman:\localhost\Client\TrustedHosts -Value * -Force # 非ドメイン環境ではこちらも追加で実施する
対話型セッションを開始する Enter-PSSession
Enter-PSSessionコマンドレットで対話型セッションを開始する。exitなどで終了できます。
このコマンドに限らず「-Credential」で資格情報を指定して開始できます。
PS C:\Users\user\Desktop> Enter-PSSession -ComputerName COMPUTER0001
[COMPUTER0001]: PS C:\Users\user\Documents> exit
PS C:\Users\user\Desktop> Enter-PSSession -ComputerName COMPUTER0001 -Credential UserName
[COMPUTER0001]: PS C:\Users\UserName\Documents>
リモートでコマンドを実行する Invoke-Command
スクリプトブロックを指定できる。
PS C:\Users\user\Desktop> Invoke-Command -ComputerName COMPUTER0001 {Get-Process}
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName PSComputerName
------- ------ ----- ----- ------ -- -- ----------- --------------
51 4 1872 3840 0.02 2072 0 Process COMPUTER0001
~以下略~
スクリプトファイルを指定できる。
# script.sp1の中身は「hostname」
PS C:\Users\user\Desktop> Invoke-Command -ComputerName COMPUTER0001 -FilePath .\hostname.ps1
COMPUTER0001
PSセッションの利用
コマンドレットを使用する時に「-ComputerName」を直接指定すると、
コマンドレットの実行のたびにPSセッションが生成・消滅する。
PSセッションを継続させたい場合は、セッションを作成する。
PS C:\Users\user\Desktop> Invoke-Command -ComputerName COMPUTER0001 {$test = "test"}
PS C:\Users\user\Desktop> Invoke-Command -ComputerName COMPUTER0001 {$test}
PS C:\Users\user\Desktop> # $testの中身が表示されない。PSセッションが生成・消滅しているため。
PS C:\Users\user\Desktop> $session = New-PSSession COMPUTER0001
PS C:\Users\user\Desktop> Invoke-Command $session {$test = "test"}
PS C:\Users\user\Desktop> Invoke-Command $session {$test}
test # $testの中身が表示された。$sessionにPSセッションを保存しているから。
PS C:\Users\user\Desktop> Enter-PSSession $session # 他のコマンドレットでも$sessionは使える
[COMPUTER0001]: PS C:\Users\user\Documents> $test
test
堅牢なセッションと再接続
PowerShell V3以降。 リモートセッションは、切断/再接続ができる。
PS C:\Users\user\Desktop> New-PSSession COMPUTER0001
Id Name ComputerName ComputerType State ConfigurationName Availability
-- ---- ------------ ------------ ----- ----------------- ------------
11 Session11 COMPUTER0001 RemoteMachine Opened Microsoft.PowerShell Available
PS C:\Users\user\Desktop> $session = Get-PSSession -Id 11
PS C:\Users\user\Desktop> Invoke-Command $session {$a = 1}
PS C:\Users\user\Desktop> Disconnect-PSSession $session
Id Name ComputerName ComputerType State ConfigurationName Availability
-- ---- ------------ ------------ ----- ----------------- ------------
11 Session11 COMPUTER0001 RemoteMachine Disconnected Microsoft.PowerShell None
# ↑OpenedからDisconnectedになった
ここでコンソールを閉じて、別のコンソールを立ち上げる。
PS C:\Users\user\Desktop> Get-PSSession
PS C:\Users\user\Desktop> Get-PSSession -ComputerName COMPUTER0001
Id Name ComputerName ComputerType State ConfigurationName Availability
-- ---- ------------ ------------ ----- ----------------- ------------
1 Session11 COMPUTER0001 RemoteMachine Disconnected Microsoft.PowerShell None
PS C:\Users\user\Desktop> $savedSession = Get-PSSession -ComputerName COMPUTER0001
PS C:\Users\user\Desktop> Connect-PSSession $savedSession
Id Name ComputerName ComputerType State ConfigurationName Availability
-- ---- ------------ ------------ ----- ----------------- ------------
2 Session11 COMPUTER0001 RemoteMachine Opened Microsoft.PowerShell Available
PS C:\Users\user\Desktop> Invoke-Command $savedSession {$a}
1 # $先程代入した値も格納されている
スポンサーリンク