about_Remote_Disconnected_Sessions

Descrição breve

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

Descrição longa

A partir do PowerShell 3.0, você pode se desconectar de um PSSession e se reconectar ao PSSession do mesmo computador ou de um computador diferente. O estado da sessão é mantido e os comandos no PSSession continuam a ser executados enquanto a sessão é desconectada.

O recurso Sessões Desconectadas permite fechar a sessão na qual um PSSession foi criado e desligar 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 prolongado para serem concluídos.

Não é possível se desconectar de uma sessão interativa iniciada usando o Enter-PSSession cmdlet.

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

Cmdlets de sessão desconectados

Os cmdlets a seguir oferecem suporte ao recurso Sessões Desconectadas:

  • Connect-PSSession: Conecta-se a um PSSession desconectado.
  • Disconnect-PSSession: Desconecta um 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.
  • Invoke-Command: O parâmetro InDisconnectedSession cria um PSSession e se desconecta imediatamente.

Como funciona o recurso Sessões Desconectadas

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

No PowerShell 2.0, o PSSession é excluído do computador remoto quando é desconectado da sessão de origem ou a sessão na qual foi criado termina.

Quando você desconecta um PSSession, o PSSession permanece ativo e é mantido no computador remoto. O estado da sessão muda de Em execução para Desconectado. Você pode se reconectar a um PSSession desconectado 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 conectado à rede.

Os comandos em um PSSession desconectado continuam a ser 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 do Disconnect-PSSession, New-PSSessionOptionou New-PSTransportOption cmdlets.

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

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

Como obter PSSessions

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

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

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 de 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 obterá PSSessions que terminam em e são mantidos no computador local. Ele não obtém PSSessions no computador Server01, mesmo se eles foram iniciados no computador local.

Get-PSSession -ComputerName localhost

Para obter sessões que foram criadas na sessão atual, use o Get-PSSession cmdlet sem parâmetros. Neste exemplo, Get-PSSession obtém o PSSession que foi criado 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 Disconnect-PSSession cmdlet para desconectar uma sessão. Para identificar o PSSession, use o parâmetro Session ou canalize um objeto PSSession dos New-PSSession cmdlets ou Get-PSSession para Disconnect-PSSession.

O comando a seguir desconecta o PSSession para o computador Server01. Observe que o valor da propriedade State é Desconectado e a Disponibilidade é Nenhuma.

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 Invoke-Command cmdlet. 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 Get-WinEvent comando 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 Connect-PSSession cmdlet 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 se conecta a Session2. O PSSession já 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 um PSSession desconectado, use o Receive-PSSession cmdlet.

Você pode usar Receive-PSSession em vez de usar o Connect-PSSession cmdlet. Se a sessão já estiver reconectada, Receive-PSSession obterá os resultados dos comandos executados quando a sessão foi desconectada. Se o PSSession ainda estiver desconectado, conecte-se a ele e, em seguida, Receive-PSSession obtenha os resultados dos comandos que foram executados enquanto ele foi desconectado.

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

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

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 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

Propriedades de estado e disponibilidade

As propriedades State e Availability de um PSSession desconectado informam se a sessão está disponível para você se reconectar a ela.

Quando um PSSession está conectado à sessão atual, seu estado é Aberto e sua disponibilidade é Disponível. Quando você se desconecta do PSSession, o estado PSSession é Desconectado e sua disponibilidade é Nenhum.

O valor da propriedade State é relativo à sessão atual. Um valor de Desconectado significa que o PSSession não está conectado à sessão atual. Mas, isso não significa que o PSSession está desconectado de todas as sessões. Ela pode ser conectada a uma sessão diferente.

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

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

# 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 usando o cmdlet, ou até que atinjam o Remove-PSSession tempo limite. A propriedade IdleTimeout de um PSSession determina por quanto tempo uma sessão desconectada é mantida antes de ser excluída.

Valores de tempo limite ocioso

PSSessions ficam ociosos quando o fio de batimento cardíaco não recebe resposta. Desconectar uma sessão a torna ociosa e inicia o relógio IdleTimeout, mesmo se os comandos ainda estiverem em execução na sessão desconectada. O PowerShell considera as sessões desconectadas ativas, mas ociosas.

Ao criar e desconectar sessões, verifique se o tempo limite ocioso no PSSession é longo o suficiente para manter a sessão para suas necessidades, mas não tanto tempo que consuma 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 ao se desconectar.

