远程工作时,可以在一台计算机(称为“本地计算机”)的 PowerShell 中键入命令,但命令在另一台计算机上运行(称为“远程计算机”)。 远程工作的经验应该与尽可能直接在远程计算机上工作一样。
注释
若要使用 PowerShell 远程处理,必须将远程计算机配置为远程处理。 有关详细信息,请参阅 about_Remote_Requirements。
这两台计算机必须安装 PowerShell 吗?
是的。 若要远程工作,本地计算机和远程计算机必须具有 PowerShell、Microsoft .NET Framework 和用于管理的 Web 服务(WS-Management)协议。 执行特定命令所需的任何文件和其他资源都必须在远程计算机上。
运行 Windows PowerShell 3.0 的计算机和运行 Windows PowerShell 2.0 的计算机可以远程连接到对方并运行远程命令。 但是,某些功能(如能够断开与会话的连接并重新连接到会话)仅在两台计算机都运行 Windows PowerShell 3.0 时才起作用。
必须具有连接到远程计算机的权限、运行 PowerShell 的权限以及访问数据存储(如文件和文件夹)的权限,以及远程计算机上的注册表的权限。
有关详细信息,请参阅 about_Remote_Requirements。
远程处理的工作原理是什么?
提交远程命令时,该命令通过网络传输到远程计算机上的 PowerShell 引擎,并在远程计算机上的 PowerShell 客户端中运行。 命令结果将发送回本地计算机,并显示在本地计算机上的 PowerShell 会话中。
若要传输命令并接收输出,PowerShell 使用 WS-Management 协议。 有关 WS-Management 协议的信息,请参阅 Windows 文档中 WS-Management 协议。
从 Windows PowerShell 3.0 开始,远程会话存储在远程计算机上。 这样,便可以断开会话的连接,并从其他会话或其他计算机重新连接,而不会中断命令或丢失状态。
PowerShell 远程处理是否安全?
连接到远程计算机时,系统在本地计算机上使用用户名和密码凭据,或使用命令中提供的凭据登录到远程计算机。 凭据和传输的其余部分已加密。
若要添加额外的保护,可以将远程计算机配置为使用安全套接字层(SSL),而不是 HTTP 来侦听 Windows 远程管理(WinRM)请求。
然后,用户可以在建立连接时使用 Invoke-Command
、New-PSSession
和 Enter-PSSession
cmdlet 的 UseSSL 参数。 此选项使用更安全的 HTTPS 通道而不是 HTTP。
所有远程命令是否需要 PowerShell 远程处理?
不是。 某些 cmdlet 具有 ComputerName 参数,可用于从远程计算机获取对象。
这些 cmdlet 不使用 PowerShell 远程处理。 因此,可以在运行 PowerShell 的任何计算机上使用它们,即使计算机未针对 PowerShell 远程处理进行配置,或者计算机不符合 PowerShell 远程处理的要求。
这些 cmdlet 包括:
Get-HotFix
Rename-Computer
Restart-Computer
Stop-Computer
若要查找具有 ComputerName 参数的所有 cmdlet,请键入:
Get-Help * -Parameter ComputerName
# or
Get-Command -ParameterName ComputerName
若要确定特定 cmdlet 的 ComputerName 参数是否需要 PowerShell 远程处理,请参阅参数说明。 若要显示参数说明,请键入:
Get-Help <cmdlet-name> -Parameter ComputerName
例如:
Get-Help Get-HotFix -Parameter ComputerName
对于所有其他命令,请使用 Invoke-Command
cmdlet。
如何在远程计算机上运行命令?
若要在远程计算机上运行命令,请使用 Invoke-Command
cmdlet。
将命令括在大括号({}
)中,使其成为脚本块。 使用 Invoke-Command
ScriptBlock 参数指定命令。
可以使用 Invoke-Command
的 ComputerName 参数指定远程计算机。 或者,可以创建与远程计算机(会话)的持久连接,然后使用 Invoke-Command
会话 参数在会话中运行命令。
例如,以下命令远程运行 Get-Process
命令。
Invoke-Command -ComputerName Server01, Server02 -ScriptBlock {Get-Process}
# - OR -
Invoke-Command -Session $s -ScriptBlock {Get-Process}
若要中断远程命令,请键入 CTRL+C。 中断请求将传递到远程计算机,在该计算机终止远程命令。
有关远程命令的详细信息,请参阅支持远程处理的 cmdlet 的about_Remote和帮助主题。
我能否将 telnet 连接到远程计算机?
可以使用 Enter-PSSession
cmdlet 启动与远程计算机的交互式会话。
在 PowerShell 提示符下,键入:
Enter-PSSession <ComputerName>
命令提示符将更改,以显示已连接到远程计算机。
<ComputerName>\C:>
现在,键入的命令在远程计算机上运行,就像直接在远程计算机上键入它们一样。
若要结束交互式会话,请键入:
Exit-PSSession
交互式会话是使用 WS-Management 协议的持久性会话。 它与使用 Telnet 不同,但它提供了类似的体验。
有关详细信息,请参阅 Enter-PSSession
。
是否可以创建持久连接?
是的。 可以通过指定远程计算机的名称、其 NetBIOS 名称或其 IP 地址来运行远程命令。 或者,可以通过指定连接到远程计算机的 PowerShell 会话(PSSession)来运行远程命令。
使用 Invoke-Command
或 Enter-PSSession
的 ComputerName 参数时,PowerShell 将建立临时连接。 PowerShell 使用连接仅运行当前命令,然后关闭连接。 这是一种非常高效的方法来运行单个命令或多个不相关的命令,即使在许多远程计算机上也是如此。
使用 New-PSSession
cmdlet 创建 PSSession 时,PowerShell 将为 PSSession 建立持久连接。 然后,可以在 PSSession 中运行多个命令,包括共享数据的命令。
通常,创建 PSSession 以运行共享数据的一系列相关命令。 否则,ComputerName 参数创建的临时连接足以用于大多数命令。
有关会话的详细信息,请参阅 about_PSSessions。
是否可以一次在多台计算机上运行命令?
是的。
Invoke-Command
cmdlet 的 ComputerName 参数接受多个计算机名称,Session 参数接受多个 PSSession。
运行 Invoke-Command
命令时,PowerShell 会在所有指定计算机或所有指定的 PSSessions 上运行命令。
PowerShell 可以管理数百个并发远程连接。 但是,可以发送的远程命令数可能受计算机资源及其建立和维护多个网络连接的能力的限制。
有关详细信息,请参阅 Invoke-Command
帮助主题中的示例。
我的配置文件在哪里?
PowerShell 配置文件不会在远程会话中自动运行,因此配置文件添加的命令不在会话中。 此外,$PROFILE
自动变量不会在远程会话中填充。
若要在会话中运行配置文件,请使用 Invoke-Command
cmdlet。
例如,以下命令从 $s
会话中的本地计算机运行 CurrentUserCurrentHost 配置文件。
Invoke-Command -Session $s -FilePath $PROFILE
以下命令从 $s
会话中的远程计算机运行 CurrentUserCurrentHost 配置文件。 由于未填充 $PROFILE
变量,因此该命令使用配置文件的显式路径。
Invoke-Command -Session $s {
. "$HOME\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1"
}
运行此命令后,配置文件添加到会话的命令可在 $s
中使用。
还可以在会话配置中使用启动脚本,在使用会话配置的每个远程会话中运行配置文件。
有关 PowerShell 配置文件的详细信息,请参阅 About_Profiles。 有关会话配置的详细信息,请参阅 Register-PSSessionConfiguration
。
限制如何在远程命令上工作?
为了帮助管理本地计算机上的资源,PowerShell 包含一项按命令限制功能,用于限制为每个命令建立的并发远程连接数。
默认值为 32 个并发连接,但可以使用 cmdlet 的 ThrottleLimit 参数为特定命令设置自定义限制。
使用限制功能时,请记住,它应用于每个命令,而不是应用于整个会话或计算机。 如果在多个会话或 PSSession 中并发运行命令,则并发连接数是所有会话中并发连接的总和。
若要查找具有 ThrottleLimit 参数的 cmdlet,请键入:
Get-Help * -Parameter ThrottleLimit
-or-
Get-Command -ParameterName ThrottleLimit
远程命令的输出是否不同于本地输出?
在本地使用 PowerShell 时,发送和接收“live”.NET Framework 对象;“live”对象是与实际程序或系统组件关联的对象。 调用方法或更改实时对象的属性时,这些更改会影响实际程序或组件。 并且,当程序或组件的属性发生更改时,表示它们的对象的属性也会更改。
但是,由于大多数实时对象无法通过网络传输,因此 PowerShell 会“序列化”远程命令中发送的大多数对象,也就是说,它将每个对象转换为一系列 XML(XML [CLiXML] 中的约束语言)数据元素进行传输。
当 PowerShell 收到序列化对象时,它将 XML 转换为反序列化的对象类型。 反序列化对象是之前程序或组件属性的准确记录,但它不再“实时”,也就是说,它不再与组件直接关联。 并且,由于方法不再有效,因此会删除这些方法。
通常,可以使用反序列化的对象,就像使用实时对象一样,但必须注意它们的限制。 此外,Invoke-Command
cmdlet 返回的对象具有其他属性,可帮助你确定命令的源。
某些对象类型(如 DirectoryInfo 对象和 GUID)在收到对象时会重新转换为实时对象。 这些对象不需要任何特殊的处理或格式设置。
有关解释和格式化远程输出的信息,请参阅 about_Remote_Output。
是否可以远程运行后台作业?
是的。 PowerShell 后台作业是一个 PowerShell 命令,可在不与会话交互的情况下异步运行。 启动后台作业时,命令提示符会立即返回,即使作业长时间运行,也可以继续在会话中工作。
即使其他命令正在运行,也可以启动后台作业,因为后台作业始终在临时会话中异步运行。
可以在本地或远程计算机上运行后台作业。 默认情况下,后台作业在本地计算机上运行。 但是,可以使用 Invoke-Command
cmdlet 的 AsJob 参数将任何远程命令作为后台作业运行。 此外,可以使用 Invoke-Command
远程运行 Start-Job
命令。
有关 PowerShell 中的后台作业的详细信息,请参阅 about_Jobs 和 about_Remote_Jobs。
是否可以在远程计算机上运行 Windows 程序?
可以使用 PowerShell 远程命令在远程计算机上运行基于 Windows 的程序。
例如,可以在远程计算机上运行 Shutdown.exe
或 Ipconfig.exe
。
但是,不能使用 PowerShell 命令为远程计算机上的任何程序打开用户界面。
在远程计算机上启动 Windows 程序时,该命令未完成,PowerShell 命令提示符不会返回,直到程序完成或按 ctrl CTRL+C 中断命令。 例如,如果在远程计算机上运行 Ipconfig.exe
程序,则在完成 Ipconfig.exe
之前,命令提示符不会返回。
如果使用远程命令启动具有用户界面的程序,则程序进程将启动,但用户界面不会显示。 PowerShell 命令未完成,在停止程序进程或按 CTRL +C之前,命令提示符不会返回,这会中断命令并停止进程。
例如,如果使用 PowerShell 命令在远程计算机上运行 Notepad
,记事本进程将在远程计算机上启动,但记事本用户界面不会显示。 若要中断命令并还原命令提示符,请按 ctrl +C。
是否可以限制用户可以在计算机上远程运行的命令?
是的。 每个远程会话都必须在远程计算机上使用其中一个会话配置。 可以管理计算机上的会话配置(以及这些会话配置的权限),以确定谁可以远程在计算机上运行命令,以及哪些命令可以运行。
会话配置配置会话的环境。 可以使用实现新配置类的程序集或使用在会话中运行的脚本来定义配置。 配置可以确定会话中可用的命令。 此外,配置可以包括保护计算机的设置,例如限制会话可以在单个对象或命令中远程接收的数据量的设置。 还可以指定一个安全描述符,用于确定使用配置所需的权限。
Enable-PSRemoting
cmdlet 在计算机上创建默认会话配置:Microsoft.PowerShell、Microsoft.PowerShell.Workflow 和 Microsoft.PowerShell32(仅限 64 位作系统)。
Enable-PSRemoting
设置配置的安全描述符,以仅允许计算机上的 Administrators 组成员使用它们。
可以使用会话配置 cmdlet 编辑默认会话配置、创建新会话配置,以及更改所有会话配置的安全描述符。
从 Windows PowerShell 3.0 开始,New-PSSessionConfigurationFile
cmdlet 允许使用文本文件创建自定义会话配置。 该文件包括用于设置语言模式和指定使用会话配置的会话中可用的 cmdlet 和模块的选项。
当用户使用 Invoke-Command
、New-PSSession
或 Enter-PSSession
cmdlet 时,他们可以使用 ConfigurationName 参数来指示用于会话的会话配置。 并且,他们可以通过更改会话中 $PSSessionConfigurationName
首选项变量的值来更改其会话使用的默认配置。
有关会话配置的详细信息,请参阅会话配置 cmdlet 的帮助。 若要查找会话配置 cmdlet,请键入:
Get-Command *PSSessionConfiguration
什么是扇入和扇出配置?
涉及多台计算机的最常见 PowerShell 远程处理方案是一对多配置,其中一台本地计算机(管理员的计算机)在众多远程计算机上运行 PowerShell 命令。 这称为“扇出”方案。
但是,在某些企业中,配置是多对一的,其中许多客户端计算机连接到运行 PowerShell 的单个远程计算机,例如文件服务器或展台。 这称为“扇入”配置。
PowerShell 远程处理支持扇出和扇入配置。
对于扇出配置,PowerShell 使用 Web 服务进行管理(WS-Management)协议和支持 WS-Management Microsoft实现的 WinRM 服务。 当本地计算机连接到远程计算机时,WS-Management 建立连接并使用 PowerShell 插件在远程计算机上启动 PowerShell 主机进程(Wsmprovhost.exe)。 用户可以指定备用端口、备用会话配置和其他功能来自定义远程连接。
为了支持“扇入”配置,PowerShell 使用 Internet Information Services (IIS)来托管 WS 管理、加载 PowerShell 插件以及启动 PowerShell。 在此方案中,所有 PowerShell 会话都在同一主机进程中运行,而不是在单独的进程中启动每个 PowerShell 会话。
Windows XP 或 Windows Server 2003 不支持 IIS 托管和扇入远程管理。
在扇入配置中,用户可以指定连接 URI 和 HTTP 终结点,包括传输、计算机名称、端口和应用程序名称。 IIS 会将具有指定应用程序名称的所有请求转发到应用程序。 默认值为 WS-Management,可以托管 PowerShell。
还可以指定身份验证机制,禁止或允许从 HTTP 和 HTTPS 终结点重定向。
是否可以在不在域中的单个计算机上测试远程处理?
是的。 即使本地计算机不在域中,PowerShell 远程处理也可用。 可以使用远程处理功能连接到会话并在同一台计算机上创建会话。 这些功能与连接到远程计算机时的工作方式相同。
若要在工作组中的计算机上运行远程命令,请更改计算机上的以下 Windows 设置。
警告:这些设置会影响系统上的所有用户,并且它们会使系统更容易受到恶意攻击。 进行这些更改时请小心。
Windows Vista、Windows 7、Windows 8:
创建以下注册表项,然后将其值设置为 1:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
中的 LocalAccountTokenFilterPolicy可以使用以下 PowerShell 命令添加此条目:
$parameters = @{ Path='HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System' Name='LocalAccountTokenFilterPolicy' propertyType='DWord' Value=1 } New-ItemProperty @parameters
Windows Server 2003、Windows Server 2008、Windows Server 2012、Windows Server 2012 R2:
无需更改,因为“网络访问:本地帐户共享和安全模型”策略的默认设置为“经典”。 验证设置是否发生了更改。
是否可以在另一个域中的计算机上运行远程命令?
是的。 通常,命令运行时不会出错,尽管可能需要使用 Invoke-Command
、New-PSSession
或 Enter-PSSession
cmdlet 的 Credential 参数来提供远程计算机上的 Administrators 组成员的凭据。 即使当前用户是本地和远程计算机上的 Administrators 组的成员,也有时也是必需的。
但是,如果远程计算机不在本地计算机信任的域中,则远程计算机可能无法对用户的凭据进行身份验证。
若要启用身份验证,请使用以下命令将远程计算机添加到 WinRM 中本地计算机的受信任主机列表中。 在 PowerShell 提示符下键入命令。
Set-Item WSMan:\localhost\Client\TrustedHosts -Value <Remote-computer-name>
例如,若要将 Server01 计算机添加到本地计算机上的受信任主机列表中,请在 PowerShell 提示符处键入以下命令:
Set-Item WSMan:\localhost\Client\TrustedHosts -Value Server01
PowerShell 是否支持通过 SSH 进行远程处理?
是的。 有关详细信息,请参阅通过 SSH 进行 PowerShell 远程处理。