【Management】PowerShell V3.0 で向上したリモーティング機能 その1

現行の Windows PowerShell 2.0 では、「リモーティング」と呼ばれる機能がサポートされています。リモーティングとは、「リモートコンピュータに対する操作」のことです。

運用管理を自動化するにはリモーティングは欠かせない機能ですので、PowerShell ユーザーの方はぜひ押さえておきましょう。

【PowerShell 2.0 でサポートされているリモーティング】

PowerShell のリモーティングの使い方は、大きく 4 種類に分かれます。

  • コマンドレットの –ComputerName パラメタを使用する

(例)Get-Service -ComputerName Server01

ただし、全てのコマンドに –ComputerName が実装されているわけではないので、以下に示すような方法を使用する必要があります。

  • Enter-PSSession / Exit-PSSession

telnet や ssh のようにリモートコンピュータとセッションを構築し、その中でコマンドレットを実行することができます。セッションの有効期間は、Enter-PSSession 実行から Exit-PSSession 実行までです。

PS> Enter-PSSession -ComputerName Server1 [Server1]: PS > $A = 1 [Server1]: PS > $B = 2 [Server1]: PS > $C = $A + $B [Server1]: PS > 3 PS> Exit-PSSession

  • Invoke-Command

以下のように Invoke-Command を使用すると、-ComputerName で指定したコンピュータに対してコマンドレットを投げ、その結果だけを受け取ります。セッションはその都度消滅するので、例えば上の例のように、$C = $A + $B の計算結果が 3 にはなりません。なぜならば、セッションが消滅してしまうので、セッション中の変数も消滅してしまうからです。

PS C:\> Invoke-Command -ComputerName junichia-vdi -ScriptBlock {$A = 1}
PS C:\> Invoke-Command -ComputerName junichia-vdi -ScriptBlock {$B = 2}
PS C:\> Invoke-Command -ComputerName junichia-vdi -ScriptBlock {$C = $A + $B}
  • 永続化されたセッションを使用する

セッションを永続化するには、New-PSSession コマンドレットを使用します。以下の例では、Server1 との間に TestSession という名前のセッションを作成しています。作成したセッションに入り込むには、Enter-PSSession に –Name <セッション名> を指定します。Invoke-Command でも セッション名を指定してコマンドを送信することができます。

PS C:\> New-PSSession -ComputerName Server1 -Name TestSession PS C:\> Enter-PSSession -Name TestSession [Server1]: PS C:\> $A = 1 [Server1]: PS C:\> $B = 2 [Server1]: PS C:\> $C = $A + $B [Server1]: PS C:\> $C 3 [Server1]: PS C:\> Exit-PSSession PS C:\>

作成したセッションは、削除しなければそのまま残ります。現在保持しているセッションの一覧を取得するには、Get-PSSession を使用します。

PS C:\> Get-PSSession

Id Name ComputerName State ConfigurationName Availability -- ---- ------------ ----- ----------------- ------------ 1 TestSession Server1 Opened Microsoft.PowerShell Available

保持しているセッションはローカルコンピューターが再起動されない限り永続化されるので、再度 Enter-PSSession を使用して接続することができます。

ただし、作成したセッションを別のクライアントから使用することはできません。これは、PowerShell 2.0 ではセッション情報がローカルコンピューターに保持されるためです。

また、ローカルコンピューターを再起動してしまうと、作成したセッションは消滅してしまいます。

さらに、リモートコンピュータが再起動されるとセッションは破壊され、接続することができなくなります。

PS C:\> Get-PSSession -ComputerName Server1

Id Name ComputerName State ConfigurationName Availability -- ----------- ------------ ----- ----------------- ------------ 2  TestSession Server1      Broken Microsoft.PowerShell None

PS C:\> Enter-PSSession -Name TestSession

Enter-PSSession : セッションが開かれている必要があります。 発生場所 行:1 文字:16 + Enter-PSSession <<<< -Name tmpsession + CategoryInfo : InvalidArgument: (:) [Enter-PSSession]、ArgumentException + FullyQualifiedErrorId : PushedRunspaceMustBeOpen,Microsoft.PowerShell.Commands.EnterPSSessionCommand

ちなみに、セッションの利用が完了したら、Remove-PSSession でセッションを削除することができます。

PS C:\>Remove-PSSession -Name TestSession

次の投稿で、PowerShell 3.0 で改善されたセッション永続化について解説します。

つづき 【Management】PowerShell V3.0 で向上したリモーティング機能 その2