about_Remote_Disconnected_Sessions

Descripción breve

Explica cómo desconectar y volver a conectarse a una sesión de PowerShell (PSSession).

Descripción larga

A partir de PowerShell 3.0, puede desconectar una PSSession y volver a conectarse a PSSession desde el mismo equipo o desde otro equipo. El estado de sesión se mantiene y los comandos de PSSession continúan ejecutándose mientras la sesión está desconectada.

La característica Sesiones desconectadas permite cerrar la sesión en la que se creó una PSSession y apagar el equipo sin interrumpir los comandos que se ejecutan en la PSSession remota. Las sesiones desconectadas son útiles para ejecutar comandos que tardan un tiempo prolongado en completarse.

No se puede desconectar de una sesión interactiva que se inicia mediante el Enter-PSSession cmdlet .

Puede usar sesiones desconectadas para administrar PSSessions que se desconectaron involuntariamente como resultado de una interrupción de equipo o red.

Cmdlets de sesión desconectados

Los cmdlets siguientes admiten la característica Sesiones desconectadas:

  • Connect-PSSession: Conectar a una PSSession desconectada.
  • Disconnect-PSSession: desconecta una PSSession.
  • Get-PSSession: obtiene PSSessions en el equipo local o en equipos remotos.
  • Receive-PSSession: obtiene los resultados de los comandos que se ejecutaron en sesiones desconectadas.
  • Invoke-Command: el parámetro InDisconnectedSession crea una PSSession y se desconecta inmediatamente.

Funcionamiento de la característica Sesiones desconectadas

A partir de PowerShell 3.0, PSSessions son independientes de las sesiones en las que se crean. Las PSSession activas se mantienen en el equipo remoto o servidor de la conexión, incluso si el equipo del lado cliente está apagado o desconectado de la red.

En PowerShell 2.0, la PSSession se elimina del equipo remoto cuando se desconecta de la sesión de origen o de la sesión en la que se creó finaliza.

Cuando desconecta una PSSession, la PSSession permanece activa y se mantiene en el equipo remoto. El estado de sesión cambia de En ejecución a Desconectado. Puede volver a conectarse a una PSSession desconectada desde

  • Sesión actual en el mismo equipo
  • Una sesión diferente en el mismo equipo
  • Desde una sesión en un equipo diferente

El equipo remoto que mantiene la sesión debe estar en ejecución y estar conectado a la red.

Los comandos de una PSSession desconectada continúan ejecutándose sin interrupciones en el equipo remoto hasta que el comando se completa o se rellena el búfer de salida. Para evitar que un búfer de salida completo suspenda un comando, use el parámetro OutputBufferingMode de los Disconnect-PSSessioncmdlets , New-PSSessionOptiono New-PSTransportOption .

Las sesiones desconectadas se mantienen en estado desconectado en el equipo remoto. Están disponibles para volver a conectarse hasta que elimine la PSSession, como mediante el uso del Remove-PSSession cmdlet o hasta que expire el tiempo de espera de inactividad de PSSession. Puede ajustar el tiempo de espera de inactividad de una PSSession mediante los parámetros IdleTimeoutSec o IdleTimeout de los Disconnect-PSSessioncmdlets , New-PSSessionOptiono New-PSTransportOption .

Otro usuario puede conectarse a PSSessions que creó, pero solo si puede proporcionar las credenciales que se usaron para crear la sesión o usar las RunAs credenciales de la configuración de sesión.

Cómo obtener PSSessions

A partir de PowerShell 3.0, el Get-PSSession cmdlet obtiene PSSessions en el equipo local y en los equipos remotos. También puede obtener PSSessions que se crearon en la sesión actual.

Para obtener PSSessions en el equipo local o en equipos remotos, use los parámetros ComputerName o Conectar ionUri. Sin parámetros, Get-PSSession obtiene PSSession que se crearon en la sesión local, independientemente de dónde finalicen.

En el ejemplo siguiente se muestra cómo utilizar Get-PSSession.

New-PSSession crea una sesión en el equipo Server01. La sesión reside en el equipo Server01.

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

Para obtener la sesión de Server01, use el parámetro ComputerName para especificar el destino de Get-PSSession.

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

Si el valor del parámetro ComputerName de Get-PSSession es localhost, Get-PSSession obtiene PSSessions que terminan en y se mantienen en el equipo local. No obtiene PSSessions en el equipo Server01, incluso si se iniciaron en el equipo local.

Get-PSSession -ComputerName localhost

Para obtener las sesiones que se crearon en la sesión actual, use el Get-PSSession cmdlet sin parámetros. En este ejemplo, Get-PSSession obtiene la PSSession que se creó en la sesión actual y se conecta al equipo Server01.

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

Desconexión de sesiones

