Búsqueda de sitios web

sobre sesiones remotas desconectadas


Breve descripción

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

Descripción larga

A partir de PowerShell 3.0, puede desconectarse de una PSSession y volver a conectarse a la PSSession desde la misma computadora o desde una computadora diferente. El estado de la sesión se mantiene y los comandos de PSSession continúan ejecutándose mientras la sesión está desconectada.

La función Sesiones desconectadas le permite cerrar la sesión en la que se creó una PSSession y apagar la computadora sin interrumpir los comandos que se ejecutan en la PSSession remota. Las sesiones desconectadas son útiles para ejecutar comandos que tardan mucho en completarse.

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

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

Cmdlets de sesión desconectada

Los siguientes cmdlets admiten la característica Sesiones desconectadas:

  • Connect-PSSession: se conecta a una PSSession desconectada.
  • Disconnect-PSSession: Desconecta una PSSession.
  • Get-PSSession: Obtiene PSSessions en la computadora local o en computadoras remotas.
  • 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.

Cómo funciona la función Sesiones desconectadas

A partir de PowerShell 3.0, las PSSessions son independientes de las sesiones en las que se crean. Las PSSessions activas se mantienen en la computadora remota o en el lado del servidor de la conexión, incluso si la computadora del lado del cliente está apagada o desconectada de la red.

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

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

  • La sesión actual en la misma computadora.
  • Una sesión diferente en el mismo ordenador
  • Desde una sesión en una computadora diferente

El ordenador remoto que mantiene la sesión debe estar funcionando y conectado a la red.

Los comandos en una PSSession desconectada continúan ejecutándose ininterrumpidamente en la computadora remota hasta que se completa el comando o se llena el búfer de salida. Para evitar que un búfer de salida lleno suspenda un comando, utilice el parámetro OutputBufferingMode de Disconnect-PSSession, New-PSSessionOption o . Nuevos cmdlets PSTransportOption.

Las sesiones desconectadas se mantienen en el estado desconectado en la computadora remota. Están disponibles para que pueda volver a conectarse hasta que elimine la PSSession, por ejemplo, mediante el cmdlet Remove-PSSession, o hasta que expire el tiempo de inactividad de la PSSession. Puede ajustar el tiempo de inactividad de una PSSession utilizando los parámetros IdleTimeoutSec o IdleTimeout de Disconnect-PSSession, New-PSSessionOption cmdlets o New-PSTransportOption.

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

Cómo obtener PSSessions

A partir de PowerShell 3.0, el cmdlet Get-PSSession obtiene PSSessions en la computadora local y en las computadoras remotas. También puede obtener PSSessions que se crearon en la sesión actual.

Para obtener PSSessions en la computadora local o en computadoras remotas, use los parámetros ComputerName o ConnectionUri. Sin parámetros, Get-PSSession obtiene las PSSession que se crearon en la sesión local, independientemente de dónde terminen.

El siguiente ejemplo muestra cómo utilizar Get-PSSession.

New-PSSession crea una sesión en la computadora Server01. La sesión reside en la computadora Server01.

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

Para obtener la sesión del Servidor01, utilice 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 y se mantienen en la computadora local. . No obtiene PSSessions en la computadora Server01, incluso si se iniciaron en la computadora local.

Get-PSSession -ComputerName localhost

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

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

Cómo desconectar sesiones

Utilice el cmdlet Disconnect-PSSession para desconectar una sesión. Para identificar la PSSession, utilice el parámetro Session o canalice un objeto PSSession desde los cmdlets New-PSSession o Get-PSSession a . Desconectar-PSSession.

El siguiente comando desconecta la PSSession de la computadora Server01. Observe que el valor de la propiedad Estado es Desconectado y la Disponibilidad es Ninguna.

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, utilice el parámetro InDisconnectedSession del cmdlet Invoke-Command. Crea una sesión, inicia el comando y se desconecta inmediatamente, antes de que el comando pueda devolver algún resultado.

El siguiente comando ejecuta un comando Get-WinEvent en una sesión desconectada en la computadora remota Server02.

Invoke-Command -ComputerName Server02 -InDisconnectedSession -ScriptBlock {
   Get-WinEvent -LogName "*PowerShell*" }
Id Name      ComputerName  State         ConfigurationName     Availability
-- ----      ------------  -----         -----------------     ------------
 4 Session3  Server02      Disconnected  Microsoft.PowerShell          None

