about_Remote_Disconnected_Sessions

Descrizione breve

Viene illustrato come disconnettersi e riconnettersi a una sessione di PowerShell (PSSession).

Descrizione lunga

A partire da PowerShell 3.0, è possibile disconnettersi da una sessione PSSession e riconnettersi alla sessione PSSession dallo stesso computer o da un computer diverso. Lo stato della sessione viene mantenuto e i comandi nella sessione PSSession continuano a essere eseguiti mentre la sessione è disconnessa.

La funzionalità Sessioni disconnesse consente di chiudere la sessione in cui è stata creata una sessione PSSession e arrestare il computer senza interrompere i comandi in esecuzione nella sessione PSSession remota. Le sessioni disconnesse sono utili per l'esecuzione di comandi che richiedono un tempo prolungato per il completamento.

Non è possibile disconnettersi da una sessione interattiva avviata usando il Enter-PSSession cmdlet .

È possibile usare sessioni disconnesse per gestire le sessioni PSSession che sono state disconnesse involontariamente a causa di un'interruzione di rete o di un computer.

Cmdlet di sessione disconnessi

I cmdlet seguenti supportano la funzionalità Sessioni disconnesse:

  • Connect-PSSession: Connessione a una sessione PSSession disconnessa.
  • Disconnect-PSSession: disconnette una sessione PSSession.
  • Get-PSSession: ottiene le sessioni PSSession nel computer locale o nei computer remoti.
  • Receive-PSSession: ottiene i risultati dei comandi eseguiti in sessioni disconnesse.
  • Invoke-Command: il parametro InDisconnectedSession crea una sessione PSSession e si disconnette immediatamente.

Funzionamento della funzionalità Sessioni disconnesse

A partire da PowerShell 3.0, le sessioni PSSession sono indipendenti dalle sessioni in cui vengono create. Le sessioni PSSession attive vengono mantenute sul lato computer remoto o server della connessione, anche se il computer sul lato client viene arrestato o disconnesso dalla rete.

In PowerShell 2.0 la sessione PSSession viene eliminata dal computer remoto quando viene disconnessa dalla sessione di origine o dalla sessione in cui è stata creata termina.

Quando si disconnette una sessione PSSession, la sessione PSSession rimane attiva e viene mantenuta nel computer remoto. Lo stato della sessione passa da In esecuzione a Disconnesso. È possibile riconnettersi a una sessione PSSession disconnessa da

  • Sessione corrente nello stesso computer
  • Sessione diversa nello stesso computer
  • Da una sessione in un computer diverso

Il computer remoto che gestisce la sessione deve essere in esecuzione ed essere connesso alla rete.

I comandi in una sessione PSSession disconnessa continuano a essere eseguiti senza interruzioni nel computer remoto fino al completamento del comando o al riempimento del buffer di output. Per impedire a un buffer di output completo di sospendere un comando, usare il parametro OutputBufferingMode dei Disconnect-PSSessioncmdlet , New-PSSessionOptiono New-PSTransportOption .

Le sessioni disconnesse vengono mantenute nello stato disconnesso nel computer remoto. Sono disponibili per la riconnessione fino a quando non si elimina la sessione PSSession, ad esempio usando il Remove-PSSession cmdlet o fino alla scadenza del timeout di inattività della sessione PSSession. È possibile modificare il timeout di inattività di una sessione PSSession usando i parametri IdleTimeoutSec o IdleTimeout dei Disconnect-PSSessioncmdlet , New-PSSessionOptiono New-PSTransportOption .

Un altro utente può connettersi alle sessioni PSSession create, ma solo se possono fornire le credenziali usate per creare la sessione o usare le RunAs credenziali della configurazione della sessione.

Come ottenere le sessioni PSSession

A partire da PowerShell 3.0, il Get-PSSession cmdlet ottiene pssessioni nel computer locale e nei computer remoti. Può anche ottenere le sessioni PSSession create nella sessione corrente.

Per ottenere le sessioni PSSession nel computer locale o nei computer remoti, usare i parametri ComputerName o Connessione ionUri. Senza parametri, Get-PSSession ottiene PSSession creata nella sessione locale, indipendentemente dalla posizione in cui terminano.

