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-PSSession
cmdlets , New-PSSessionOption
o 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-PSSession
cmdlets , New-PSSessionOption
o 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 elDrop
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 Drop
preferencia 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-PSSession
cmdlet , Enter-PSSession
o 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.