リモート

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   # $先程代入した値も格納されている

スポンサーリンク