о_удаленно_разъединенных_сеансах

Краткое описание

Описание отключения и повторного подключения к сеансу PowerShell (PSSession).

Длинное описание

Начиная с PowerShell 3.0, вы можете отключиться от PSSession и повторно подключиться к PSSession с одного компьютера или другого компьютера. Состояние сеанса сохраняется и команды в PSSession продолжают выполняться во время отключения сеанса.

Функция отключенных сеансов позволяет закрыть сеанс, в котором была создана psSession и завершить работу компьютера без нарушения команд, выполняемых в удаленной среде PSSession. Отключенные сеансы полезны для выполнения команд, которые занимают длительное время.

Вы не можете отключиться от интерактивного сеанса, запущенного с помощью командлета Enter-PSSession.

Вы можете использовать отключенные сеансы для управления psSessions, которые были отключены непреднамеренно в результате сбоя компьютера или сети.

Командлеты сеанса, отключенные

Следующие командлеты поддерживают функцию отключенных сеансов:

  • Connect-PSSession: Подключается к отключенной PSSession.
  • Disconnect-PSSession: отключает сессию PSSession.
  • Get-PSSession: получает доступ к PSSessions на локальном компьютере или на удаленных компьютерах.
  • Receive-PSSession. Возвращает результаты команд, которые выполнялись в отключенных сеансах.
  • Invoke-Command: параметр InDisconnectedSession создает PSSession и немедленно отключает его.

Как работает функция отключенных сеансов

Начиная с PowerShell 3.0, PSSessions не зависят от сеансов, в которых они созданы. Активные сеансы PSSessions поддерживаются на удаленном компьютере или на стороне сервера подключения, даже если на стороне клиента компьютер завершает работу или отключается от сети.

В PowerShell 2.0 служба PSSession удаляется с удаленного компьютера при отключении от исходного сеанса или сеанса, в котором он был создан.

При отключении PSSession PSSession остается активным и сохраняется на удаленном компьютере. Состояние сеанса изменяется с выполняется на отключено. Вы можете повторно подключиться к отключенной PSSession:

  • Текущий сеанс на том же компьютере
  • Другой сеанс на одном компьютере
  • Из сеанса на другом компьютере

Удаленный компьютер, поддерживающий сеанс, должен быть запущен и подключен к сети.

Команды в отключенном PSSession продолжают выполняться непрерывно на удаленном компьютере, пока команда не завершится или не заполнится выходной буфер. Чтобы предотвратить приостановку команды из-за переполнения выходного буфера, используйте параметр OutputBufferingMode в командлетах Disconnect-PSSession, New-PSSessionOptionили New-PSTransportOption.

Отключенные сеансы сохраняются в отключенном состоянии на удаленном компьютере. Они доступны для повторного подключения, пока не удалите PSSession, например с помощью командлета Remove-PSSession или до истечения времени ожидания простоя PSSession. Вы можете настроить время ожидания бездействия PSSession с помощью параметров IdleTimeoutSec или IdleTimeout, командлетов Disconnect-PSSession, New-PSSessionOptionили New-PSTransportOption.

Другой пользователь может подключиться к PSSessions, которые вы создали, но только в том случае, если он может предоставить учетные данные, использованные для создания сеанса, или использовать учетные данные конфигурации сеанса RunAs.

Получение PSSessions

Начиная с PowerShell 3.0 командлет Get-PSSession получает PSSessions на локальном компьютере и удаленных компьютерах. Также можно получить сеансы PS, созданные в текущем сеансе.

Чтобы получить PSSessions на локальном компьютере или удаленных компьютерах, используйте параметры ComputerName или ConnectionUri. Без параметров Get-PSSession получает PSSession, созданные в локальном сеансе независимо от того, где они завершаются.

В следующем примере показано, как использовать Get-PSSession.

New-PSSession создает сеанс на компьютере Server01. Сеанс находится на компьютере Server01.

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

Чтобы получить сеанс из Server01, используйте параметр ComputerName, чтобы указать целевой объект Get-PSSession.

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

Если значение параметра ComputerNameGet-PSSession равно localhost, Get-PSSession получает PSSessions, которые завершаются на локальном компьютере и поддерживаются на нем. Он не получает PSSessions на компьютере Server01, даже если они были запущены на локальном компьютере.

Get-PSSession -ComputerName localhost

Чтобы получить сеансы, созданные в текущем сеансе, используйте командлет Get-PSSession без параметров. В этом примере Get-PSSession получает psSession, созданную в текущем сеансе, и подключается к компьютеру Server01.

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

