about_Remote_Disconnected_Sessions

Descrição curta

Explica como desconectar e reconectar-se a uma sessão do PowerShell (PSSession).

Descrição longa

A partir do PowerShell 3.0, você pode se desconectar de uma PSSession e reconectar-se à PSSession do mesmo computador ou de um computador diferente. O estado da sessão é mantido e os comandos na PSSession continuam sendo executados enquanto a sessão está desconectada.

O recurso Sessões Desconectadas permite que você feche a sessão na qual uma PSSession foi criada e desligue o computador sem interromper os comandos em execução no PSSession remoto. Sessões desconectadas são úteis para executar comandos que levam um tempo estendido para serem concluídos.

Você não pode se desconectar de uma sessão interativa que começou a usar o cmdlet Enter-PSSession.

Você pode usar sessões desconectadas para gerenciar PSSessions que foram desconectadas involuntariamente como resultado de uma interrupção de rede ou computador.

Cmdlets de sessão desconectados

Os seguintes cmdlets dão suporte ao recurso Sessões Desconectadas:

  • Connect-PSSession: conecta-se a uma PSSession desconectada.
  • Disconnect-PSSession: desconecta uma PSSession.
  • Get-PSSession: obtém PSSessions no computador local ou em computadores remotos.
  • Receive-PSSession: obtém os resultados dos comandos executados em sessões desconectadas.
  • O parâmetro Invoke-Command: InDisconnectedSession cria uma PSSession e se desconecta imediatamente.

Como funciona o recurso de sessões desconectadas

A partir do PowerShell 3.0, as PSSessions são independentes das sessões em que são criadas. As PSSessions ativas são mantidas no computador remoto ou no lado do servidor da conexão, mesmo se o lado do cliente computador estiver desligado ou desconectado da rede.

No PowerShell 2.0, a PSSession é excluída do computador remoto quando é desconectada da sessão de origem ou da sessão em que foi criada termina.

Quando você desconecta uma PSSession, a PSSession permanece ativa e é mantida no computador remoto. O estado da sessão muda de Em Execução para Desconectado. Você pode reconectar-se a uma PSSession desconectada a partir de:

  • A sessão atual no mesmo computador
  • Uma sessão diferente no mesmo computador
  • De uma sessão em um computador diferente

O computador remoto que mantém a sessão deve estar em execução e estar conectado à rede.

Os comandos em uma PSSession desconectada continuam sendo executados ininterruptamente no computador remoto até que o comando seja concluído ou o buffer de saída seja preenchido. Para impedir que um buffer de saída completo suspenda um comando, use o parâmetro OutputBufferingMode dos cmdlets Disconnect-PSSession, New-PSSessionOptionou New-PSTransportOption.

As sessões desconectadas são mantidas no estado desconectado no computador remoto. Eles estão disponíveis para você se reconectar até que você exclua a PSSession, como usando o cmdlet Remove-PSSession ou até que o tempo limite ocioso da PSSession expire. Você pode ajustar o tempo limite ocioso de uma PSSession usando os parâmetros IdleTimeoutSec ou IdleTimeout dos cmdlets Disconnect-PSSession, New-PSSessionOption ou New-PSTransportOption.

Outro usuário pode se conectar às PSSessions que você criou, mas somente se puder fornecer as credenciais que foram usadas para criar a sessão ou usar as credenciais RunAs da configuração da sessão.

Como obter PSSessions

A partir do PowerShell 3.0, o cmdlet Get-PSSession obtém PSSessions no computador local e em computadores remotos. Ele também pode obter PSSessions que foram criados na sessão atual.

Para obter PSSessions no computador local ou em computadores remotos, use os parâmetros ComputerName ou ConnectionUri. Sem os parâmetros, Get-PSSession obtém as PSSessions que foram criadas na sessão local, independentemente de onde terminem.

O exemplo a seguir mostra como usar Get-PSSession.

New-PSSession cria uma sessão para o computador Server01. A sessão reside no computador Server01.

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

Para obter a sessão do Server01, use o parâmetro ComputerName para especificar o destino de Get-PSSession.

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

Se o valor do parâmetro ComputerName de Get-PSSession for localhost, Get-PSSession obtém PSSessions que são encerradas e mantidas no computador local. Não se obtêm PSSessions no computador Server01, mesmo que tenham sido iniciadas no computador local.

Get-PSSession -ComputerName localhost

Para obter sessões criadas na sessão atual, use o cmdlet Get-PSSession sem parâmetros. Neste exemplo, Get-PSSession obtém a PSSession que foi criada na sessão atual e se conecta ao computador Server01.

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

Como desconectar sessões

