Поделиться через


Сведения об удаленных отключенных сеансах

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

В этой статье объясняется, как отключить сеанс PowerShell (PSSession) и повторно подключиться к ней.

Подробное описание

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

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

Функция "Отключенные сеансы" позволяет закрыть сеанс, в котором был создан сеанс PSSession, и даже закрыть PowerShell и завершить работу компьютера, не нарушая выполнение команд в PSSession. Отключенные сеансы полезны для выполнения команд, выполнение которых занимает длительное время, и обеспечивает гибкость времени и устройств, необходимых ИТ-специалистам.

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

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

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

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

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

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

Принцип работы функции "Отключенные сеансы"

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

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

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

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

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

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

Как получить PSSessions

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

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

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

Например, если вы создаете psSession на компьютере Server01, получите сеанс с компьютера Server01. Если вы создаете сеанс PSSession с другого компьютера на локальный компьютер, получите сеанс с локального компьютера.

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

Первая команда создает сеанс для компьютера Server01. Сеанс находится на компьютере Server01.

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

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

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

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

Get-PSSession -ComputerName localhost

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

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

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

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

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

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

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

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

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

Чтобы подключить отключенный psSession, используйте Connect-PSSession командлет . Используйте параметры ComputerName или ConnectionUri для идентификации PSSession или конвейера PSSession из 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 командлет .

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

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

Следующая команда использует Receive-PSSession командлет для подключения к PSSession на компьютере Server02 и получения результатов команды, запущенной Get-WinEvent в сеансе Session3. Команда использует параметр 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 имеет значение Отключено , а его доступность — Нет.

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

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

Следующий пример выполняется в двух сеансах PowerShell на одном компьютере. Обратите внимание на изменение значений свойств State и Availability в каждом сеансе, так как 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
# Idle Timeout

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

$PSSessionOption = New-PSSessionOption -IdleTimeoutMSec 172800000

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

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

Пример:

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

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

Пример:

Disconnect-PSSession -IdleTimeoutSec 172800

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

Пример:

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

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

Пример:

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

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

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

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

Допустимые значения:

  • Заблокировать. при заполнении выходного буфера выполнение команды приостанавливается до тех пор, пока буфер не будет очищен. Значение по умолчанию.
  • Удалить. при заполнении выходного буфера выполнение команды продолжается. При создании новых выходных данных самые старые выходные данные удаляются.

Блокировать сохраняет данные, но может прервать выполнение команды. Значение Drop позволяет завершить выполнение команды, несмотря на возможную потерю данных. При использовании значения Drop выходные данные команды необходимо перенаправить в какой-либо файл на диске. Это значение рекомендуется для отключенных сеансов.

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

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

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

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

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

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

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

Пример:

$PSSessionOption = New-PSSessionOption -OutputBufferingMode Drop

Чтобы создать PSSession с режимом буферизации выходных данных Drop, используйте параметр OutputBufferingMode командлета New-PSSessionOption , чтобы создать параметр сеанса со значением Drop. Затем используйте параметр сеанса в значении параметра New-PSSessionSessionOption командлетов или Invoke-Command .

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

Пример:

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

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

Пример:

Disconnect-PSSession -OutputBufferingMode Drop

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

Пример:

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

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

Пример:

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

Чтобы изменить режим буферизации выходных данных по умолчанию для конфигурации сеанса, используйте параметр OutputBufferingMode командлета New-PSTransportOption , чтобы создать параметр транспорта со значением Drop. Затем используйте параметр Transport в значении параметра 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.

См. также раздел

about_Jobs

about_Remote

about_Remote_Variables

about_PSSessions

about_Session_Configurations

Connect-PSSession

Disconnect-PSSession

Get-PSSession

Receive-PSSession

Invoke-Command