Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Breve descrizione
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 cmdlet Enter-PSSession.
È 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: Si connette a una PSSession disconnessa. -
Disconnect-PSSession: disconnette una 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 di 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 computer remoto o sul lato server della connessione, anche se lato client computer 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 Running a Disconnected. È 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 la sospensione di un comando da parte di un buffer di output completo, usare il parametro outputBufferingMode del cmdlet Disconnect-PSSession, 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 cmdlet Remove-PSSession o fino alla scadenza del timeout di inattività della sessione PSSession. È possibile modificare il timeout di inattività di una sessione PSSession usando il IdleTimeoutSec o i parametri IdleTimeout dei cmdlet Disconnect-PSSession, 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 credenziali RunAs della configurazione della sessione.
Come ottenere le sessioni PSSession
A partire da PowerShell 3.0, il cmdlet Get-PSSession ottiene PSSession su computer locali e remoti. Può anche ottenere i PSSession creati nella sessione corrente.
Per ottenere le sessioni PSSession nel computer locale o nei computer remoti, usare i parametri ComputerName o ConnectionUri. Senza parametri, Get-PSSession recupera le PSSession create nella sessione locale, indipendentemente dal punto in cui terminano.
Nell'esempio seguente 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 cmdlet Get-PSSession senza parametri. In questo esempio, Get-PSSession ottiene 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 cmdlet Disconnect-PSSession per disconnettere una sessione. Per identificare la sessione PSSession, usare il parametro sessione o inviare tramite pipe un oggetto PSSession dai cmdlet New-PSSession o Get-PSSession per Disconnect-PSSession.
Il comando seguente disconnette la sessione PSSession al computer Server01. Si noti che il valore della proprietà State è Disconnected e la 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 cmdlet Invoke-Command. Crea una sessione, avvia il comando e si disconnette immediatamente, prima che il comando possa restituire qualsiasi output.
Il comando seguente esegue un comando Get-WinEvent 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 cmdlet Connect-PSSession con i parametri ComputerName o ConnectionUri . 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 cmdlet Receive-PSSession.
È possibile usare Receive-PSSession anziché usare il cmdlet Connect-PSSession. 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 a essa e ottiene i risultati dei comandi eseguiti durante la disconnessione.
Receive-PSSession può restituire i risultati in un job (in modo asincrono) o al programma host (in modo sincrono). Usare il parametro OutTarget per selezionare Task 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 cmdlet Receive-PSSession per riconnettersi alla sessione in Server02 e ottenere i risultati del comando Get-WinEvent. Il parametro OutTarget viene utilizzato 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 cmdlet Receive-Job.
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à stato e disponibilità di una sessione disconnessa di PSSession indicano se la sessione è disponibile per riconnettersi.
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 è disconnesso e la relativa disponibilità è Nessuno.
Il valore della proprietà state è relativo alla sessione corrente. Il valore Disconnesso indica che la PSSession non è collegata alla sessione corrente. Tuttavia, non significa che la sessione PSSession sia disconnessa da tutte le sessioni. Potrebbe essere connesso a una sessione diversa.
Per determinare se è possibile connettersi o riconnettersi alla PSSession, utilizzare la proprietà disponibilità. Il valore Nessuna indica che è possibile connettersi alla sessione. Il valore "occupato" indica che non è possibile connettersi con la PSSession perché è connessa a un'altra sessione.
L'esempio seguente viene eseguito in due sessioni di PowerShell nello stesso computer. Si notino i valori delle proprietà stato e disponibilità 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 cmdlet Remove-PSSession 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 PSSession sono inattive quando il thread del battito cardiaco 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 le sessioni disconnesse attive, 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 la utilizzano. È possibile eseguire l'override del valore predefinito, ma tale valore non può superare il MaxIdleTimeoutMs proprietà 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 Administrators 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 alla sessione PSSession (Connect-PSSession) o ottenere i risultati (Receive-PSSession).
I cmdlet Connect-PSSession e Receive-PSSession dispongono di un parametro SessionOption che accetta un oggetto PSSessionOption, ad esempio quello restituito dal cmdlet New-PSSessionOption.
Il valore IdleTimeout nell'oggetto SessionOption e il valore IdleTimeout nella variabile preferenza $PSSessionOption non modificano il valore del IdleTimeout in un comando Connect-PSSession o Receive-PSSession.
Per creare una sessione PSSession con un determinato valore di timeout di inattività, creare una variabile di preferenza $PSSessionOption. Impostare il valore della proprietà IdleTimeout sul valore desiderato (in millisecondi).
Quando si creano sessioni PSSession, i valori in $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 cmdlet New-PSSessionOption. Usare quindi l'opzione di sessione nel valore del parametro SessionOption dei cmdlet New-PSSession o Invoke-Command.
I valori impostati durante la creazione della sessione hanno la precedenza sui valori impostati nella variabile di preferenza $PSSessionOption e nella configurazione della sessione.
Per 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 cmdlet Disconnect-PSSession.
Per 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 cmdlet New-PSTransportOption. Quindi, utilizza l'opzione di trasporto nel valore del parametro TransportOption di Register-PSSessionConfiguration.
Per 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 cmdlet New-PSTransportOption. Quindi, utilizza l'opzione di trasporto nel valore del parametro TransportOption di Set-PSSessionConfiguration.
Per 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 PSSession determina come viene gestito l'output del comando quando il buffer di output della 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.Blockmantiene 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. Utilizzando il valoreDrop, 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 del 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 sei un membro del gruppo Amministratori sul computer remoto, puoi creare e modificare la modalità di buffering di output delle configurazioni di sessione.
Per creare una PSSession con una modalità di buffering dell'output pari a Drop, creare una variabile di preferenza $PSSessionOption in cui il valore della proprietà OutputBufferingMode è Drop.
Quando si creano sessioni PSSession, i valori in $PSSessionOption variabile hanno la precedenza sui valori nella configurazione della sessione.
Per esempio:
$PSSessionOption = New-PSSessionOption -OutputBufferingMode Drop
Usare il parametro OutputBufferingMode del cmdlet New-PSSessionOption per creare un'opzione di sessione con il valore Drop. Usare quindi l'oggetto PSSessionOption come valore del parametro SessionOption dei cmdlet New-PSSession o Invoke-Command.
I valori impostati durante la creazione della sessione hanno la precedenza sui valori impostati nella variabile di preferenza $PSSessionOption e nella configurazione della sessione.
Per 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 cmdlet Disconnect-PSSession.
Per 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 cmdlet New-PSSessionOption. Usate quindi l'opzione di sessione nel valore del parametro SessionOption di Connect-PSSession o Receive-PSSession.
Per 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 cmdlet New-PSTransportOption per creare un oggetto opzione di trasporto con valore Drop. Quindi, utilizza l'opzione di trasporto nel valore del parametro TransportOption di Register-PSSessionConfiguration.
Per 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 cmdlet New-PSTransportOption per creare un'opzione di trasporto con il valore Drop. Usare quindi l'opzione Transport nel valore del parametro SessionOption di Set-PSSessionConfiguration.
Per 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 cmdlet New-PSSession, 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 cmdlet Wait-Job attende il completamento di un processo e quindi torna al prompt dei comandi o al comando successivo. Per impostazione predefinita, Wait-Job restituisce se la sessione in cui è in esecuzione un processo è disconnessa. Per indirizzare il cmdlet Wait-Job ad attendere fino a quando la sessione viene riconnessa, nello stato Opened, utilizzare il parametro Force. Per altre informazioni, vedere 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 PSSession disconnessa involontariamente può 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 cmdlet Connect-PSSession per riconnettersi alla sessione e il cmdlet Receive-PSSession 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.