about_PSSession_Details
简短说明
提供有关 Windows PowerShell 会话及其在远程命令中所发挥的作用的详细信息。
长说明
会话是运行 Windows PowerShell 的环境。 每当你启动 Windows PowerShell 时,系统都会为你创建一个会话。 你可以在你的计算机或另一台计算机上创建名为“Windows PowerShell 会话”或“PSSession”的其他会话。
与 Windows PowerShell 为你创建的会话不同,你可以控制和管理自己创建的 PSSession。
PSSession 在远程计算中发挥着重要作用。 当你创建连接到远程计算机的 PSSession 时,Windows PowerShell 会建立与远程计算机的持续性连接以支持 PSSession。 可以使用 PSSession 运行一系列可共享数据的命令、函数和脚本。
本主题提供有关 Windows PowerShell 中的会话和 PSSession 的详细信息。 有关可以使用会话执行的任务的基本信息,请参阅 about_PSSessions。
关于会话
从技术上讲,会话是 Windows PowerShell 运行时所在的执行环境。 每个会话都包含一个 System.Management.Automation 引擎的实例和一个运行 Windows PowerShell 的主机程序。 主机可以是熟悉的 Windows PowerShell 控制台或其他运行命令的程序(例如 Cmd.exe),也可以是为托管 Windows PowerShell 而构建的程序,例如 Windows PowerShell 集成脚本环境 (ISE)。 从 Windows 的角度来看,会话是目标计算机上的 Windows 进程。
每个会话都独立配置。 它包括自己的属性、自己的执行策略和自己的配置文件。 即使更改计算机上的环境,在创建会话时所存在的环境仍会在其生存期内保留。 所有会话都是在全局范围内创建的即使至是在脚本中创建的会话。
一次只能在会话中运行一个命令(或命令管道)。 第二个命令同步运行(一次运行一个),等待最多四分钟才能完成第一个命令。 第二个命令以异步方式(并发)运行失败。
PSSession 简介
每次启动 Windows PowerShell 时都会创建一个会话。 Windows PowerShell 会创建临时会话以运行单个命令。 但是,你还可以创建你控制和管理的会话(称为“Windows PowerShell 会话”或“PSSession”)。
PSSession 对于远程命令至关重要。 如果使用 Invoke-Command
或 Enter-PSSession
cmdlet 的 ComputerName 参数,Windows PowerShell 会建立一个临时会话来运行命令,并在命令或交互式会话完成后立即关闭会话。
但是,如果你使用 New-PSSession
cmdlet 创建 PSSession,Windows PowerShell 会在远程计算机上建立持久会话,你可以在远程计算机上运行多个命令或交互式会话。 创建的 PSSession 保持打开状态,可供使用,直到删除它们或关闭创建它们的会话。
在远程计算机上创建 PSSession 时,系统会在远程计算机上创建 PowerShell 进程,并建立从本地计算机到远程计算机上的进程的连接。 在本地计算机上创建 PSSession 时,新进程和连接都在本地计算机上创建。
何时需要 PSSession?
Invoke-Command
和 Enter-PSSession
cmdlet 具有 ComputerName 和会话参数。 可以使用任一命令运行远程命令。
使用 ComputerName 参数在一个或多个计算机上运行单个命令或一系列不相关的命令。
若要运行共享数据的命令,需要与远程计算机建立持久连接。 在这种情况下,请创建 PSSession,然后使用会话参数在 PSSession 中运行命令。
从远程计算机(如 Get-Process
、Get-Service
、Get-EventLog
和 Get-WmiObject
)获取数据的其他许多 cmdlet 仅具有 ComputerName 参数。 它们使用 Windows PowerShell 远程处理以外的技术远程收集数据。 这些 cmdlet 没有会话参数,但可以使用 Invoke-Command
cmdlet 在 PSSession 中运行这些命令。
如何创建 PSSession?
若要创建 PSSession,请使用 New-PSSession
cmdlet。 可以使用 New-PSSession
在本地或远程计算机上创建 PSSession。
是否可以在任何计算机上创建 PSSession?
若要创建连接到远程计算机的 PSSession,必须将计算机配置为在 Windows PowerShell 中进行远程处理。 当前用户必须是远程计算机上的管理员组的成员,或者当前用户必须能够提供管理员组成员的凭据。 有关详细信息,请参阅 about_Remote_Requirements。
是否可以在其他会话中看到我的 PSSession?
从 Windows PowerShell 3.0 开始,Get-PSSession
cmdlet 的 ComputerName 参数获取在指定远程计算机上创建的 PSSessions。
活动 PSSession 在远程计算机上(连接的“服务器端”)维护,你可以从任何计算机上的任何会话获取它们。
例如,如果将 PSSession 从 Server01 计算机创建到 Server02 计算机,然后切换到 Server03 计算机,则可以使用如下所示的命令来获取会话。
Get-PSSession -ComputerName Server02
即使断开与会话的连接,会话也会保留在远程计算机上,直到将其删除或超时。
在 Windows PowerShell 2.0 中,只能获取在当前会话中创建的 PSSession。 无法获取在其他会话中创建的 PSSession。
有关详细信息,请参阅 Get-PSSession。
能否查看其他人在计算机上创建的 PSSession?
仅当提供创建 PSSession 的用户的凭据或 PSSession 使用的会话配置(包括 RunAs 凭据)时,才能获取和管理其他人创建的 PSSession 或会话配置。 否则,可以获取、连接、使用和管理仅创建的 PSSession。
是否可以从其他计算机连接到 PSSession?
从 Windows PowerShell 3.0 开始,PSSession 独立于创建时所在的会话。 在连接的远程或“服务器端”计算机上维护活动的 PSSession。
可以使用 Disconnect-PSSession
cmdlet 与 PSSession 断开连接。 PSSession 与本地会话断开连接,但保留在远程计算机上。
命令将继续在断开连接的 PSSession 中运行。 可以关闭 Windows PowerShell 并关闭原始计算机,而不会中断 PSSession。
因此,即使数小时后,也可以使用 Get-PSSession
cmdlet 获取 PSSession,并使用 Connect-PSSession
cmdlet 从另一台计算机上的新会话连接到 PSSession。
有关详细信息,请参阅 about_Remote_Disconnected_Sessions。
如果计算机停止,我的 PSSession 会发生什么情况?
断开连接的 PSSession 独立于在其中创建的会话。 如果断开 PSSession,然后关闭原始计算机,则 PSSession 将保留在远程计算机上。
此外,Windows PowerShell 还会尝试恢复意外断开连接(例如因计算机重启、临时停电或网络中断而断开连接)的活动 PSSession。 如果原始会话仍然可用,Windows PowerShell 会尝试将 PSSession 维持在或恢复到“打开”状态;如果原始会话不可用,则会将其维持在或恢复到“断开连接”状态。
“活动”PSSession 是运行命令的 PSSession。 如果连接会话关闭时 PSSession 处于连接状态(未断开连接),并且命令正在 PSSession 中运行,则 Windows PowerShell 会尝试在远程计算机上保留 PSSession。 但是,如果没有命令在 PSSession 中运行,则当连接的会话关闭时,Windows PowerShell 会关闭 PSSession。
有关详细信息,请参阅 about_Remote_Disconnected_Sessions。
是否可以在 PSSession 中运行后台作业?
是的。 后台作业是在后台异步运行的命令,无需与当前会话交互。 提交命令以启动作业时,该命令将返回作业对象,但该作业将继续在后台运行,直到作业完成。
若要在本地计算机上启动后台作业,请使用 Start-Job
命令。
可以在临时连接(通过使用 ComputerName 参数)或 PSSession(通过使用会话参数)中运行后台作业。
若要在远程计算机上启动后台作业,请使用 Invoke-Command
cmdlet 及其 AsJob 参数,或使用 Invoke-Command
cmdlet 在远程计算机上运行 Start-Job
命令。 使用 AsJob 参数时,可以使用 ComputerName 或会话参数。
使用 Invoke-Command
运行 Start-Job
命令时,必须在 PSSession 中运行该命令。 如果使用 ComputerName 参数,则 Windows PowerShell 会在作业对象返回时终止连接,作业会中断。
有关详细信息,请参阅 about_Jobs。
是否可以运行交互式会话?
是的。 若要启动与远程计算机的交互式会话,请使用 Enter-PSSession
cmdlet。 在交互式会话中,键入的命令在远程计算机上运行,就像直接在远程计算机上键入它们一样。
可以在临时会话(通过使用 ComputerName 参数)或 PSSession(通过使用会话参数)中运行交互式会话。 如果使用 PSSession,PSSession 会保留先前命令中的数据,PSSession 会保留交互式会话期间生成的任何数据,以便在后续命令中使用。
结束交互式会话时,PSSession 将保持打开状态,可供使用。
有关详细信息,请参阅 Enter-PSSession 和 Exit-PSSession。
是否必须删除 PSSessions?
是的。 PSSession 是一个进程,它是使用内存和其他资源的自包含环境,即使未使用它也是如此。 完成 PSSession 后,请将其删除。 如果创建多个 PSSession,请关闭不使用的 PSSession,并仅保留当前正在使用的 PSSession。
若要删除 PSSessions,请使用 Remove-PSSession
cmdlet。 它会删除 PSSession,并释放它们使用的所有资源。
还可以使用 New-PSSessionOption
的 IdleTimeOut 参数在指定的时间间隔后关闭空闲 PSSession。 有关详细信息,请参阅 New-PSSessionOption。
如果将 PSSession 对象保存在变量中,然后删除 PSSession 或使其超时,则该变量仍包含 PSSession 对象,但 PSSession 未处于活动状态,不能使用或修复。
所有会话是否和 PSSession 都一样?
不是。 开发人员可以创建自定义会话,这些会话仅包含选定的提供程序和 cmdlet。 如果命令在一个会话中工作,但不在另一个会话中工作,可能是因为会话受到限制。