Nell'esempio riportato di seguito viene illustrato come usare Get-PSSession.

New-PSSession crea una sessione nel computer Server01. La sessione risiede nel computer Server01.

New-PSSession -ComputerName Server01
Id Name      ComputerName  State    ConfigurationName     Availability
-- ----      ------------  -----    -----------------     ------------
 2 Session2  Server01      Opened   Microsoft.PowerShell     Available

Per ottenere la sessione da Server01, usare il parametro ComputerName per specificare la destinazione di Get-PSSession.

Get-PSSession -ComputerName Server01
Id Name      ComputerName  State    ConfigurationName     Availability
-- ----      ------------  -----    -----------------     ------------
 2 Session2  Server01      Opened   Microsoft.PowerShell     Available

Se il valore del parametro ComputerName di Get-PSSession è localhost, Get-PSSession ottiene le sessioni PSSession che terminano in e vengono mantenute nel computer locale. Non ottiene le sessioni PSSession nel computer Server01, anche se sono state avviate nel computer locale.

Get-PSSession -ComputerName localhost

Per ottenere sessioni create nella sessione corrente, usare il Get-PSSession cmdlet senza parametri. In questo esempio ottiene Get-PSSession la sessione PSSession creata nella sessione corrente e si connette al computer Server01.

Get-PSSession
Id Name      ComputerName  State    ConfigurationName     Availability
-- ----      ------------  -----    -----------------     ------------
 2 Session2  Server01      Opened   Microsoft.PowerShell     Available

Come disconnettere le sessioni

Usare il Disconnect-PSSession cmdlet per disconnettere una sessione. Per identificare la sessione PSSession, usare il parametro Session o inviare tramite pipe un oggetto PSSession dai New-PSSession cmdlet o a .Disconnect-PSSessionGet-PSSession

Il comando seguente disconnette la sessione PSSession al computer Server01. Si noti che il valore della proprietà State è Disconnected e availability è None.

Get-PSSession -ComputerName Server01 | Disconnect-PSSession
Id Name      ComputerName  State         ConfigurationName     Availability
-- ----      ------------  -----         -----------------     ------------
 2 Session2  Server01      Disconnected  Microsoft.PowerShell          None

Per creare una sessione disconnessa, usare il parametro InDisconnectedSession del Invoke-Command cmdlet . Crea una sessione, avvia il comando e si disconnette immediatamente, prima che il comando possa restituire qualsiasi output.

Il comando seguente esegue un Get-WinEvent comando in una sessione disconnessa nel computer remoto Server02.

Invoke-Command -ComputerName Server02 -InDisconnectedSession -ScriptBlock {
   Get-WinEvent -LogName "*PowerShell*" }
Id Name      ComputerName  State         ConfigurationName     Availability
-- ----      ------------  -----         -----------------     ------------
 4 Session3  Server02      Disconnected  Microsoft.PowerShell          None

Come connettersi alle sessioni disconnesse

Per connettere una sessione disconnessa, usare il Connect-PSSession cmdlet con i parametri ComputerName o Connessione ionUri. In alternativa, è possibile inviare tramite pipe l'output di Get-PSSession a Connect-PSSession.

Nell'esempio seguente vengono recuperate le sessioni nel computer Server02. L'output include due sessioni disconnesse.

Get-PSSession -ComputerName Server02
Id Name      ComputerName   State         ConfigurationName     Availability
-- ----      ------------   -----         -----------------     ------------
 2 Session2  juneb-srv8320  Disconnected  Microsoft.PowerShell          None
 4 Session3  juneb-srv8320  Disconnected  Microsoft.PowerShell          None

Il comando seguente si connette a Session2. La sessione PSSession è ora aperta e disponibile.

Connect-PSSession -ComputerName Server02 -Name Session2
Id Name      ComputerName    State    ConfigurationName     Availability
-- ----      ------------    -----    -----------------     ------------
 2 Session2  juneb-srv8320   Opened   Microsoft.PowerShell     Available

Come ottenere i risultati

Per ottenere i risultati dei comandi eseguiti in una sessione PSSession disconnessa, usare il Receive-PSSession cmdlet .

