Compartilhar via


about_Remote_Disconnected_Sessions

Descrição breve

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 no mesmo computador ou em 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 só está disponível quando o computador remoto é um computador Windows que executa o PowerShell 3.0 ou uma versão posterior e o computador local está executando o Windows.

O recurso Sessões Desconectadas permite que você feche a sessão na qual uma PSSession foi criada e até mesmo feche o PowerShell e desligue o computador, sem interromper os comandos em execução na PSSession. As sessões desconectadas são úteis para executar comandos que levam um longo tempo para serem concluídos e fornecem o tempo e a flexibilidade de dispositivo que os profissionais de TI exigem.

Você não pode se desconectar de uma sessão interativa iniciada com o Enter-PSSession cmdlet .

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

No uso do mundo real, o recurso Sessões Desconectadas permite que você comece a resolver um problema, volte sua atenção para um problema de prioridade mais alta e, em seguida, retome o trabalho na solução, mesmo em um computador diferente em um local diferente.

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.
  • Invoke-Command: o parâmetro InDisconnectedSession cria uma 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 em que são criadas. As PSSessions ativas são mantidas no computador remoto ou no lado do servidor da conexão, mesmo que a sessão na qual a PSSession foi criada seja fechada e o computador de origem seja 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 Executando para Desconectado. Você pode se reconectar a uma PSSession desconectada da sessão atual ou de uma sessão diferente no mesmo computador ou de 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 Disconnect-PSSessioncmdlets , 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 Remove-PSSession cmdlet 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 Disconnect-PSSessioncmdlets , New-PSSessionOptionou New-PSTransportOption .

Outro usuário pode se conectar a PSSessions que você criou, mas somente se ele 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 em computadores remotos. Ele também pode obter PSSessions que foram criadas na sessão atual.

Para obter PSSessions no computador local ou em 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 eles terminam.

Ao obter PSSessions, lembre-se de procurá-las no computador no qual elas são mantidas, ou seja, o computador remoto ou do lado do servidor.

Por exemplo, se você criar uma PSSession para o computador Server01, obtenha a sessão do computador Server01. Se você criar uma PSSession de outro computador para o computador local, obtenha a sessão do computador local.

A sequência de comandos a seguir mostra como Get-PSSession funciona.

O primeiro comando 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, use o parâmetro ComputerName de Get-PSSession com um valor de Server01.

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 terminam em e são mantidas no computador local. Ele não obtém PSSessions no computador Server01, mesmo que tenham sido 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 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

Para desconectar uma PSSession, use o Disconnect-PSSession cmdlet . Para identificar a PSSession, use o parâmetro Session ou pipeline de uma PSSession dos New-PSSession cmdlets ou Get-PSSession para Disconnect-PSSession.

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

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

Você pode se conectar a qualquer PSSession desconectado disponível da sessão na qual você criou a PSSession ou de outras sessões no computador local ou em outros computadores.

Você pode criar uma PSSession, executar comandos na PSSession, desconectar-se da PSSession, fechar o PowerShell e desligar o computador. Horas depois, você pode abrir um computador diferente, obter a PSSession, conectar-se a ele e obter os resultados dos comandos executados na PSSession enquanto ele estava desconectado. Em seguida, você pode executar mais comandos na sessão.

Para conectar uma PSSession desconectada, use o Connect-PSSession cmdlet . Use os parâmetros ComputerName ou ConnectionUri para identificar a PSSession ou pipeline de uma PSSession de Get-PSSession para Connect-PSSession.

O comando a seguir obtém as sessões no computador Server02. A saída inclui duas sessões desconectadas, ambas disponíveis.

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 a Session2. A PSSession agora está aberta 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 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 a PSSession ainda estiver desconectada, Receive-PSSession conectará-se a ela e obterá os resultados dos comandos executados enquanto ele estava 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 tiver sido iniciado na sessão atual como um Trabalho, ele será retornado como um Trabalho por padrão.

O comando a seguir usa o Receive-PSSession cmdlet para se conectar à PSSession no computador Server02 e obter os resultados do Get-WinEvent comando executado na sessão Session3. O comando usa o parâmetro OutTarget 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 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 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 está Disponível. Quando você se desconecta da PSSession, o estado PSSession é Desconectado e sua disponibilidade é None.