Use o cmdlet Disconnect-PSSession para desconectar uma sessão. Para identificar a PSSession, use o parâmetro Session ou encaminhe um objeto PSSession dos cmdlets New-PSSession ou Get-PSSession para Disconnect-PSSession.

O comando a seguir desconecta a PSSession no computador Server01. Observe que o valor da propriedade Estado é Desconectado e a Disponibilidade é Nenhum(a).

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

Para criar uma sessão desconectada, use o parâmetro InDisconnectedSession do cmdlet Invoke-Command. Ele cria uma sessão, inicia o comando e se desconecta imediatamente, antes que o comando possa retornar qualquer saída.

O comando a seguir executa um comando Get-WinEvent em uma sessão desconectada no computador 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

Como se conectar a sessões desconectadas

Para conectar uma sessão desconectada, use o cmdlet Connect-PSSession com os parâmetros ComputerName ou ConnectionUri. Como alternativa, você pode canalizar a saída de Get-PSSession para Connect-PSSession.

O exemplo a seguir obtém as sessões no computador Server02. A saída inclui duas sessões desconectadas.

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

O comando a seguir conecta-se ao Session2. O PSSession agora está aberto e disponível.

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

Como obter os resultados

Para obter os resultados dos comandos executados em uma PSSession desconectada, use o cmdlet Receive-PSSession.

Você pode usar Receive-PSSession em vez de usar o cmdlet Connect-PSSession. Se a sessão já estiver reconectada, Receive-PSSession obterá os resultados dos comandos executados quando a sessão foi desconectada. Se a PSSession ainda estiver desconectada, Receive-PSSession se conectará a ela e obterá os resultados dos comandos executados durante a desconexão.

Receive-PSSession pode retornar os resultados em um trabalho (de forma assíncrona) ou no programa host (de forma síncrona). Use o parâmetro OutTarget para selecionar Job ou Host. O valor padrão é host. No entanto, se o comando que está sendo recebido foi iniciado na sessão atual como um Job, ele será retornado como um trabalho por padrão.

O exemplo a seguir usa o cmdlet Receive-PSSession para se reconectar à sessão no Server02 e obter os resultados do comando Get-WinEvent. O parâmetro OutTarget é usado para obter os resultados em um Trabalho.

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

Para obter os resultados do trabalho, use o 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

Propriedades de estado e disponibilidade

As propriedades Estado e Disponibilidade de uma PSSession desconectada informam se a sessão está disponível para você se reconectar a ela.

Quando uma PSSession está conectada à sessão atual, seu estado é Aberto e sua disponibilidade é Disponível. Quando você se desconecta do PSSession, o estado de PSSession é Desconectado e sua disponibilidade é Nenhum(a).

O valor da propriedade Estado é relacionado à sessão atual. Um valor Desconectado significa que a PSSession não está conectada à sessão atual. Mas isso não significa que a PSSession esteja desconectada de todas as sessões. Ela pode ser conectada a uma sessão diferente.

Para determinar se você pode se conectar ou se reconectar à PSSession, use a propriedade Disponibilidade. Um valor de None indica que você pode se conectar à sessão. Um valor Ocupado indica que você não pode se conectar à PSSession porque está conectado a outra sessão.

O exemplo a seguir é executado em duas sessões do PowerShell no mesmo computador. Observe os valores alterados das propriedades State e Availability em cada sessão à medida que a PSSession é desconectada e reconectada.

# 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

As sessões desconectadas são mantidas no computador remoto até que você as exclua, como ao usar o cmdlet Remove-PSSession, ou até atingirem o tempo limite. A propriedade IdleTimeout de uma PSSession determina por quanto tempo uma sessão desconectada é mantida antes de ser excluída.

Valores de tempo limite ociosos

As PSSessions ficam ociosas quando o thread de pulsação não recebe resposta. Desconectar uma sessão a torna ociosa e inicia o IdleTimeout relógio, mesmo que os comandos ainda estejam em execução na sessão desconectada. O PowerShell considera que as sessões desconectadas estão ativas, mas ociosas.

Ao criar e desconectar sessões, verifique se o tempo limite ocioso na PSSession é longo o suficiente para manter a sessão para suas necessidades, mas não tanto tempo que consome recursos desnecessários no computador remoto.

A propriedade IdleTimeoutMs da configuração da sessão determina o tempo limite ocioso padrão das sessões que usam a configuração da sessão. Você pode substituir o valor padrão, mas esse valor não pode exceder a propriedade MaxIdleTimeoutMs da configuração da sessão.

Use o comando a seguir para obter os valores de IdleTimeoutMs e MaxIdleTimeoutMs para uma configuração de sessão.

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

