关于远程 FAQ

简短说明

包含有关在 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) 请求。 然后,用户可以在建立连接时使用 、 New-PSSessionEnter-PSSession cmdlet 的 UseSSL 参数Invoke-Command。 此选项使用更安全的 HTTPS 通道,而不是 HTTP。

是否所有远程命令都需要 PowerShell 远程处理?

错误。 多个 cmdlet 具有 ComputerName 参数,可用于从远程计算机获取对象。

这些 cmdlet 不使用 PowerShell 远程处理。 因此,可以在运行 PowerShell 的任何计算机上使用它们,即使计算机未配置 PowerShell 远程处理,或者计算机不符合 PowerShell 远程处理的要求。

这些 cmdlet 包括以下内容:

  • Get-Process
  • Get-Service
  • Get-WinEvent
  • Get-EventLog
  • Test-Connection

若要查找具有 ComputerName 参数的所有 cmdlet,请键入:

Get-Help * -Parameter ComputerName
# or
Get-Command -ParameterName ComputerName

若要确定特定 cmdlet 的 ComputerName 参数是否需要 PowerShell 远程处理,请参阅参数说明。 若要显示参数说明,请键入:

Get-Help <cmdlet-name> -Parameter ComputerName

例如:

Get-Help Get-Process -Parameter ComputerName

对于所有其他命令,请使用 Invoke-Command cmdlet。

如何实现远程计算机上运行命令?

若要在远程计算机上运行命令,请使用 Invoke-Command cmdlet。

将命令括在大括号 ({}) ,使其成为脚本块。 使用 的 ScriptBlock 参数 Invoke-Command 指定命令。

可以使用 的 ComputerName 参数 Invoke-Command 指定远程计算机。 或者,可以 (会话) 创建与远程计算机的持久连接,然后使用 的 Invoke-CommandSession 参数在会话中运行命令。

例如,以下命令远程运行 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) 来运行远程命令。

使用 或 Enter-PSSessionInvoke-CommandComputerName 参数时,PowerShell 会建立临时连接。 PowerShell 使用该连接仅运行当前命令,然后关闭连接。 这是一种非常有效的方法,可用于运行单个命令或多个不相关的命令,即使在许多远程计算机上也是如此。

使用 New-PSSession cmdlet 创建 PSSession 时,PowerShell 会为 PSSession 建立持久连接。 然后,可以在 PSSession 中运行多个命令,包括共享数据的命令。

通常,创建 PSSession 以运行一系列共享数据的相关命令。 否则, ComputerName 参数创建的临时连接对于大多数命令就足够了。

有关会话的详细信息,请参阅 about_PSSessions。

是否可以一次在多台计算机上运行命令?

是的。 cmdlet 的 Invoke-CommandComputerName 参数接受多个计算机名称,会话参数接受多个 PSSession。

运行 Invoke-Command 命令时,PowerShell 在所有指定的计算机上或所有指定的 PSSession 中运行命令。

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 [CLiXML] ) 数据元素中用于传输的一系列 XML (约束语言。

当 PowerShell 收到序列化对象时,它将 XML 转换为反序列化的对象类型。 反序列化对象是以前程序或组件属性的准确记录,但它不再是“活动”的,也就是说,它不再与组件直接关联。 并且,删除了方法,因为它们不再有效。

通常,可以使用反序列化的对象,就像使用实时对象一样,但必须注意其限制。 此外,cmdlet 返回 Invoke-Command 的对象具有有助于确定命令来源的其他属性。

某些对象类型(如 DirectoryInfo 对象和 GUID)在收到时会转换回实时对象。 这些对象不需要任何特殊处理或格式设置。

有关解释远程输出和设置远程输出格式的信息,请参阅 about_Remote_Output

是否可以远程运行后台作业?

是的。 PowerShell 后台作业是异步运行的 PowerShell 命令,无需与会话交互。 启动后台作业时,命令提示符会立即返回,即使作业长时间运行,也可以继续在会话中工作。

即使其他命令正在运行,也可以启动后台作业,因为后台作业始终在临时会话中异步运行。

可以在本地或远程计算机上运行后台作业。 默认情况下,后台作业在本地计算机上运行。 但是,可以使用 cmdlet 的 Invoke-CommandAsJob 参数将任何远程命令作为后台作业运行。 并且,可以使用 Invoke-Command 远程运行 Start-Job 命令。

有关 PowerShell 中的后台作业的详细信息,请参阅 [about_Jobs (about_Jobs.md) ] 和 [about_Remote_Jobs (about_Remote_Jobs.md) ]。

是否可以在远程计算机上运行 Windows 程序?

可以使用 PowerShell 远程命令在远程计算机上运行基于 Windows 的程序。 例如,可以在远程计算机上运行 Shutdown.exeIpconfig.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-PSSessionConfigurationFilecmdlet 允许使用文本文件创建自定义会话配置。 文件包含用于设置语言模式以及指定在使用会话配置的会话中可用的 cmdlet 和模块的选项。

当用户使用 Invoke-CommandNew-PSSessionEnter-PSSession cmdlet 时,他们可以使用 ConfigurationName 参数来指示用于会话的会话配置。 而且,他们可以通过更改会话中首选项变量的值 $PSSessionConfigurationName 来更改会话使用的默认配置。

有关会话配置的详细信息,请参阅会话配置 cmdlet 的帮助。 若要查找会话配置 cmdlet,请键入:

Get-Command *PSSessionConfiguration

什么是扇入和扇出配置?

涉及多台计算机的最常见 PowerShell 远程处理方案是一对多配置,其中一台本地计算机 (管理员的计算机) 在众多远程计算机上运行 PowerShell 命令。 这称为“扇出”方案。

但是,在某些企业中,配置是多对一的,其中许多客户端计算机连接到运行 PowerShell 的单个远程计算机,例如文件服务器或展台。 这称为“扇入”配置。

PowerShell 远程处理支持扇出和扇入配置。

对于扇出配置,PowerShell 使用 Web Services for Management (WS-Management) 协议和支持 Microsoft 实现 WS-Management 的 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:

    Create以下注册表项,然后将其值设置为 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:

    无需更改,因为“网络访问:本地帐户的共享和安全模型”策略的默认设置为“经典”。 验证设置,以防更改。

是否可以在另一个域中的计算机上运行远程命令?

是的。 通常,命令运行不会出错,不过你可能需要使用 、 New-PSSessionEnter-PSSession cmdlet 的 Invoke-CommandCredential 参数来提供远程计算机上 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 远程处理

请参阅

about_Remote

about_Profiles

about_PSSessions

about_Remote_Jobs

about_Remote_Variables

Invoke-Command

New-PSSession