Windows PowerShell によるリモート制御 ~その5 ComputerNameパラメータを持つコマンドレット ~

これまでの記事ではセッションを作成してリモート処理をする方法について紹介してきました。

PowerShell 2.0では、セッションによるリモート制御の他に、ComputerNameパラメータを利用してリモートコンピュータを制御することができます。

ComputerNameパラメータを持つコマンドレットは、下記のものがあります。

  • Clear-EventLog
  • Connect-WSMan
  • Disconnect-WSMan
  • Get-Counter
  • Get-EventLog
  • Get-HotFix
  • Get-Process
  • Get-PSSession
  • Get-Service
  • Get-WinEvent
  • Get-WmiObject
  • Get-WSManInstance
  • Invoke-WmiMethod
  • Invoke-WSManAction
  • Limit-EventLog
  • New-EventLog
  • New-WSManInstance
  • Register-WmiEvent
  • Remove-EventLog
  • Remove-WmiObject
  • Remove-WSManInstance
  • Restart-Computer
  • Set-Service
  • Set-WmiInstance
  • Set-WSManInstance
  • Show-EventLog
  • Stop-Computer
  • Test-Connection
  • Test-WSMan
  • Write-EventLog

ComputerNameパラメータを持つコマンドレットは下記のようにして調べることができます。
(これはヘルプに載っているものを少し改造したものです)

get-command | where { $_.parameters.keys -contains "ComputerName" -and 
$_.parameters.keys -notcontains "Session" -and $_.CommandType -eq "Cmdlet"}

 

ComputerNameパラメータを利用するときは、これまでのようにセッションを作成する必要はありません。

また、リモートコンピュータにPowerShellがインストールされている必要はありませんし、リモート処理用に構成されている必要もありません

たとえば、以下のコマンドはリモートコンピュータMyServe01に対してGet-HotFixコマンドレットを実行します。

Get-HotFixコマンドレットは、ローカル コンピューターまたはリモート コンピューターに適用された修正プログラムを取得します。

Get-HotFix -ComputerName MyServ01

もう1つ例を見てみましょう。次のコマンドはリモートコンピュータを再起動します。

Restart-Computer -ComputerName MyServ01

ComputerNameパラメータが提供されていないコマンドレットをリモートコンピュータで実行したい場合は、これまでに紹介したようにセッションによる操作を行ってください。

*本記事はWindows XPにインストールしたWindows PowerShell 2.0 RCで検証しております。

Windows PowerShell によるリモート制御 ~その4 複数セッションの作成と使用 ~

前回は永続的なセッションの作成と削除をする方法について説明しました。

今回は

について説明します。



New-PSSession コマンドレットを使用して、複数のセッションを作成する

前回の記事でも紹介したのですが、New-PSSessionの構文は次の通りとなっています。

[構文]New-PSSession
変数 = New-PSSession -ComputerName コンピュータ名[ , コンピューター名 [,コンピュータ名]…]

 

この構文を使用して、MyServ01というリモートマシンと、ローカルマシンの2つのセッションを同時に作成するには以下のようにします。

PS> $pss = New-PSSession -ComputerName MyServ01, localhost
Id Name            ComputerName    State    ConfigurationName     Availability
-- ----            ------------    -----    -----------------     ------------
1 Session1        MyServ01       Opened   Microsoft.PowerShell     Available
2 Session2        localhost       Opened   Microsoft.PowerShell     Available

セッションは変数に保存せずに

PS> New-PSSession -ComputerName MyServ01, localhost

とすることもできます。

この場合は、Get-PSSessionコマンドレットを使用すれば、下記のように後からでも変数に保存することができます。

PS> New-PSSession -ComputerName htaka2, localhost
PS> $pss = Get-PSSession

 


複数のセッションでコマンドを実行する

複数のセッションに対してコマンドを実行するには Invoke-Command コマンドレットを使用します。

Invoke-Commandコマンドレットの[構文]も前回紹介していますが、再掲します。

[構文]Invoke-Command
Invoke-Command -Session セッション変数 -ScriptBlock {実行するコマンド }

先ほど取得した$pssに入っている2つのセッションに対して Get-ChildItemコマンドレットを使用してみます。

次のコマンドは $pss に格納されているすべてのセッションに対して Get-ChildItem C:\Work を実行します。

Invoke-Command -Session $pss -ScriptBlock { Get-ChildItem C:\Work }
ディレクトリ: C:\Work
Mode LastWriteTime Length Name PSComputerName
---- ------------- ------ ---- --------------
d-r-- 2008/12/03 8:34 WinVista MyServ01
-a--- 2009/01/16 9:55 189434 20090116_095425.xls MyServ01
-a--- 2009/06/16 8:51 59546 cmdlet.txt localhost
-a--- 2008/08/29 10:19 172032 Dtr3035.dll localhost
-a--- 2009/06/24 9:35 4096 hiros.net.MyLib2.dll localhost