Use el Disconnect-PSSession cmdlet para desconectar una sesión. Para identificar PSSession, use el parámetro Session o canalice un objeto PSSession de los New-PSSession cmdlets o Get-PSSession a Disconnect-PSSession.

El siguiente comando desconecta la PSSession en el equipo Server01. Observe que el valor de la propiedad State está Desconectado y la disponibilidad es None.

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

Para crear una sesión desconectada, use el parámetro InDisconnectedSession del Invoke-Command cmdlet . Crea una sesión, inicia el comando y se desconecta inmediatamente antes de que el comando pueda devolver cualquier salida.

El siguiente comando ejecuta un Get-WinEvent comando en una sesión desconectada en el equipo 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

Conexión a sesiones desconectadas

Para conectar una sesión desconectada, use el Connect-PSSession cmdlet con los parámetros ComputerName o Conectar ionUri. Como alternativa, podría canalizar la salida de Get-PSSession a Connect-PSSession.

En el ejemplo siguiente se obtienen las sesiones en el equipo Server02. La salida incluye dos sesiones 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

El comando siguiente se conecta a Session2. PsSession ya está abierto y disponible.

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

Cómo obtener los resultados

Para obtener los resultados de los comandos que se ejecutaron en una PSSession desconectada, use el Receive-PSSession cmdlet .

Puede usar Receive-PSSession en lugar de usar el Connect-PSSession cmdlet . Si la sesión ya está reconectada, Receive-PSSession obtiene los resultados de los comandos que se ejecutaron cuando se desconectaba la sesión. Si la PSSession sigue desconectada, se conecta a ella y, a continuación, Receive-PSSession obtiene los resultados de los comandos que se ejecutaron mientras se desconectaba.

Receive-PSSession puede devolver los resultados en un trabajo (de forma asincrónica) o en el programa host (sincrónicamente). Use el parámetro OutTarget para seleccionar Trabajo o Host. El valor predeterminado es Host. Sin embargo, si el comando que se recibe se inició en la sesión actual como trabajo, se devuelve como un trabajo de forma predeterminada.

En el ejemplo siguiente se usa el Receive-PSSession cmdlet para volver a conectarse a la sesión en Server02 y obtener los resultados del Get-WinEvent comando. El parámetro OutTarget se usa para obtener los resultados en un trabajo.

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

Para obtener los resultados del trabajo, use el 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

Propiedades de estado y disponibilidad

Las propiedades State y Availability de una PSSession desconectada le indican si la sesión está disponible para volver a conectarse a ella.

Cuando una PSSession está conectada a la sesión actual, su estado es Abierto y su disponibilidad es Disponible. Cuando se desconecta de PSSession, el estado PSSession es Desconectado y su disponibilidad es None.

El valor de la propiedad State es relativo a la sesión actual. Un valor de Disconnected significa que PSSession no está conectado a la sesión actual. Pero no significa que la PSSession esté desconectada de todas las sesiones. Podría estar conectada a una sesión diferente.

Para determinar si puede conectarse o volver a conectarse a la PSSession, use la propiedad Availability . Un valor de None indica que puede conectarse a la sesión. Un valor de Busy indica que no se puede conectar a PSSession porque está conectado a otra sesión.

El ejemplo siguiente se ejecuta en dos sesiones de PowerShell en el mismo equipo. Tenga en cuenta los valores cambiantes de las propiedades State y Availability de cada sesión, ya que PSSession está desconectado y 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

Las sesiones desconectadas se mantienen en el equipo remoto hasta que se eliminan, como el uso del Remove-PSSession cmdlet o el tiempo de espera. La propiedad IdleTimeout de una PSSession determina cuánto tiempo se mantiene una sesión desconectada antes de eliminarla.

Valores de tiempo de espera de inactividad

Las PSSessions están inactivas cuando el subproceso de latido no recibe ninguna respuesta. La desconexión de una sesión hace que esté inactiva e inicia el reloj IdleTimeout , incluso si los comandos siguen ejecutándose en la sesión desconectada. PowerShell considera que las sesiones desconectadas están activas, pero inactivas.

Al crear y desconectar sesiones, compruebe que el tiempo de espera de inactividad de PSSession es lo suficientemente largo como para mantener la sesión para sus necesidades, pero no tanto tiempo que consume recursos innecesarios en el equipo remoto.

La propiedad IdleTimeoutMs de la configuración de sesión determina el tiempo de espera de inactividad predeterminado de las sesiones que usan la configuración de sesión. Puede invalidar el valor predeterminado, pero ese valor no puede superar la propiedad MaxIdleTimeoutMs de la configuración de sesión.

Use el siguiente comando para obtener los valores de IdleTimeoutMs y MaxIdleTimeoutMs para una configuración de sesión.

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

Si es miembro del grupo Administración istrators en el equipo remoto, puede establecer estos valores al crear una configuración de sesión. Además, puede cambiar los valores cuando se desconecte.