Отключение сеансов

Используйте командлет Disconnect-PSSession для отключения сеанса. Чтобы определить PSSession, используйте параметр сеанса или перенаправьте объект PSSession из командлетов New-PSSession или Get-PSSession в Disconnect-PSSession.

Следующая команда отключает PSSession с компьютера Server01. Обратите внимание, что значение свойства состояния равно отключенным, а доступности — None.

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

Чтобы создать отключенный сеанс, используйте параметр InDisconnectedSession командлета Invoke-Command. Он создает сеанс, запускает команду и отключается немедленно, прежде чем команда сможет вернуть любые выходные данные.

Следующая команда выполняет команду Get-WinEvent в отключенном сеансе на удаленном компьютере Server02.

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

Подключение к отключенным сеансам

Чтобы подключить отключенный сеанс, используйте командлет Connect-PSSession с параметрами ComputerName или ConnectionUri. Кроме того, можно передать выходные данные Get-PSSession в Connect-PSSession.

В следующем примере показывается, как получать сеансы на компьютере Server02. Выходные данные включают два отключенных сеанса.

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

Следующая команда подключается к Session2. PsSession теперь открыт и доступен.

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

Получение результатов

Чтобы получить результаты команд, которые выполнялись в отключенной среде PSSession, используйте командлет Receive-PSSession.

Можно использовать Receive-PSSession вместо использования командлета Connect-PSSession. Если сеанс уже подключен, Receive-PSSession получает результаты команд, которые выполнялись при отключении сеанса. Если PSSession по-прежнему отключен, Receive-PSSession подключается к нему, а затем получает результаты команд, выполняющихся во время отключения.

Receive-PSSession может возвращать результаты задания (асинхронно) или в хост-программу (синхронно). Используйте параметр OutTarget, чтобы выбрать задание или узел. Значение по умолчанию — узла. Однако если полученная команда была запущена в текущем сеансе в качестве задания, она возвращается в качестве задания по умолчанию.

В следующем примере используется командлет Receive-PSSession для повторного подключения к сеансу на Server02 и получения результатов команды Get-WinEvent. Параметр outTarget используется для получения результатов в задания.

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

Чтобы получить результаты задания, используйте командлет 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

Свойства состояния и доступности

Свойства состояния и доступности отключенной PSSession сообщают, доступен ли сеанс для повторного подключения к нему.

При подключении PSSession к текущему сеансу его состояние — открыто, а его доступность — доступно. При отключении от PSSession, состояние PSSession становится отсоединено, а её доступность — нет.

Значение свойства состояния является относительным для текущего сеанса. Значение "Disconnected" означает, что PSSession не подключен к текущему сеансу. Но это не означает, что PSSession отключен от всех сеансов. Он может быть подключен к другому сеансу.

Чтобы определить, можно ли подключить или повторно подключиться к PSSession, используйте свойство availability. Значение None указывает, что вы можете подключиться к сеансу. Значение Занято указывает, что вы не можете подключиться к PSSession, так как он подключен к другому сеансу.

Следующий пример выполняется в двух сеансах PowerShell на одном компьютере. Обратите внимание на изменения значений свойств состояния и доступности в каждом сеансе по мере отключения и повторного подключения PSSession.

# 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

Отключенные сеансы сохраняются на удаленном компьютере, пока вы их не удалите, например, с помощью командлета Remove-PSSession, или пока не истечет время бездействия. Свойство IdleTimeout сеанса PSSession определяет, сколько времени сохраняется отключенный сеанс перед удалением.

Значения времени ожидания простоя

PSSessions неактивны, когда поток пульса не получает ответа. Отключение сеанса делает его неактивным и запускает таймер IdleTimeout, даже если команды все еще выполняются в отключенном сеансе. PowerShell считает, что отключенные сеансы будут активными, но неактивными.

При создании и отключении сеансов убедитесь, что время ожидания простоя в PSSession достаточно долго, чтобы поддерживать сеанс для ваших потребностей, но не так долго, чтобы он потреблял ненужные ресурсы на удаленном компьютере.

Свойство IdleTimeoutMs конфигурации сеанса определяет значение простоя сеансов по умолчанию, использующих данную конфигурацию. Можно переопределить значение по умолчанию, но это значение не может превышать свойство MaxIdleTimeoutMs конфигурации сеанса.