Cómo conectarse a sesiones desconectadas

Para conectar una sesión desconectada, utilice el cmdlet Connect-PSSession con los parámetros ComputerName o ConnectionUri. Alternativamente, puede canalizar la salida de Get-PSSession a Connect-PSSession.

El siguiente ejemplo obtiene las sesiones en la computadora Server02. El resultado 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 siguiente comando se conecta a la Sesión2. La PSSession ya está abierta 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, utilice el cmdlet Receive-PSSession.

Puede utilizar Receive-PSSession en lugar de utilizar el cmdlet Connect-PSSession. Si la sesión ya se volvió a conectar, Receive-PSSession obtiene los resultados de los comandos que se ejecutaron cuando se desconectó la sesión. Si la PSSession aún está desconectada, Receive-PSSession se conecta a ella y luego obtiene los resultados de los comandos que se ejecutaron mientras estaba desconectada.

Receive-PSSession puede devolver los resultados en un trabajo (asincrónicamente) o al programa host (sincrónicamente). Utilice 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 un Trabajo, se devuelve como un Trabajo de forma predeterminada.

El siguiente ejemplo utiliza el cmdlet Receive-PSSession para volver a conectarse a la sesión en Server02 y obtener los resultados del comando Get-WinEvent. El parámetro OutTarget se utiliza 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, utilice el 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

Propiedades de estado y disponibilidad

Las propiedades Estado y Disponibilidad de una PSSession desconectada le indican si la sesión está disponible para que pueda 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 de PSSession es Desconectado y su disponibilidad es Ninguna.

El valor de la propiedad Estado es relativo a la sesión actual. Un valor de Desconectado significa que la PSSession no está conectada a la sesión actual. Pero eso no significa que PSSession esté desconectado de todas las sesiones. Es posible que esté conectado a una sesión diferente.

Para determinar si puede conectarse o volver a conectarse a la PSSession, utilice la propiedad Disponibilidad. Un valor de Ninguno indica que puede conectarse a la sesión. Un valor de Ocupado indica que no puede conectarse a la PSSession porque está conectada a otra sesión.

El siguiente ejemplo se ejecuta en dos sesiones de PowerShell en la misma computadora. Tenga en cuenta los valores cambiantes de las propiedades Estado y Disponibilidad en cada sesión a medida que la PSSession se desconecta y se vuelve a conectar.

# 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 la computadora remota hasta que las elimina, por ejemplo, usando el cmdlet Remove-PSSession, o hasta que se agote el tiempo de espera. La propiedad IdleTimeout de una PSSession determina cuánto tiempo se mantiene una sesión desconectada antes de que se elimine.

Valores de tiempo de inactividad

Las PSSessions están inactivas cuando el hilo de latido no recibe respuesta. Desconectar una sesión la deja inactiva e inicia el reloj IdleTimeout, incluso si los comandos todavía se están ejecutando en la sesión desconectada. PowerShell considera que las sesiones desconectadas están activas, pero inactivas.

Al crear y desconectar sesiones, verifique que el tiempo de espera de inactividad en PSSession sea lo suficientemente largo para mantener la sesión según sus necesidades, pero no tanto como para consumir recursos innecesarios en la computadora remota.

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

Utilice 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 de administradores en la computadora remota, puede establecer estos valores cuando crea una configuración de sesión. Además, puedes cambiar los valores cuando te desconectas.

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

Puede configurar el tiempo de espera de inactividad de una PSSession cuando crea la PSSession (New-PSSession, Invoke-Command) y cuando se desconecta de ella (Disconnect-PSSession ). Sin embargo, no puede cambiar el valor IdleTimeout cuando se conecta a PSSession (Connect-PSSession) u obtiene resultados (Receive-PSSession) .

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

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

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

Cuando crea PSSessions, los valores de la variable $PSSessionOption tienen prioridad sobre los valores en la configuración de la sesión.

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

$PSSessionOption = New-PSSessionOption -IdleTimeoutMSec 172800000

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

Los valores establecidos al crear la sesión tienen prioridad sobre los valores establecidos en la variable de preferencia $PSSessionOption 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 al desconectarse, utilice el parámetro IdleTimeoutSec del cmdlet Disconnect-PSSession.