O valor de tempo limite ocioso das configurações de sessão e opções de sessão é 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 ocioso de um PSSession ao criar o PSSession (New-PSSession, Invoke-Command) e quando se desconectar dele (Disconnect-PSSession). No entanto, você não pode alterar o valor IdleTimeout quando você se conectar ao PSSession (Connect-PSSession) ou obter resultados (Receive-PSSession).

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

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

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

Quando você cria PSSessions, os valores na $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 um PSSession com um valor de tempo limite ocioso específico, use o parâmetro IdleTimeoutMSec do New-PSSessionOption cmdlet. Em seguida, use a opção session no valor do parâmetro SessionOption dos New-PSSession cmdlets 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 e na $PSSessionOption configuração da sessão.

Por exemplo:

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

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

Por exemplo:

Disconnect-PSSession -IdleTimeoutSec 172800

Para criar uma configuração de sessão com um tempo limite ocioso específico e um tempo limite máximo ocioso, use os parâmetros IdleTimeoutSec e MaxIdleTimeoutSec do New-PSTransportOption cmdlet. 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 máximo ocioso de uma configuração de sessão, use os parâmetros IdleTimeoutSec e MaxIdleTimeoutSec do New-PSTransportOption cmdlet. 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 um PSSession determina como a saída do comando é gerenciada quando o buffer de saída do 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 é 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 uma nova saída é gerada, a saída mais antiga é descartada. Ao usar o Drop valor, 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 das 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 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 um PSSession ao criar um PSSession, ao se desconectar e ao 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 um PSSession com um modo de buffer de saída do Drop, crie uma $PSSessionOption variável de preferência na qual o valor da propriedade OutputBufferingMode seja Drop.

Quando você cria PSSessions, os valores na $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 New-PSSessionOption cmdlet 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 New-PSSession cmdlets 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 e na $PSSessionOption 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 um PSSession ao se desconectar, use o parâmetro OutputBufferingMode do Disconnect-PSSession cmdlet.

Por exemplo:

Disconnect-PSSession -OutputBufferingMode Drop

Para alterar o modo de buffer de saída de um PSSession ao se reconectar, use o parâmetro OutputBufferingMode do New-PSSessionOption cmdlet. 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 do Drop, use o parâmetro OutputBufferingMode do New-PSTransportOption cmdlet 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 New-PSTransportOption cmdlet para criar uma opção de transporte com um valor de Drop. Em seguida, use a opção Transport 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

Sessões de loopback, ou sessões locais, são PSSessions que se originam e terminam no mesmo computador. Como outros PSSessions, as sessões de loopback ativas são mantidas no computador na extremidade remota 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 que comandos executados na sessão acessem outros computadores. Você pode se reconectar a sessões de loopback que tenham um token de segurança de rede de qualquer sessão no computador local ou em um computador remoto.

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

Você pode desconectar sessões de loopback com tokens interativos e, em seguida, reconectar-se a eles a partir da mesma sessão ou de uma sessão diferente no mesmo computador. No entanto, para evitar acesso mal-intencionado, você pode se reconectar a sessões de loopback com tokens interativos somente do computador em que eles foram criados.

Aguardando trabalhos em sessões desconectadas

O Wait-Job cmdlet aguarda até que um trabalho seja concluído e, em seguida, retorna ao prompt de comando ou ao próximo comando. Por padrão, Wait-Job retorna se a sessão na qual um trabalho está sendo executado estiver desconectada. Para direcionar o Wait-Job cmdlet a 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

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

O estado de um PSSession desconectado involuntariamente pode ser Quebrado ou Fechado, mas também pode ser Desconectado. Se o valor de State for Disconnected, você poderá usar as mesmas técnicas para gerenciar o PSSession que faria se a sessão fosse desconectada intencionalmente. Por exemplo, você pode usar o Connect-PSSession cmdlet para se reconectar à sessão e o Receive-PSSession cmdlet para obter resultados de comandos executados enquanto a sessão foi desconectada.

Se você fechar (sair) a sessão na qual um PSSession foi criado enquanto os comandos estão sendo executados no PSSession, o PowerShell manterá o PSSession no estado Desconectado no computador remoto. Se você fechar (sair) a sessão na qual um PSSession foi criado, mas nenhum comando estiver sendo executado no PSSession, o PowerShell não tentará manter o PSSession.

Confira também