Используйте следующую команду, чтобы получить значения IdleTimeoutMs и MaxIdleTimeoutMs для конфигурации сеанса.

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

Если вы являетесь членом группы администраторов на удаленном компьютере, эти значения можно задать при создании конфигурации сеанса. Кроме того, можно изменить значения при отключении.

Значение времени ожидания простоя конфигураций сеансов и параметров сеанса находится в миллисекундах. Значение времени ожидания простоя сеансов и параметров конфигурации сеансов составляет в секундах.

Можно задать таймаут простоя PSSession (New-PSSession, Invoke-Command) при его создании и при отключении от него (Disconnect-PSSession). Однако вы не можете изменить значение IdleTimeout ни при подключении к PSSession (Connect-PSSession), ни при получении результатов (Receive-PSSession).

Командлеты Connect-PSSession и Receive-PSSession имеют параметр SessionOption, который принимает объект PSSessionOption, например один, возвращенный командлетом New-PSSessionOption.

Значение IdleTimeout в объекте SessionOption и значение IdleTimeout в переменной $PSSessionOption не изменяют значение IdleTimeout в команде Connect-PSSession или Receive-PSSession.

Чтобы создать PSSession с определенным значением времени ожидания простоя, создайте переменную предпочтения $PSSessionOption. Задайте для свойства IdleTimeout значение требуемого значения (в миллисекундах).

При создании PSSessions значения в переменной $PSSessionOption имеют приоритет над значениями в конфигурации сеанса.

Например, следующая команда задает время ожидания простоя в 48 часов:

$PSSessionOption = New-PSSessionOption -IdleTimeoutMSec 172800000

Чтобы создать PSSession с определенным значением времени ожидания простоя, используйте параметр IdleTimeoutMSec командлета New-PSSessionOption. Затем используйте опцию сеанса в значении параметра SessionOption командлетов New-PSSession или Invoke-Command.

Значения, заданные при создании сеанса, имеют приоритет над значениями, заданными в переменной предпочтения $PSSessionOption и конфигурации сеанса.

Например:

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

Чтобы изменить время ожидания простоя PSSession при отключении, используйте параметр IdleTimeoutSec командлета Disconnect-PSSession.

Например:

Disconnect-PSSession -IdleTimeoutSec 172800

Чтобы создать конфигурацию сеанса с определенным временем ожидания простоя и максимальным временем ожидания простоя, используйте параметры IdleTimeoutSec и MaxIdleTimeoutSec командлета New-PSTransportOption. Затем используйте параметр транспорта в значении параметра TransportOptionRegister-PSSessionConfiguration.

Например:

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

Чтобы изменить время ожидания простоя по умолчанию и максимальное время ожидания простоя конфигурации сеанса, используйте параметры IdleTimeoutSec и MaxIdleTimeoutSec командлета New-PSTransportOption. Затем используйте параметр транспорта в значении параметра TransportOptionSet-PSSessionConfiguration.

Например:

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

Режим буферизации выходных данных

Режим буферизации выходных данных PSSession определяет способ управления выходными данными команд при заполнении выходного буфера PSSession.

В отключенном сеансе режим буферизации выходных данных фактически определяет, продолжает ли команда выполняться во время отключения сеанса.

Допустимые значения, как показано ниже.

  • Block (по умолчанию) — если выходной буфер заполнен, выполнение приостанавливается до очистки буфера. Block сохраняет данные, но может прервать команду.
  • Drop. Если выходной буфер заполнен, выполнение продолжается. По мере создания новых выходных данных старые выходные данные удаляются. При использовании значения Drop перенаправьте выходные данные в файл. Это значение рекомендуется для отключенных сеансов.

Свойство OutputBufferingMode конфигурации сеанса определяет режим буферизации по умолчанию для сеансов, использующих данную конфигурацию.

Чтобы найти значение конфигурации сеанса OutputBufferingMode, можно использовать любой из следующих форматов команд:

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

Можно переопределить значение по умолчанию в конфигурации сеанса и задать выходной режим буферизации PSSession при создании PSSession, при отключении и повторном подключении.

Если вы являетесь членом группы администраторов на удаленном компьютере, можно создать и изменить режим буферизации выходных данных конфигураций сеансов.

Чтобы создать PSSession с режимом буферизации выходных данных Drop, создайте переменную предпочтения $PSSessionOption, в которой значение свойства OutputBufferingModeDrop.

При создании PSSessions значения в переменной $PSSessionOption имеют приоритет над значениями в конфигурации сеанса.