È possibile usare anziché usare Receive-PSSession il Connect-PSSession cmdlet . Se la sessione è già connessa, Receive-PSSession ottiene i risultati dei comandi eseguiti quando la sessione è stata disconnessa. Se la sessione PSSession è ancora disconnessa, Receive-PSSession si connette e ottiene i risultati dei comandi eseguiti durante la disconnessione.

Receive-PSSession può restituire i risultati in un processo (in modo asincrono) o al programma host (in modo sincrono). Usare il parametro OutTarget per selezionare Processo o Host. Il valore predefinito è Host. Tuttavia, se il comando ricevuto è stato avviato nella sessione corrente come processo, viene restituito come processo per impostazione predefinita.

Nell'esempio seguente viene usato il Receive-PSSession cmdlet per riconnettersi alla sessione in Server02 e ottenere i risultati del Get-WinEvent comando. Il parametro OutTarget viene usato per ottenere i risultati in un processo.

Receive-PSSession -ComputerName Server02 -Name Session3 -OutTarget Job
Id   Name   PSJobTypeName   State         HasMoreData     Location
--   ----   -------------   -----         -----------     --------
 3   Job3   RemoteJob       Running       True            Server02

Per ottenere i risultati del processo, usare il Receive-Job cmdlet .

Get-Job | Receive-Job -Keep
ProviderName: PowerShell

TimeCreated             Id LevelDisplayName Message     PSComputerName
-----------             -- ---------------- -------     --------------
5/14/2012 7:26:04 PM   400 Information      Engine stat Server02
5/14/2012 7:26:03 PM   600 Information      Provider "W Server02
5/14/2012 7:26:03 PM   600 Information      Provider "C Server02
5/14/2012 7:26:03 PM   600 Information      Provider "V Server02

Proprietà di stato e disponibilità

Le proprietà State e Availability di una sessione PSSession disconnessa indicano se la sessione è disponibile per la riconnessione.

Quando una sessione PSSession è connessa alla sessione corrente, il relativo stato è Aperto e la disponibilità è Disponibile. Quando si esegue la disconnessione dalla sessione PSSession, lo stato PSSession è Disconnected e la relativa disponibilità è Nessuno.

Il valore della proprietà State è relativo alla sessione corrente. Il valore Disconnected indica che la sessione PSSession non è connessa alla sessione corrente. Tuttavia, non significa che la sessione PSSession sia disconnessa da tutte le sessioni. È possibile che sia connessa a una sessione diversa.

Per determinare se è possibile connettersi o riconnettersi alla sessione PSSession, utilizzare la proprietà Availability . Il valore None indica che è possibile connettersi alla sessione. Un valore occupato indica che non è possibile connettersi alla sessione PSSession perché è connessa a un'altra sessione.

L'esempio seguente viene eseguito in due sessioni di PowerShell nello stesso computer. Si notino i valori di modifica delle proprietà State e Availability in ogni sessione quando la sessione PSSession viene disconnessa e riconnessa.

# Session 1
New-PSSession -ComputerName Server30 -Name Test
Id Name   ComputerName    State         ConfigurationName     Availability
-- ----   ------------    -----         -----------------     ------------
1  Test   Server30        Opened        Microsoft.PowerShell     Available
# Session 2
Get-PSSession -ComputerName Server30 -Name Test
Id Name   ComputerName    State         ConfigurationName     Availability
-- ----   ------------    -----         -----------------     ------------
1 Test    Server30        Disconnected  Microsoft.PowerShell          Busy
# Session 1
Get-PSSession -ComputerName Server30 -Name Test | Disconnect-PSSession
Id Name   ComputerName    State         ConfigurationName     Availability
-- ----   ------------    -----         -----------------     ------------
1 Test    Server30        Disconnected  Microsoft.PowerShell          None
# Session 2
Get-PSSession -ComputerName Server30
Id Name   ComputerName    State         ConfigurationName     Availability
-- ----   ------------    -----         -----------------     ------------
1 Test    Server30        Disconnected  Microsoft.PowerShell          None
# Session 2
Connect-PSSession -ComputerName Server30 -Name Test
Id Name   ComputerName    State         ConfigurationName     Availability
-- ----   ------------    -----         -----------------     ------------
3 Test    Server30        Opened        Microsoft.PowerShell     Available
# Session 1
Get-PSSession -ComputerName Server30
Id Name   ComputerName    State         ConfigurationName     Availability
-- ----   ------------    -----         -----------------     ------------
1 Test    Server30        Disconnected  Microsoft.PowerShell          Busy