El valor de tiempo de espera de inactividad de las configuraciones de sesión y las opciones de sesión está en milisegundos. El valor de tiempo de espera de inactividad de las sesiones y las opciones de configuración de sesión es en segundos.

Puede establecer el tiempo de espera de inactividad de una PSSession al crear la PSSession (New-PSSession, Invoke-Command) y cuando se desconecte de ella (Disconnect-PSSession). Sin embargo, no puede cambiar el valor IdleTimeout al conectarse a PSSession (Connect-PSSession) o obtener resultados (Receive-PSSession).

Los Connect-PSSession cmdlets y Receive-PSSession tienen un parámetro SessionOption que toma un objeto PSSessionOption , como uno devuelto por el New-PSSessionOption cmdlet.

El valor IdleTimeout del objeto SessionOption y el valor IdleTimeout de la $PSSessionOption variable de preferencia no cambian el valor de IdleTimeout en un Connect-PSSession comando o Receive-PSSession .

Para crear una PSSession con un valor determinado de tiempo de espera de inactividad, cree una $PSSessionOption variable de preferencia. Establezca el valor de la propiedad IdleTimeout en el valor deseado (en milisegundos).

Al crear PSSessions, los valores de $PSSessionOption la variable tienen prioridad sobre los valores de la configuración de sesión.

Por ejemplo, el comando siguiente establece un tiempo de espera de inactividad de 48 horas:

$PSSessionOption = New-PSSessionOption -IdleTimeoutMSec 172800000

Para crear una PSSession con un valor de tiempo de espera de inactividad determinado, use el parámetro IdleTimeoutMSec del New-PSSessionOption cmdlet . A continuación, use la opción de sesión en el valor del parámetro SessionOption de los New-PSSession cmdlets o Invoke-Command .

Los valores establecidos al crear la sesión tienen prioridad sobre los valores establecidos en la $PSSessionOption variable de preferencia y la configuración de la sesión.

Por ejemplo:

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

Para cambiar el tiempo de espera de inactividad de una PSSession cuando se desconecte, use el parámetro IdleTimeoutSec del Disconnect-PSSession cmdlet .

Por ejemplo:

Disconnect-PSSession -IdleTimeoutSec 172800

Para crear una configuración de sesión con un tiempo de espera de inactividad determinado y el tiempo máximo de espera de inactividad, use los parámetros IdleTimeoutSec y MaxIdleTimeoutSec del New-PSTransportOption cmdlet . A continuación, use la opción de transporte en el valor del parámetro TransportOption de Register-PSSessionConfiguration.

Por ejemplo:

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

Para cambiar el tiempo de espera de inactividad predeterminado y el tiempo máximo de espera de inactividad de una configuración de sesión, use los parámetros IdleTimeoutSec y MaxIdleTimeoutSec del New-PSTransportOption cmdlet. A continuación, use la opción de transporte en el valor del parámetro TransportOption de Set-PSSessionConfiguration.

Por ejemplo:

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

Modo de almacenamiento en búfer de salida

El modo de almacenamiento en búfer de salida de una PSSession determina cómo se administra la salida del comando cuando el búfer de salida de PSSession está lleno.

En una sesión desconectada, el modo de almacenamiento en búfer de salida determina eficazmente si el comando continúa ejecutándose mientras la sesión está desconectada.

Los valores válidos de la manera siguiente:

  • Block (valor predeterminado): cuando el búfer de salida está lleno, la ejecución se suspende hasta que el búfer está claro. Block conserva los datos, pero podría interrumpir el comando.
  • Drop - Cuando el búfer de salida está lleno, la ejecución continúa. A medida que se genera una nueva salida, se descarta la salida más antigua. Al usar el Drop valor, redirija la salida a un archivo. Este valor se recomienda para las sesiones desconectadas.

La propiedad OutputBufferingMode de la configuración de sesión determina el modo de almacenamiento en búfer predeterminado de las sesiones que usan la configuración de sesión.

Para buscar el valor de una configuración de sesión de OutputBufferingMode, puede usar cualquiera de los siguientes formatos de comando:

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

Puede invalidar el valor predeterminado en la configuración de sesión y establecer el modo de almacenamiento en búfer de salida de una PSSession al crear una PSSession, cuando se desconecta y cuando se vuelve a conectar.

Si es miembro del grupo de Administración istrators en el equipo remoto, puede crear y cambiar el modo de almacenamiento en búfer de salida de las configuraciones de sesión.

Para crear una PSSession con un modo de almacenamiento en búfer de salida de , cree una variable de Droppreferencia en la que el valor de la propiedad OutputBufferingMode sea Drop.$PSSessionOption

Al crear PSSessions, los valores de $PSSessionOption la variable tienen prioridad sobre los valores de la configuración de sesión.