Por ejemplo:

Disconnect-PSSession -IdleTimeoutSec 172800

Para crear una configuración de sesión con un tiempo de espera de inactividad particular y un tiempo de espera de inactividad máximo, utilice los parámetros IdleTimeoutSec y MaxIdleTimeoutSec del cmdlet New-PSTransportOption. Luego, 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 de espera de inactividad máximo de una configuración de sesión, utilice los parámetros IdleTimeoutSec y MaxIdleTimeoutSec del cmdlet New-PSTransportOption. Luego, 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 la PSSession está lleno.

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

Los valores válidos son los siguientes:

  • Bloque (predeterminado): cuando el búfer de salida está lleno, la ejecución se suspende hasta que se borre el búfer. Bloque conserva los datos, pero puede 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, la salida más antigua se descarta. Cuando utilice el valor Drop, redirija la salida a un archivo. Este valor se recomienda para sesiones desconectadas.

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

Para encontrar el valor de configuración de sesión de OutputBufferingMode, puede utilizar cualquiera de los siguientes formatos de comando:

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

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

Si es miembro del grupo de administradores en la computadora remota, 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 Drop, cree una variable de preferencia $PSSessionOption en la que el valor de la propiedad OutputBufferingMode sea Soltar.

Cuando crea PSSessions, los valores de la variable $PSSessionOption tienen prioridad sobre los valores en la configuración de la sesión.

Por ejemplo:

$PSSessionOption = New-PSSessionOption -OutputBufferingMode Drop

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

Los valores establecidos al crear la sesión tienen prioridad sobre los valores establecidos en la variable de preferencia $PSSessionOption 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 al desconectarse, use el parámetro OutputBufferingMode del cmdlet Disconnect-PSSession.

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 cmdlet New-PSSessionOption. Luego, use la opción de sesión 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 cmdlet New-PSTransportOption para crear una opción de transporte. objeto con un valor de Drop. Luego, 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 cmdlet New-PSTransportOption para crear una opción de transporte con un valor de Drop. Luego, 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 loopback

Las sesiones de loopback, o sesiones locales, son PSSessions que se originan y terminan en la misma computadora. Al igual que otras PSSessions, las sesiones de bucle invertido activas se mantienen en la computadora en el extremo remoto de la conexión (la computadora local), por lo que puede desconectarse y volver a conectarse a las 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 ejecutados en la sesión accedan a otras computadoras. Puede volver a conectarse a sesiones de loopback que tengan un token de seguridad de red desde cualquier sesión en la computadora local o en una computadora remota.

Sin embargo, si utiliza el parámetro EnableNetworkAccess de New-PSSession, Enter-PSSession o Invoke-Command cmdlet, la sesión de bucle invertido se crea con un token de seguridad interactivo. El token interactivo permite que los comandos que se ejecutan en la sesión de bucle invertido obtengan datos de otras computadoras.

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

Esperando trabajos en sesiones desconectadas

El cmdlet Wait-Job espera hasta que se completa un trabajo y luego regresa al símbolo del sistema o al siguiente comando. De forma predeterminada, Wait-Job regresa si la sesión en la que se ejecuta un trabajo está desconectada. Para indicar al cmdlet Wait-Job que espere hasta que se vuelva a conectar la sesión, en el estado Abierto, utilice el parámetro Force. Para obtener más información, consulte Trabajo en espera.

Sesiones robustas y desconexión involuntaria

Una PSSession podría desconectarse involuntariamente debido a una falla en la computadora 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 una PSSession desconectada involuntariamente puede ser Roto o Cerrado, pero también puede ser Desconectado. Si el valor de Estado es Desconectado, puede utilizar las mismas técnicas para administrar la PSSession que usaría si la sesión se desconectara intencionalmente. Por ejemplo, puede usar el cmdlet Connect-PSSession para volver a conectarse a la sesión y el cmdlet Receive-PSSession para obtener resultados de los comandos que se ejecutaron mientras la sesión estaba desconectada.

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

Ver también

  • acerca de_trabajos
  • acerca de_Remoto
  • about_Remote_Variables
  • about_PSSessions
  • about_Session_Configurations
  • Invoke-Command
  • Conectar-PSSession
  • Desconectar-PSSession
  • Obtener-PSSession
  • Recibir-PSSession

Artículos relacionados