結果を見ていただくとわかるのですが、Get-ChildItemコマンドレットを実行すると、PSComputerNameという列が表示されていることがわかります。PSComputerNameはどのコンピュータの結果であるかを示しています。


特定のセッションを使用する

複数のセッションを作成したからといって、常に同時に使用するとは限りません。

作成したセッションの中から特定のセッションに対してだけ、コマンドを実行したい場合もあります。

このような場合には、最初にGet-PSSessionコマンドレットで使用したいセッションのIDを確認します。

Get-PSSession
Id Name            ComputerName    State    ConfigurationName     Availability
-- ----            ------------    -----    -----------------     ------------
1 Session1        MyServ01 Opened   Microsoft.PowerShell     Available
2 Session2        localhost       Opened   Microsoft.PowerShell     Available

次に、セッションIDを指定して、特定のセッションを変数に保存します。

たとえば、MyServ01のセッションを使用したい場合は、上記からセッションIDが1ということがわかります。

この場合は、次のように-Idパラメータを使用してセッションを変数に保存します。

$sess1 = Get-PSSession -Id 1

あとは、Invoke-Commandコマンドレットで、この変数($sess1)を使用すれば、特定のセッションにのみコマンドを実行することができます。

Invoke-Command -Session $sess1 -ScriptBlock { Get-ChildItem C:\Work }

特定のセッションを削除する

特定のセッションを削除するには、Remove-PSSession コマンドレットを使用します。

最初に、削除したいセッションのIDをGet-PSSession コマンドレットで確認しておきます。

次に、Remove-PSSession コマンドレットで-Idパラメータに削除したいIDを指定します。

下記のコマンドはIDが1のセッションを削除します。

Remove-PSSession -Id 1

 

*本記事はWindows XPにインストールしたWindows PowerShell 2.0 RCで検証しております。

Windows PowerShell によるリモート制御 ~その3 永続的なセッション編 ~

前回の記事でPowerShellにおけるセッションの話をしました。

今回は

について説明します。



New-PSSessionコマンドレットによる永続的なセッションの作成

前回のEnter-PSSessionで作成したセッションは一時的なものであり、コマンドまたは対話型のセッションが完了するとそのセッションを閉じます。

しかし、New-PSSessionコマンドレットを使用すると、複数のコマンドや対話型のセッションを実行できる永続的なセッションを作成することができます。

 

構文は

変数 = New-PSSession -ComputerName コンピュータ名[ , コンピューター名 [,コンピュータ名]…] 

です。

たとえば、MyServe01というリモートコンピュータとの永続的なセッションを作成するには

$s = New-PSSession -ComputerName MyServe01 

とします。

この場合は$sにセッション情報が作成されます。

作成されたセッションを確認するには Get-PSSessionコマンドレットを実行します

PS> Get-PSSession
Id Name            ComputerName    State    ConfigurationName     Availability
-- ----            ------------    -----    -----------------     ------------
1 Session1        MyServ01        Opened   Microsoft.PowerShell     Available 

MyServe01とのセッションの名前(Name)はSession1として作成され、開かれている(StateがOpend)ことがわかります。

このようにして作成したセッションは Invoke-Command コマンドレットで使用することができます。

構文は

Invoke-Command -Session セッション変数 -ScriptBlock {実行するコマンド}

です。

実際には、New-PSSessionで作成したセッションを代入した変数を -Sessionパラメータに指定し

Invoke-Command -Session $s -ScriptBlock { Get-date }

のように書きます。

この場合は、リモートコンピュータMyServ01 上で Get-Date コマンドレットを実行します。

このように、New-Sessionコマンドレットを使用して作成したセッションは変数に保存されているので、好きなときに何度でも使用することが可能になります。


Remove-PSSessionコマンドレットによるセッションの削除

作成したセッション(PSSession)はプロセスであるため、ユーザーが使用しない場合でもメモリなどのリソースを消費してしまいます。

要らなくなったセッションは Remove-PSSession コマンドレットで削除することができます。

このコマンドレットを使用するとPSSessionを削除し、PSSessionnによって使用されていたリソースが解放されます。

PS> Remove-PSSession

*本記事はWindows XPにインストールしたWindows PowerShell 2.0 RCで検証しております。

Windows PowerShell によるリモート制御 ~その2 セッション編(基礎)~

Windows PowerShellにおけるリモート制御を行うにはセッションについて理解しておくことをお勧めします。

ここでのセッションとは、Window PowerShell がl実行される環境のことを指します。 と言ってもなんだか理解しがたいですね。

通常 PowerShellを起動すると、コマンドを実行できる環境が自動で1つ作成されます(図1)。

