web-dev-qa-db-ja.com

リモートサーバーで開いているすべてのPSセッションを取得する(新しいコンソールウィンドウから)

リモートサーバーで5つの新しいPSセッションを開始し、Get-PSSessionを実行してそれらをすべて表示できます。

PS C:\> New-PSSession -ComputerName MyServerName

     Id Name            ComputerName    State         ConfigurationName     Availability
     -- ----            ------------    -----         -----------------     ------------
      1 Session1        MyServerName   Opened        Microsoft.PowerShell     Available

    [repeat 4 more times]

予想どおり、6番目のセッションを開こうとすると、「いいえ」というエラーが表示されます(PoswerShellsのデフォルトの同時リモートPSSession数は5に制限されているため)。ただし、Get-Sessionを実行すると5つのセッションがすべて表示されるため、これまでどおりすべてが機能しています。

PS C:\> New-PSSession -ComputerName MyServerName
    New-PSSession : [......maximum number of 5 concurrent shells]

PS C:\> Get-PSSession

     Id Name            ComputerName    State         ConfigurationName     Availability
     -- ----            ------------    -----         -----------------     ------------
      1 Session1        MyServerName   Opened        Microsoft.PowerShell     Available
      2 Session2        MyServerName   Opened        Microsoft.PowerShell     Available
      3 Session3        MyServerName   Opened        Microsoft.PowerShell     Available
      4 Session4        MyServerName   Opened        Microsoft.PowerShell     Available
      5 Session5        MyServerName   Opened        Microsoft.PowerShell     Available

ただし、そのコンソールを閉じて新しいコンソールを開くと、Get-PSSession( '-ComputerName'パラメーターが定義されているかどうかにかかわらず)を実行すると、開いているセッションがまったく表示されません。

PS C:\> Get-PSSession
PS C:\>

新しいコンソールで新しいセッションを開こうとすると、5つ以上の同時セッションに関する同じエラーが表示されるため、これらのセッションはまだ開いていることがわかります。

PS C:\> New-PSSession -ComputerName MyServerName
    New-PSSession : [......maximum number of 5 concurrent shells]

「Get-PSSession Get-Help -full」を実行すると、「Get-PSSession -ComputerName MyServerNameは、特定のサーバーで開始されたセッションまたはコンピューターに関係なく、少なくともallリモートPSセッションを取得する必要があります(少なくとも私がそれを理解する方法):

「コマンドは、異なるセッションまたは異なるコンピューターで作成された場合でも、[リモートサーバー]上のすべてのセッションを返します。」

だから、リモートサーバーで開いているPSセッションを見つけたり削除したりする方法がありますか?1つのコンソールセッションからすべてを行う必要はありませんか?

13
Local Needs

私が言えることから...

作成したPSSessionは "MyServerName"でライブであり、最初に作成したセッションの間、Get-PSSessionによって返されます(引数なしで、リモートから送信するボックスのPowerShellウィンドウ)。作成されたセッションを閉じると、セッションはコンピューター上になくなります。これが、新しいPowerShellウィンドウを閉じて開くときにGet-PSSessionが何も返さない理由です。それらはコンピューター上で「生きた」ことはなく、リモートセッションですが、元のPowerShellウィンドウではスコープにありました。作成しました。

セッションがまだMyServerNameにある場合、最大セッションについて言及したエラーが原因であると思われるため、次のコマンドを入力するとリストされます。

Get-PSSession -ComputerName MyServerName

既存のセッション/ウィンドウでそれらすべてを再接続する場合は、次のようにします。

Get-PSSession -ComputerName MyServerName | Connect-PSSession

それらをすべて削除して、MyServerNameに新しいPSSessionを作成できるようにする

Get-PSSession -ComputerName MyServerName | Remove-PSSession

ドキュメントをさらに詳しく見ると、PowerShellウィンドウを閉じたときにすべてのセッションが無期限に有効になるわけではありません。見る:

Get-Help about_Remote_Disconnected_Sessions -ShowWindow

部分的な抜粋(強調を含む):

PSSessionでコマンドを実行中にPSSessionが作成されたセッションを閉じる(終了する)と、Windows PowerShellはリモートコンピューターでPSSessionを切断状態に維持します。 PSSessionが作成されたセッションを閉じた(終了した)が、PSSessionでコマンドが実行されていない場合、Windows PowerShellはPSSessionを維持しようとしません。

私が見ることができるものから、a)切断されていないセッション、またはb)コマンドの実行中のセッションは、PSSessionを開始したPowerShellウィンドウを閉じると破棄されます。さらに、ドキュメントにはタイムアウトも記載されているようです(おそらくサーバー上のPSSessionConfigurationsに依存しますが、私はそれらについてはまだ何も知りません(存在する以外)。

これは、PowerShell Remotingのドキュメントのいくつかをふるい分けるのに良い言い訳でした。

Get-Help *PSSession*
Get-Help *remote*
12
Joshua McKinnon

私の実験から、セッションが何もしていない場合、セッションはリモートエンドで閉じられます。それを防ぐには、次のいずれかを実行させます:

Invoke-Command -Session $s { ... } -AsJob
Invoke-Command server01 { ... } -Disconnected

または、他のオプションはセッションを切断することです:

Disconnect-PSSession -Id (1..5)

どちらのアプローチでも、リモートセッションは存続します。

0
Keith Hill