Le sessioni disconnesse vengono mantenute nel computer remoto fino a quando non vengono eliminate, ad esempio usando il Remove-PSSession cmdlet o si verifica il timeout. La proprietà IdleTimeout di una sessione PSSession determina per quanto tempo viene mantenuta una sessione disconnessa prima dell'eliminazione.

Valori di timeout di inattività

Le sessioni PSSession sono inattive quando il thread heartbeat non riceve alcuna risposta. La disconnessione di una sessione lo rende inattiva e avvia l'orologio IdleTimeout , anche se i comandi sono ancora in esecuzione nella sessione disconnessa. PowerShell considera attive le sessioni disconnesse, ma inattive.

Quando si creano e si disconnettono sessioni, verificare che il timeout di inattività nella sessione PSSession sia abbastanza lungo da mantenere la sessione per le proprie esigenze, ma non così a lungo che utilizza risorse non necessarie nel computer remoto.

La proprietà IdleTimeoutMs della configurazione della sessione determina il timeout di inattività predefinito delle sessioni che usano la configurazione della sessione. È possibile eseguire l'override del valore predefinito, ma tale valore non può superare la proprietà MaxIdleTimeoutMs della configurazione della sessione.

Usare il comando seguente per ottenere i valori di IdleTimeoutMs e MaxIdleTimeoutMs per una configurazione di sessione.

Get-PSSessionConfiguration |
  Format-Table Name, IdleTimeoutMs, MaxIdleTimeoutMs

Se si è membri del gruppo Amministrazione istrators nel computer remoto, è possibile impostare questi valori quando si crea una configurazione di sessione. Inoltre, è possibile modificare i valori quando si disconnette.

Il valore di timeout di inattività delle configurazioni di sessione e delle opzioni di sessione è espresso in millisecondi. Il valore di timeout di inattività delle sessioni e delle opzioni di configurazione della sessione è espresso in secondi.

È possibile impostare il timeout di inattività di una sessione PSSession quando si crea la sessione PSSession (New-PSSession, Invoke-Command) e quando si disconnette da esso (Disconnect-PSSession). Tuttavia, non è possibile modificare il valore IdleTimeout quando ci si connette a PSSession () o si ottengono risultati (Receive-PSSessionConnect-PSSession).

I Connect-PSSession cmdlet e Receive-PSSession hanno un parametro SessionOption che accetta un oggetto PSSessionOption , ad esempio quello restituito dal New-PSSessionOption cmdlet .

Il valore IdleTimeout nell'oggetto SessionOption e il valore IdleTimeout nella $PSSessionOption variabile preferenza non modificano il valore di IdleTimeout in un Connect-PSSession comando o Receive-PSSession .

Per creare una sessione PSSession con un determinato valore di timeout di inattività, creare una $PSSessionOption variabile di preferenza. Impostare il valore della proprietà IdleTimeout sul valore desiderato (in millisecondi).

Quando si creano sessioni PSSession, i valori nella $PSSessionOption variabile hanno la precedenza sui valori nella configurazione della sessione.

Ad esempio, il comando seguente imposta un timeout di inattività di 48 ore:

$PSSessionOption = New-PSSessionOption -IdleTimeoutMSec 172800000

Per creare una sessione PSSession con un determinato valore di timeout di inattività, usare il parametro IdleTimeoutMSec del New-PSSessionOption cmdlet. Usare quindi l'opzione di sessione nel valore del parametro SessionOption dei New-PSSession cmdlet o Invoke-Command .

I valori impostati durante la creazione della sessione hanno la precedenza sui valori impostati nella $PSSessionOption variabile di preferenza e nella configurazione della sessione.

Ad esempio:

$o = New-PSSessionOption -IdleTimeoutMSec 172800000
New-PSSession -SessionOption $o

Per modificare il timeout di inattività di una sessione PSSession durante la disconnessione, usare il parametro IdleTimeoutSec del Disconnect-PSSession cmdlet.

Ad esempio:

Disconnect-PSSession -IdleTimeoutSec 172800