Por ejemplo:

$PSSessionOption = New-PSSessionOption -OutputBufferingMode Drop

Use el parámetro OutputBufferingMode del New-PSSessionOption cmdlet para crear una opción de sesión con un valor de Drop. A continuación, use el objeto PSSessionOption como valor del parámetro SessionOption de los New-PSSession cmdlets o Invoke-Command .

Los valores establecidos al crear la sesión tienen prioridad sobre los valores establecidos en la $PSSessionOption variable de preferencia y la configuración de la sesión.

Por ejemplo:

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

Para cambiar el modo de almacenamiento en búfer de salida de una PSSession cuando se desconecte, use el parámetro OutputBufferingMode del Disconnect-PSSession cmdlet .

Por ejemplo:

Disconnect-PSSession -OutputBufferingMode Drop

Para cambiar el modo de almacenamiento en búfer de salida de una PSSession al volver a conectarse, use el parámetro OutputBufferingMode del New-PSSessionOption cmdlet . A continuación, use la opción session en el valor del parámetro SessionOption de Connect-PSSession o Receive-PSSession.

Por ejemplo:

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

Para crear una configuración de sesión con un modo de almacenamiento en búfer de salida predeterminado de Drop, use el parámetro OutputBufferingMode del New-PSTransportOption cmdlet para crear un objeto de opción de transporte con un valor de Drop. A continuación, use la opción de transporte en el valor del parámetro TransportOption de Register-PSSessionConfiguration.

Por ejemplo:

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

Para cambiar el modo de almacenamiento en búfer de salida predeterminado de una configuración de sesión, use el parámetro OutputBufferingMode del New-PSTransportOption cmdlet para crear una opción de transporte con un valor de Drop. A continuación, use la opción Transporte en el valor del parámetro SessionOption de Set-PSSessionConfiguration.

Por ejemplo:

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

Desconectar sesiones de bucle invertido

Las sesiones de bucle invertido o las sesiones locales son PSSessions que se originan y finalizan en el mismo equipo. Al igual que otras PSSessions, las sesiones de bucle invertido activo se mantienen en el equipo en el extremo remoto de la conexión (el equipo local), por lo que puede desconectar y volver a conectarse a sesiones de bucle invertido.

De forma predeterminada, las sesiones de bucle invertido se crean con un token de seguridad de red que no permite que los comandos se ejecuten en la sesión para acceder a otros equipos. Puede volver a conectarse a sesiones de bucle invertido que tengan un token de seguridad de red desde cualquier sesión del equipo local o de un equipo remoto.

Sin embargo, si usa el parámetro EnableNetworkAccess del New-PSSessioncmdlet , Enter-PSSessiono Invoke-Command , la sesión de bucle invertido se crea con un token de seguridad interactivo. El token interactivo habilita los comandos que se ejecutan en la sesión de bucle invertido para obtener datos de otros equipos.

Puede desconectar las sesiones de bucle invertido con tokens interactivos y volver a conectarse a ellas desde la misma sesión o una sesión diferente en el mismo equipo. Sin embargo, para evitar el acceso malintencionado, puede volver a conectarse a sesiones de bucle invertido con tokens interactivos solo desde el equipo en el que se crearon.

Esperando trabajos en sesiones desconectadas

El Wait-Job cmdlet espera hasta que se completa un trabajo y, a continuación, vuelve al símbolo del sistema o al comando siguiente. De forma predeterminada, Wait-Job devuelve si la sesión en la que se ejecuta un trabajo está desconectada. Para dirigir el Wait-Job cmdlet a esperar hasta que se vuelva a conectar la sesión, en el estado Abierto , use el parámetro Force . Para obtener más información, vea Wait-Job.

Sesiones sólidas y desconexión involuntaria

Una PSSession puede desconectarse involuntariamente debido a un error del equipo o una interrupción de la red. PowerShell intenta recuperar la PSSession, pero su éxito depende de la gravedad y la duración de la causa.

El estado de psSession desconectado involuntariamente podría ser Roto o Cerrado, pero también podría desconectarse. Si el valor de State está Desconectado, puede usar las mismas técnicas para administrar la PSSession que lo haría si la sesión se desconectase intencionadamente. Por ejemplo, puede usar el Connect-PSSession cmdlet para volver a conectarse a la sesión y el Receive-PSSession cmdlet para obtener los resultados de los comandos que se ejecutaron mientras se desconectaba la sesión.

Si cierra (sale) la sesión en la que se creó una PSSession mientras se ejecutan comandos en PSSession, PowerShell mantiene la PSSession en el estado Desconectado en el equipo remoto. Si cierra (sale) la sesión en la que se creó una PSSession, pero no se ejecuta ningún comando en PSSession, PowerShell no intenta mantener la PSSession.

Consulte también