O valor da propriedade State é relativo a sessão atual. Um valor de Disconnected 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 reconectar à PSSession, use a propriedade Availability . Um valor None indica que você pode se conectar à sessão. Um valor ocupado indica que você não pode se conectar à PSSession porque ela está conectada 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 Estado e Disponibilidade 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
# Idle Timeout

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

As PSSessions ficam ociosas quando o thread de pulsação não recebe resposta. Desconectar uma sessão a torna ociosa e inicia o relógio IdleTimeout , mesmo que os comandos ainda estejam em execução na sessão desconectada. O PowerShell considera as sessões desconectadas como 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 o valor que você usa não pode exceder a propriedade MaxIdleTimeoutMs da configuração da sessão.

Para localizar o valor dos valores IdleTimeoutMs e MaxIdleTimeoutMs de uma configuração de sessão, use o seguinte formato de comando.

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

Você pode substituir o valor padrão na configuração da sessão e definir o tempo limite ocioso de uma PSSession ao criar uma PSSession e quando desconectar.

Se você for membro do grupo Administradores no computador remoto, poderá criar e alterar as propriedades IdleTimeoutMs e MaxIdleTimeoutMs das configurações de sessão.

Valores de tempo limite ocioso

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 ocioso de uma PSSession ao criar a PSSession (New-PSSession, Invoke-Command) e quando desconectar dela (Disconnect-PSSession). No entanto, você não pode alterar o valor IdleTimeout ao se conectar à 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 SessionOption , 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 da PSSession em um Connect-PSSession comando ou Receive-PSSession .

Para criar uma PSSession com um valor de tempo limite ocioso específico, crie uma $PSSessionOption variável de 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 uma 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 de sessão 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 $PSSessionOption variável de preferência 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 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 tempo limite máximo de ociosidade, 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 de ociosidade 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 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 da seguinte maneira:

  • Bloquear. Quando o buffer de saída está cheio, a execução é suspensa até que o buffer esteja limpo. O valor padrão.
  • 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.

Bloquear preserva dados, mas pode interromper o comando. Um valor de Drop permite que o comando ser concluído, embora os dados possam ser perdidos. Ao usar o valor Drop, redirecione a saída do comando para um arquivo no disco. Esse valor é recomendado para sessões desconectadas.

A propriedade OutputBufferingMode da configuração de sessão determina o modo de buffer de saída padrão de sessões que usam a configuração de 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 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 $PSSessionOption variável de preferência na qual o valor da propriedade OutputBufferingMode é 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

Para criar uma PSSession com um modo de buffer de saída de Drop, use o parâmetro OutputBufferingMode do New-PSSessionOption cmdlet para criar uma opção de sessão com um valor drop. Em seguida, use a opção de sessão 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 $PSSessionOption variável de preferência 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 Disconnect-PSSession cmdlet .

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 New-PSSessionOption cmdlet para criar uma opção de sessão com um valor Drop. 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 New-PSTransportOption cmdlet para criar um objeto de opção de transporte com um valor 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 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

Sessões de loopback, ou sessões locais, são PSSessions originadas e terminam no mesmo computador. Assim como outras 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 desconectar e reconectar-se a 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 os comandos sejam executados na sessão para acessar outros computadores. Você pode reconectar-se a sessões de loopback que têm 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 New-PSSessioncmdlet , 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 com tokens interativos e reconectá-las da mesma sessão ou de uma sessão diferente no mesmo computador. No entanto, para evitar o acesso mal-intencionado, você pode se reconectar a sessões de loopback com tokens interativos somente do computador no qual foram criados.

Aguardando trabalhos em sessões desconectadas

O Wait-Job cmdlet 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 retornará 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

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 pode ser Desfeito ou Fechado, mas também pode estar Desconectado. Se o valor de Estado for Desconectado, você poderá usar as mesmas técnicas para gerenciar a PSSession como faria se a sessão fosse desconectada intencionalmente. Por exemplo, você pode usar o Connect-PSSession cmdlet para se reconectar à sessão e ao Receive-PSSession cmdlet 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 manterá a PSSession no estado Desconectado no computador remoto. Se você fechar (sair) a sessão na qual uma PSSession foi criada, mas nenhum comando estiver em execução na PSSession, o PowerShell não tentará manter a PSSession.

Confira também