Per creare una configurazione di sessione con un timeout di inattività e un timeout di inattività massimo, usare i parametri IdleTimeoutSec e MaxIdleTimeoutSec del New-PSTransportOption cmdlet. Usare quindi l'opzione di trasporto nel valore del parametro TransportOption di Register-PSSessionConfiguration.

Ad esempio:

$o = New-PSTransportOption -IdleTimeoutSec 172800 -MaxIdleTimeoutSec 259200
Register-PSSessionConfiguration -Name Test -TransportOption $o

Per modificare il timeout di inattività predefinito e il timeout massimo di inattività di una configurazione di sessione, usare i parametri IdleTimeoutSec e MaxIdleTimeoutSec del New-PSTransportOption cmdlet. Usare quindi l'opzione di trasporto nel valore del parametro TransportOption di Set-PSSessionConfiguration.

Ad esempio:

$o = New-PSTransportOption -IdleTimeoutSec 172800 -MaxIdleTimeoutSec 259200
Set-PSSessionConfiguration -Name Test -TransportOption $o

Modalità di buffering dell'output

La modalità di buffering di output di una sessione PSSession determina la modalità di gestione dell'output del comando quando il buffer di output della sessione PSSession è pieno.

In una sessione disconnessa, la modalità di buffering di output determina in modo efficace se il comando continua a essere eseguito mentre la sessione è disconnessa.

I valori validi sono i seguenti:

  • Block (impostazione predefinita) - Quando il buffer di output è pieno, l'esecuzione viene sospesa fino a quando il buffer non viene cancellato. Block conserva i dati, ma potrebbe interrompere il comando.
  • Drop - Quando il buffer di output è pieno, l'esecuzione continua. Quando viene generato un nuovo output, l'output meno recente viene eliminato. Quando si usa il Drop valore , reindirizzare l'output a un file. Questo valore è consigliato per le sessioni disconnesse.

La proprietà OutputBufferingMode della configurazione della sessione determina la modalità di buffering predefinita delle sessioni che usano la configurazione della sessione.

Per trovare il valore di una configurazione di sessione di OutputBufferingMode, è possibile usare uno dei formati di comando seguenti:

(Get-PSSessionConfiguration <ConfigurationName>).OutputBufferingMode
Get-PSSessionConfiguration | Format-Table Name, OutputBufferingMode

È possibile eseguire l'override del valore predefinito nella configurazione della sessione e impostare la modalità di memorizzazione nel buffer di output di una sessione PSSession quando si crea una sessione PSSession, quando si disconnette e quando ci si riconnette.

Se si è membri del gruppo Amministrazione istrators nel computer remoto, è possibile creare e modificare la modalità di memorizzazione nel buffer di output delle configurazioni di sessione.

Per creare una sessione PSSession con una modalità di buffering di output di Drop, creare una $PSSessionOption variabile di preferenza in cui il valore della proprietà OutputBufferingMode è Drop.

Quando si creano sessioni PSSession, i valori nella $PSSessionOption variabile hanno la precedenza sui valori nella configurazione della sessione.

Ad esempio:

$PSSessionOption = New-PSSessionOption -OutputBufferingMode Drop

Usare il parametro OutputBufferingMode del New-PSSessionOption cmdlet per creare un'opzione di sessione con il valore Drop. Usare quindi l'oggetto PSSessionOption come valore del parametro SessionOption dei New-PSSession cmdlet o Invoke-Command .

I valori impostati durante la creazione della sessione hanno la precedenza sui valori impostati nella $PSSessionOption variabile di preferenza e nella configurazione della sessione.

Ad esempio:

$o = New-PSSessionOption -OutputBufferingMode Drop
New-PSSession -SessionOption $o

Per modificare la modalità di buffering di output di una sessione PSSession durante la disconnessione, usare il parametro OutputBufferingMode del Disconnect-PSSession cmdlet.

Ad esempio:

Disconnect-PSSession -OutputBufferingMode Drop

Per modificare la modalità di buffering di output di una sessione PSSession durante la riconnessione, usare il parametro OutputBufferingMode del New-PSSessionOption cmdlet. Usare quindi l'opzione di sessione nel valore del parametro SessionOption di Connect-PSSession o Receive-PSSession.