Se você for membro do grupo Administradores no computador remoto, poderá definir esses valores ao criar uma configuração de sessão. Além disso, você pode alterar os valores quando desconectar.

O valor de tempo limite ocioso das configurações de sessão e das opções de sessão está em milissegundos. O valor de tempo limite ocioso das sessões e das opções de configuração de sessão é em segundos.

Você pode definir o tempo limite de inatividade de uma PSSession ao criá-la (New-PSSession, Invoke-Command) e quando você se desconectar dela (Disconnect-PSSession). No entanto, você não pode alterar o valor de idleTimeout ao se conectar à PSSession (Connect-PSSession) ou obter resultados (Receive-PSSession).

Os cmdlets Connect-PSSession e Receive-PSSession têm um parâmetro SessionOption que usa um objeto PSSessionOption, como um retornado pelo cmdlet New-PSSessionOption.

O valor IdleTimeout no objeto SessionOption e o valor de IdleTimeout na variável de preferência $PSSessionOption não alteram o valor do idleTimeout em um comando Connect-PSSession ou Receive-PSSession.

Para criar uma PSSession com um valor de tempo limite ocioso específico, crie uma variável de preferência $PSSessionOption. Defina o valor da propriedade IdleTimeout com o valor desejado (em milissegundos).

Quando você cria PSSessions, os valores em $PSSessionOption variável têm precedência sobre os valores na configuração da sessão.

Por exemplo, o comando a seguir define um tempo limite ocioso de 48 horas:

$PSSessionOption = New-PSSessionOption -IdleTimeoutMSec 172800000

Para criar uma PSSession com um valor de tempo limite ocioso específico, use o parâmetro IdleTimeoutMSec do cmdlet New-PSSessionOption. Em seguida, use a opção de sessão no valor do parâmetro SessionOption dos cmdlets New-PSSession ou Invoke-Command.

Os valores definidos ao criar a sessão têm precedência sobre os valores definidos na variável de preferência $PSSessionOption e na configuração da sessão.

Por exemplo:

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

Para alterar o tempo limite ocioso de uma PSSession ao se desconectar, use o parâmetro IdleTimeoutSec do cmdlet Disconnect-PSSession.

Por exemplo:

Disconnect-PSSession -IdleTimeoutSec 172800

Para criar uma configuração de sessão com um tempo limite de inatividade específico e um tempo limite máximo de inatividade, use os parâmetros IdleTimeoutSec e MaxIdleTimeoutSec do cmdlet New-PSTransportOption. Em seguida, use a opção de transporte no valor do parâmetro TransportOption de Register-PSSessionConfiguration.

Por exemplo:

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

Para alterar o tempo limite ocioso padrão e o tempo limite ocioso máximo de uma configuração de sessão, use os parâmetros IdleTimeoutSec e MaxIdleTimeoutSec parâmetros do cmdlet New-PSTransportOption. Em seguida, use a opção de transporte no valor do parâmetro TransportOption de Set-PSSessionConfiguration.

Por exemplo:

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

Modo de buffer de saída

O modo de buffer de saída de uma PSSession determina como a saída do comando é gerenciada quando o buffer de saída da PSSession está cheio.

Em uma sessão desconectada, o modo de buffer de saída determina efetivamente se o comando continua a ser executado enquanto a sessão está desconectada.

Os valores válidos são os seguintes:

  • Block (padrão) – quando o buffer de saída está cheio, a execução é suspensa até que o buffer esteja limpo. Block preserva dados, mas pode interromper o comando.
  • Drop - Quando o buffer de saída está cheio, a execução continua. À medida que a nova saída é gerada, a saída mais antiga é descartada. Ao usar o valor Drop, redirecione a saída para um arquivo. Esse valor é recomendado para sessões desconectadas.

A propriedade OutputBufferingMode da configuração da sessão determina o modo de buffer padrão de sessões que usam a configuração da sessão.

Para localizar o valor de uma configuração de sessão do OutputBufferingMode, você pode usar qualquer um dos seguintes formatos de comando:

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

Você pode substituir o valor padrão na configuração da sessão e definir o modo de buffer de saída de uma PSSession ao criar uma PSSession, quando você se desconectar e quando se reconectar.

Se você for membro do grupo Administradores no computador remoto, poderá criar e alterar o modo de buffer de saída das configurações de sessão.

Para criar uma PSSession com um modo de buffer de saída de Drop, crie uma variável de preferência $PSSessionOption na qual o valor da propriedade OutputBufferingMode é Drop.

Quando você cria PSSessions, os valores em $PSSessionOption variável têm precedência sobre os valores na configuração da sessão.

