about_PSSession_Details
简短说明
提供有关 PowerShell 会话及其在远程命令中所发挥的作用的详细信息。
长说明
会话是运行 PowerShell 的环境。 每当你启动 PowerShell 时,系统都会为你创建一个会话。 你可以在你的计算机或另一台计算机上创建名为“PowerShell 会话”或“PSSession”的其他会话。
与 PowerShell 为你创建的会话不同,你可以控制和管理自己创建的 PSSession。
PSSession 在远程计算中发挥着重要作用。 当你创建连接到远程计算机的 PSSession 时,PowerShell 会建立与远程计算机的持续性连接以支持 PSSession。 可以使用 PSSession 运行一系列可共享数据的命令、函数和脚本。
本主题提供有关 PowerShell 中的会话和 PSSession 的详细信息。 有关可以使用会话执行的任务的基本信息,请参阅 about_PSSessions。
关于会话
从技术上讲,会话是 PowerShell 运行时所在的执行环境。 每个会话包括 System.Management.Automation 引擎的实例,以及运行 PowerShell 的主机程序。 主机可以是熟悉的 PowerShell 控制台或其他运行命令的程序,例如 Cmd.exe,或构建用于托管 PowerShell 的程序,例如 Windows PowerShell 集成脚本环境 (ISE)。 从 Windows 的角度来看,会话是目标计算机上的 Windows 进程。
每个会话都独立配置。 它包括自己的属性、自己的执行策略和自己的配置文件。 即使更改计算机上的环境,在创建会话时所存在的环境仍会在其生存期内保留。 所有会话都是在全局范围内创建的即使至是在脚本中创建的会话。
一次只能在会话中运行一个命令(或命令管道)。 第二个命令同步运行(一次运行一个),等待最多四分钟才能完成第一个命令。 第二个命令以异步方式(并发)运行失败。
PSSession 简介
每次启动 PowerShell 时都会创建会话。 PowerShell 创建临时会话以运行单个命令。 但是,还可以创建控制和管理的会话(称为“PowerShell 会话”或“PSSessions”)。
PSSession 对于远程命令至关重要。 如果使用 Invoke-Command
或 Enter-PSSession
cmdlet 的 ComputerName 参数,PowerShell 会建立一个临时会话来运行命令,并在命令或交互式会话完成后立即关闭会话。
但是,如果使用 New-PSSession
cmdlet 创建 PSSession,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 参数。 它们使用 PowerShell 远程处理以外的技术远程收集数据。 这些 cmdlet 没有会话参数,但可以使用 Invoke-Command
cmdlet 在 PSSession 中运行这些命令。
如何创建 PSSession?
若要创建 PSSession,请使用 New-PSSession
cmdlet。 可以使用 New-PSSession
在本地或远程计算机上创建 PSSession。
是否可以在任何计算机上创建 PSSession?
若要创建连接到远程计算机的 PSSession,必须将计算机配置为在 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 开始,Windows 计算机上的 PSSession 与在其中创建的会话无关。 在连接的远程或“服务器端”计算机上维护活动的 PSSession。
在 Windows 计算机上,可以使用 Disconnect-PSSession
cmdlet 与 PSSession 断开连接。 PSSession 与本地会话断开连接,但保留在远程计算机上。
命令将继续在断开连接的 PSSession 中运行。 可以关闭 PowerShell 并关闭原始计算机,而不会中断 PSSession。
然后,即使几个小时后,也可以使用 Get-PSSession
cmdlet 使 PSSession 和 Connect-PSSession
cmdlet 从不同 Windows 计算机上的新会话连接到 PSSession。
有关详细信息,请参阅 about_Remote_Disconnected_Sessions。
如果计算机停止,我的 PSSession 会发生什么情况?
断开连接的 PSSession 独立于在其中创建的会话。 如果断开 PSSession,然后关闭原始计算机,则 PSSession 将保留在远程计算机上。
此外,PowerShell 还会尝试恢复意外断开连接的活动 PSSession,例如计算机重新启动、临时停电或网络中断。 PowerShell 尝试维护或恢复 PSSession 到已打开状态(如果原始会话仍然可用),或者如果它不可用,则为断开连接状态。
“活动”PSSession 是运行命令的 PSSession。 如果连接会话关闭时 PSSession 已连接(未断开连接),并且命令在 PSSession 中运行,则 PowerShell 会尝试在远程计算机上维护 PSSession。 但是,如果未在 PSSession 中运行任何命令,则当连接的会话关闭时,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 参数,则 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。 如果命令在一个会话中工作,但不在另一个会话中工作,可能是因为会话受到限制。