Ad esempio:

$o = New-PSSessionOption -OutputBufferingMode Drop
Connect-PSSession -ComputerName Server01 -Name Test -SessionOption $o

Per creare una configurazione di sessione con una modalità di buffering di output predefinita di Drop, usare il parametro OutputBufferingMode del New-PSTransportOption cmdlet per creare un oggetto opzione di trasporto con un valore .Drop Usare quindi l'opzione di trasporto nel valore del parametro TransportOption di Register-PSSessionConfiguration.

Ad esempio:

$o = New-PSTransportOption -OutputBufferingMode Drop
Register-PSSessionConfiguration -Name Test -TransportOption $o

Per modificare la modalità di buffering di output predefinita di una configurazione di sessione, usare il parametro OutputBufferingMode del New-PSTransportOption cmdlet per creare un'opzione di Droptrasporto con il valore . Usare quindi l'opzione Transport nel valore del parametro SessionOption di Set-PSSessionConfiguration.

Ad esempio:

$o = New-PSTransportOption -OutputBufferingMode Drop
Set-PSSessionConfiguration -Name Test -TransportOption $o

Disconnessione di sessioni di loopback

Le sessioni di loopback o le sessioni locali sono sessioni PSSession che hanno origine e terminano nello stesso computer. Analogamente ad altre sessioni PSSession, le sessioni di loopback attive vengono mantenute nel computer alla fine remota della connessione (computer locale), in modo da poter disconnettersi e riconnettersi alle sessioni di loopback.

Per impostazione predefinita, le sessioni di loopback vengono create con un token di sicurezza di rete che non consente l'esecuzione dei comandi nella sessione per accedere ad altri computer. È possibile riconnettersi alle sessioni di loopback con un token di sicurezza di rete da qualsiasi sessione nel computer locale o in un computer remoto.

Tuttavia, se si usa il parametro EnableNetworkAccess del New-PSSessioncmdlet , Enter-PSSessiono Invoke-Command , la sessione di loopback viene creata con un token di sicurezza interattivo. Il token interattivo consente ai comandi eseguiti nella sessione di loopback di ottenere dati da altri computer.

È possibile disconnettere sessioni di loopback con token interattivi e quindi riconnettersi alla stessa sessione o a una sessione diversa nello stesso computer. Tuttavia, per impedire l'accesso dannoso, è possibile riconnettersi alle sessioni di loopback con token interattivi solo dal computer in cui sono stati creati.

In attesa di processi in sessioni disconnesse

Il Wait-Job cmdlet attende il completamento di un processo e quindi torna al prompt dei comandi o al comando successivo. Per impostazione predefinita, restituisce Wait-Job se la sessione in cui è in esecuzione un processo è disconnessa. Per indirizzare il Wait-Job cmdlet a attendere la riconnessione della sessione, nello stato Opened usare il parametro Force . Per altre informazioni, vedere Wait-Job.For more information, see Wait-Job.

Sessioni affidabili e disconnessione involontaria

Una sessione PSSession potrebbe essere involontariamente disconnessa a causa di un errore del computer o di un'interruzione della rete. PowerShell tenta di recuperare la sessione PSSession, ma l'esito positivo dipende dalla gravità e dalla durata della causa.

Lo stato di una sessione PSSession non disconnessa involontariamente potrebbe essere interrotto o chiuso, ma potrebbe anche essere Disconnesso. Se il valore di State è Disconnected, è possibile usare le stesse tecniche per gestire la sessione PSSession come si farebbe se la sessione fosse disconnessa intenzionalmente. Ad esempio, è possibile usare il Connect-PSSession cmdlet per riconnettersi alla sessione e il Receive-PSSession cmdlet per ottenere i risultati dei comandi eseguiti durante la disconnessione della sessione.

Se si chiude (chiude) la sessione in cui è stata creata una sessione PSSession mentre i comandi sono in esecuzione nella sessione PSSession, PowerShell mantiene la sessione PSSession nello stato Disconnesso nel computer remoto. Se si chiude (esci) la sessione in cui è stata creata una sessione PSSession, ma non vengono eseguiti comandi nella sessione PSSession, PowerShell non tenta di gestire la sessione PSSession.

Vedi anche