普段はここで作業を行っているのですが、これがセッション(PSSessionと呼ばれます)です。


図1 PowerShell環境が1つ起動している状態

次に、前回紹介した Enter-PSSessionコマンドレットで、リモートマシンに接続してみます。

この場合は、PowerShellの起動時に作成されたセッション(コマンド実行環境)とは別に、リモートマシンと対話をする専用のセッション(リモート上のコマンド実行環境)が作成されます。

つまり、リモート接続専用のPowerShell環境が作成されます(図2)。。

このセッションで実行したコマンドは、リモートコンピュータ上で実行されることになります。

目に見えるPowerShellコンソールは1つですが、内部では2つのPowerShell環境が動いているというわけです


図2 Enter-PSSessionコマンドでリモート接続専用のセッションが作成される

ちなみに、Enter-PSSessionで作成したセッションは一時的なものなので、ExitとするかExit-PSSessionコマンドレットを実行するとリモートセッションは消えます。

*本記事はWindows XPにインストールしたWindows PowerShell 2.0 RCで検証しております。

Windows PowerShell によるリモート制御 ~その1 準備編~

Windows PowerShell 2.0 からリモート制御がサポートされます。

Windows PowerShell 2.0がインストールされているだけではリモート処理を行うことはできません。

リモート制御を行う側とされる側の双方にPowerShell 2.0がインストールされ、リモート処理用に構成されている必要があります。

本記事は

について説明します。


リモート処理用に構成する

PowerShell でリモート処理が行えるようにするには、下記条件が必要になります。

  1. ローカルマシンとリモート制御するマシンの双方にPowerShellがインストールされていること
  2. リモート処理用の構成がされていること
  3. リモート接続するマシンのPowerShellは管理者モードで起動すること(PM4:00頃追記
  4. リモート接続を確立して、リモートコマンドを実行するには、現在のユーザーがリモートコンピューター上のAdministratorグループに属する必要がある。もしくは、現在のユーザーが管理者資格情報を提供できる必要がある(PM4:15頃追記

1.ですが、Windows7の場合はPowerShell 2.0がインストール済みですので、関係ありません。 もしもWindows XPにインストールする場合は、前回の記事を参照ください。

ここでは、2.について説明します。

まずは、Windows PowerShell 2.0 を起動します。

次に、Enable-PSRemoting というコマンドレットを実行します。(このコマンドレットは、内部的には Set-WSManQuickConfig を呼んでいるようです。Set-WSManQuickConfigを実行してもOKです。)

Enable-PSRemoting というコマンドレットを実行すると

PS > Enable-PSRemoting
WinRM クイック構成
Set-WSManQuickConfig コマンドを実行すると、WinRM
サービスによるこのコンピューターのリモート管理が有効になるため、セキュリティ面で重大な影響があります。
このコマンドには次の処理が含まれます:
 1. WinRM サービスが実行されているかどうかを確認します。WinRM サービスが実行されていない場合は、サービスを開始します。
 2. WinRM サービスのスタートアップの種類を自動に設定します。
 3. どの IP アドレスでも要求を受け付けるリスナーを作成します。既定では、トランスポートは HTTP です。
 4. WS-Management トラフィック用のファイアウォール例外を有効にします。
WinRM サービスによるこのコンピューターのリモート管理を有効にしますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"):

というメッセージが表示されます。

“Y”と入力して[Enter]キーを押すと図1の用に構成処理が開始されます。


図1 Enable-PSRemotingコマンドレットの実行

準備はたったこれだけです。

次は、リモートコンピューターに接続してみましょう。


ローカルマシンからリモート接続する

ローカルマシンの PowerShell からリモートマシンに接続するには

Enter-PSSession 接続先のコンピューター名

という構文でコマンドを実行します(接続先のPowerShellは起動されていなくても問題ありません。)

たとえば、接続先のコンピューター名が MyServ01 だとしたら

PS> Enter-PSSession MyServ01

と入力します。

もしも接続できない場合は

  • ネットワークに接続されていない
  • リモート処理の構成がされていない

可能性がありますので、見直してください。

上手く接続できた場合は

[MyServ01]: PS C:\Documents and Settings\MyServ01\My Documents>

のように、先頭の[]の中に接続されたマシン名が表示されます。

[マシン名]が表示されている間は、コマンドはリモートマシン上で実行されることになります。

たとえば次のように dir コマンドを実行すると、リモートマシン上でdirコマンドが実行されたことになります。

[MyServ01]: PS C:\Documents and Settings\MyServ01\My Documents> dir

リモート接続を解除する

リモート接続を解除する、つまり切断するには、Exitと入力するか、次のように Exit-PSSession コマンドレットを実行します。

PS > Exit-PSSession

*本記事はWindows XPにインストールしたWindows PowerShell 2.0 RCで検証しております。