远程工作时,可以在一台计算机(称为“本地计算机”)的 PowerShell 中键入命令,但命令在另一台计算机(称为“远程计算机”)上运行。 远程工作体验起来就像直接在远程计算机上工作一样。
注意
若要使用 PowerShell 远程处理,必须配置远程计算机以进行远程处理。 有关详细信息,请参阅 about_Remote_Requirements。
两台计算机是否都必须安装 PowerShell?
是的。 若要远程工作,本地计算机和远程计算机必须具有 PowerShell、Microsoft .NET Framework 和 Web Services for Management (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 远程处理,或者计算机不符合 Windows 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
的 Session 参数在会话中运行命令。
例如,以下命令以远程方式运行 Get-Process
命令。
Invoke-Command -ComputerName Server01, Server02 -ScriptBlock {Get-Process}
# - OR -
Invoke-Command -Session $s -ScriptBlock {Get-Process}
若要中断远程命令,请键入 CTRL+C。 中断请求将传递到远程计算机,也就是终止远程命令的位置。
有关远程命令的详细信息,请参阅 about_Remote 和支持远程处理的 cmdlet 的帮助主题。
是否可以只通过 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_PSSession。
是否可以一次在多台计算机上运行命令?
是的。 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 时,你会发送和接收“实时”.NET Framework 对象;“实时”对象是与实际程序或系统组件关联的对象。 调用方法或更改实时对象的属性时,这些更改会影响实际程序或组件。 当程序或组件的属性发生更改时,表示它们的对象的属性也会更改。
但是,由于大多数实时对象无法通过网络传输,因此 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+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 Services for Management (WS-Management) 协议和支持 WS-Management 的 Microsoft 实现的 WinRM 服务。 当本地计算机连接到远程计算机时,WS-Management 会建立连接并使用 PowerShell 插件在远程计算机上启动 PowerShell 主机进程 (Wsmprovhost.exe)。 用户可以指定备用端口、备用会话配置和其他功能来自定义远程连接。
为了支持“扇入”配置,PowerShell 使用 Internet Information Services (IIS) 来托管 WS-Management、加载 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:LocalAccountTokenFilterPolicy(在
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
中)可以使用以下 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 远程处理。