当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] PowerShell 远程处理常见问题解答

作者:精品下载站 日期:2024-12-14 02:58:16 浏览:13 分类:玩电脑

PowerShell 远程处理常见问题解答


当您远程工作时,您在一台计算机(称为“本地计算机”)上的 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-管理协议的信息,请参阅 Windows 文档中的 WS-管理协议。

从 Windows PowerShell 3.0 开始,远程会话存储在远程计算机上。这使您能够从会话断开连接并从不同的会话或不同的计算机重新连接,而不会中断命令或丢失状态。

PowerShell 远程处理安全吗?

当您连接到远程计算机时,系统使用本地计算机上的用户名和密码凭据或您在命令中提供的凭据来登录远程计算机。凭证和其余传输内容均已加密。

要添加额外的保护,您可以将远程计算机配置为使用安全套接字层 (SSL) 而不是 HTTP 来侦听 Windows 远程管理 (WinRM) 请求。然后,用户可以使用 Invoke-CommandNew-PSSessionEnter-PSSessionUseSSL 参数建立连接时的 cmdlet。此选项使用更安全的 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-CommandScriptBlock 参数来指定命令。

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

    例如,以下命令远程运行 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-CommandEnter-PSSessionComputerName 参数时,PowerShell 会建立临时连接。 PowerShell 使用连接仅运行当前命令,然后关闭连接。这是运行单个命令或多个不相关命令的非常有效的方法,即使在许多远程计算机上也是如此。

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

    通常,您创建 PSSession 来运行一系列共享数据的相关命令。否则,由 ComputerName 参数创建的临时连接足以满足大多数命令的需要。

    有关会话的更多信息,请参阅 about_PSSessions。

    我可以同时在多台计算机上运行命令吗?

    是的。 Invoke-Command cmdlet 的 ComputerName 参数接受多个计算机名称,Session 参数接受多个 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(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.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 设置配置的安全描述符,仅允许计算机上管理员组的成员使用它们。

    您可以使用会话配置 cmdlet 编辑默认会话配置、创建新会话配置以及更改所有会话配置的安全描述符。

    从 Windows PowerShell 3.0 开始,New-PSSessionConfigurationFile cmdlet 允许您使用文本文件创建自定义会话配置。该文件包含用于设置语言模式以及指定在使用会话配置的会话中可用的 cmdlet 和模块的选项。

    当用户使用 Invoke-CommandNew-PSSessionEnter-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 信息服务 (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: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-CommandNew-PSSessionCredential 参数。Enter-PSSession cmdlet 以提供远程计算机上管理员组成员的凭据。即使当前用户是本地和远程计算机上管理员组的成员,有时也需要这样做。

    但是,如果远程计算机不在本地计算机信任的域中,则远程计算机可能无法验证用户的凭据。

    要启用身份验证,请使用以下命令将远程计算机添加到 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_个人资料

    about_PSSessions

    about_Remote_Jobs

    about_Remote_Variables

    Invoke-Command

    新 PS 会话

    您需要 登录账户 后才能发表评论

    取消回复欢迎 发表评论:

    关灯