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.Bloqueconserva 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 valorDrop, 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