Например:

$PSSessionOption = New-PSSessionOption -OutputBufferingMode Drop

Используйте параметр OutputBufferingMode командлета New-PSSessionOption, чтобы создать опцию сеанса со значением Drop. Затем используйте объект PSSessionOption как значение для параметра SessionOption в командлетах New-PSSession или Invoke-Command.

Значения, заданные при создании сеанса, имеют приоритет над значениями, заданными в переменной предпочтения $PSSessionOption и конфигурации сеанса.

Например:

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

Чтобы изменить режим буферизации выходных данных PSSession при отключении, используйте параметр OutputBufferingMode командлета Disconnect-PSSession.

Например:

Disconnect-PSSession -OutputBufferingMode Drop

Чтобы изменить режим буферизации выходных данных при повторном подключении, используйте параметр OutputBufferingMode командлета New-PSSessionOption. Затем используйте опцию сеанса в значении параметра SessionOption для Connect-PSSession или Receive-PSSession.

Например:

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

Чтобы создать конфигурацию сеанса с режимом буферизации выходных данных по умолчанию Drop, используйте параметр OutputBufferingMode командлета New-PSTransportOption, чтобы создать объект параметра транспорта со значением Drop. Затем используйте параметр транспорта в значении параметра TransportOptionRegister-PSSessionConfiguration.

Например:

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

Чтобы изменить режим буферизации выходных данных по умолчанию для конфигурации сеанса, используйте параметр OutputBufferingMode командлета New-PSTransportOption, чтобы создать опцию транспорта со значением Drop. Затем используйте опцию "Транспорт" в значении параметра SessionOption для Set-PSSessionConfiguration.

Например:

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

Отключение сеансов обратного цикла

Сеансы обратного цикла или локальные сеансы — это PSSessions, которые создаются и завершаются на одном компьютере. Как и другие сеансы PSSessions, активные сеансы обратного цикла сохраняются на компьютере на удаленном конце подключения (локальном компьютере), поэтому вы можете отключиться от сеансов обратного цикла и повторно подключиться к ней.

По умолчанию сеансы обратного цикла создаются с маркером безопасности сети, который не позволяет выполнять команды в сеансе для доступа к другим компьютерам. Вы можете повторно подключиться к сеансам обратного цикла с маркером безопасности сети из любого сеанса на локальном компьютере или удаленном компьютере.

Однако если вы используете параметр EnableNetworkAccess командлета New-PSSession, Enter-PSSessionили Invoke-Command, сеанс обратного цикла создается с помощью интерактивного маркера безопасности. Интерактивный маркер позволяет командам, выполняемым в сеансе обратного цикла, получать данные с других компьютеров.

Сеансы обратного цикла можно отключить с помощью интерактивных маркеров, а затем повторно подключиться к ним из одного сеанса или другого сеанса на одном компьютере. Однако, чтобы запретить вредоносный доступ, можно повторно подключиться к сеансам обратного цикла с интерактивными маркерами только с компьютера, на котором они были созданы.

Ожидание заданий в отключенных сеансах

Командлет Wait-Job ожидает завершения задания, а затем возвращается в командную строку или следующую команду. По умолчанию Wait-Job возвращается, если сеанс, в котором выполняется задание, отключен. Чтобы направить командлет Wait-Job, чтобы дождаться повторного подключения сеанса, в состоянии открытого используйте параметр Force. Дополнительные сведения см. в разделе Wait-Job.

Надежные сеансы и непреднамеренное отключение

PsSession может быть непреднамеренно отключен из-за сбоя компьютера или сбоя сети. PowerShell пытается восстановить PSSession, но его успех зависит от серьезности и длительности причины.

Состояние непреднамеренно отключенной службы PSSession может быть Сбой или Закрыто, но оно также может быть Отключено. Если значение состояния отключено, можно использовать те же методы для управления PSSession, как если бы сеанс был отключен намеренно. Например, можно использовать командлет Connect-PSSession для повторного подключения к сеансу и командлета Receive-PSSession, чтобы получить результаты команд, запущенных во время отключения сеанса.

При закрытии сеанса, в котором была создана PSSession во время выполнения команд в PSSession, PowerShell поддерживает PSSession в состоянии Отключенное на удалённом компьютере. При закрытии (выходе) сеанса, в котором был создан PSSession, но в PSSession не выполняется никаких команд, PowerShell не пытается сохранить PSSession.

См. также