Por exemplo:

$PSSessionOption = New-PSSessionOption -OutputBufferingMode Drop

Use o parâmetro OutputBufferingMode do cmdlet New-PSSessionOption para criar uma opção de sessão com um valor de Drop. Em seguida, use o objeto PSSessionOption como valor do parâmetro SessionOption dos cmdlets New-PSSession ou Invoke-Command.

Os valores definidos ao criar a sessão têm precedência sobre os valores definidos na variável de preferência $PSSessionOption e na configuração da sessão.

Por exemplo:

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

Para alterar o modo de buffer de saída de uma PSSession ao desconectar, use o parâmetro OutputBufferingMode do cmdlet Disconnect-PSSession.

Por exemplo:

Disconnect-PSSession -OutputBufferingMode Drop

Para alterar o modo de buffer de saída de uma PSSession ao se reconectar, use o parâmetro OutputBufferingMode do cmdlet New-PSSessionOption. Em seguida, use a opção de sessão no valor do parâmetro SessionOption de Connect-PSSession ou Receive-PSSession.

Por exemplo:

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

Para criar uma configuração de sessão com um modo de buffer de saída padrão de Drop, use o parâmetro OutputBufferingMode do cmdlet New-PSTransportOption para criar um objeto de opção de transporte com um valor de Drop. Em seguida, use a opção de transporte no valor do parâmetro TransportOption de Register-PSSessionConfiguration.

Por exemplo:

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

Para alterar o modo de buffer de saída padrão de uma configuração de sessão, use o parâmetro OutputBufferingMode do cmdlet New-PSTransportOption para criar uma opção de transporte com um valor de Drop. Em seguida, use a opção Transporte no valor do parâmetro SessionOption de Set-PSSessionConfiguration.

Por exemplo:

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

Desconectando sessões de loopback

As sessões de loopback ou sessões locais são sessões do PowerShell que se originam e terminam no mesmo computador. Assim como outras PSSessions, as sessões de loopback ativas são mantidas no computador que está na outra extremidade da conexão (o computador local), para que você possa se desconectar e se reconectar às sessões de loopback.

Por padrão, as sessões de loopback são criadas com um token de segurança de rede que não permite a execução de comandos na sessão para acessar outros computadores. Você pode se reconectar a sessões de loopback que possuem um token de segurança de rede a partir de qualquer sessão no computador local ou em um computador remoto.

No entanto, se você usar o parâmetro EnableNetworkAccess do cmdlet New-PSSession, Enter-PSSessionou Invoke-Command, a sessão de loopback será criada com um token de segurança interativo. O token interativo permite que os comandos executados na sessão de loopback obtenham dados de outros computadores.

Você pode desconectar sessões de loopback utilizando tokens interativos e depois reconectar-se a elas da mesma sessão ou de uma sessão diferente no mesmo computador. No entanto, para impedir o acesso mal-intencionado, você pode acessar novamente sessões de loopback com tokens interativos apenas a partir do computador onde foram criadas.

Aguardando trabalhos em sessões desconectadas

O cmdlet Wait-Job aguarda até que um trabalho seja concluído e, em seguida, retorne ao prompt de comando ou ao próximo comando. Por padrão, Wait-Job retorna se a sessão na qual um trabalho está em execução estiver desconectada. Para direcionar o cmdlet Wait-Job para aguardar até que a sessão seja reconectada, no estado Aberto, use o parâmetro Force. Para obter mais informações, consulte Wait-Job.

Sessões robustas e desconexão não intencional

Uma PSSession pode ser desconectada involuntariamente devido a uma falha de computador ou interrupção de rede. O PowerShell tenta recuperar a PSSession, mas seu sucesso depende da gravidade e duração da causa.

O estado de uma PSSession desconectada involuntariamente poderia ser Interrompido(a) ou Fechado(a), mas também poderia se Desconectado(a). Se o valor de Estado for Desconectado(a), você poderá usar as mesmas técnicas para gerenciar a PSSession como se a sessão estivesse desconectada intencionalmente. Por exemplo, você pode usar o cmdlet Connect-PSSession para se reconectar à sessão e ao cmdlet Receive-PSSession para obter resultados de comandos executados enquanto a sessão estava desconectada.

Se você fechar (sair) a sessão na qual uma PSSession foi criada enquanto os comandos estão em execução na PSSession, o PowerShell mantém a PSSession no estado Desconectado(a) no computador remoto. Se você fechar (sair) a sessão na qual uma PSSession foi criada, mas nenhum comando estiver em execução no PSSession, o PowerShell não tentará manter a PSSession.

Consulte também