主题
    about_Remote_FAQ

简短说明
    包括有关在 Windows PowerShell 中运行远程命令的问题和解答。


详细说明
   远程工作时,您会在一台计算机(称为"本地计算机")上的 Windows PowerShell 中键入命令,而在另一台计
   算机(称为"远程计算机")上运行这些命令。远程工作的体验应尽可能地接近于直接在远程计算机上工作的体验。

    注意:若要使用 Windows PowerShell 远程处理,必须为远程计算机配置远程处理。有关详细信息,请参阅 
    about_Remote_Requirements。
          

 两台计算机都必须安装 Windows PowerShell 吗?

   是的。若要进行远程工作,本地和远程计算机都必须安装 Windows PowerShell、Microsoft .NET Framework 2.0 
   以及 Web Services for Management (WS-Management) 协议。执行特定命令所需的所有文件和其他资源必须
   位于远程计算机上。

   您必须具有连接到远程计算机的权限和运行 Windows PowerShell 的权限,以及访问远程计算机上的数据存储
   (例如文件和文件夹)和注册表的权限。

   有关详细信息,请参阅 about_Remote_Requirements。


 远程处理如何工作?

   提交远程命令时,命令通过网络传输到远程计算机上的 Windows PowerShell 引擎,并在远程计算机上的 
   Windows PowerShell 客户端中运行。
   命令的结果将发送回本地计算机,并在本地计算机上的 Windows PowerShell 会话中显示。

   为了传输命令和接收输出,Windows PowerShell 需要使用 WS-Management 协议。有关 WS-Management 协
   议的信息,请参阅 MSDN (Microsoft Developer Network) Library 中的"WS-Management 
协议",网址为 https://go.microsoft.com/fwlink/?LinkId=144634。


 Windows PowerShell 远程处理安全吗?

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

    若要添加其他保护,可将远程计算机配置为使用安全套接字层 (SSL) 来侦听 Windows 远程管理 (WinRM) 请
    求,而不是使用 HTTP 来侦听。然后,用户在建立连接时可以使用 Invoke-Command、New-PSSession 和 
    Enter-PSSession cmdlet 的 UseSSL 参数。此选项使用更加安全的 HTTPS 通道而不是 HTTP。


 所有的远程命令都需要 Windows PowerShell 远程处理吗?

   不是。有几个 cmdlet 具有 ComputerName 参数,您可通过该参数从远程计算机获取对象。

   这些 cmdlet 不使用 Windows PowerShell 远程处理。因此,即使没有为计算机配置 Windows PowerShell 
   远程处理,或者计算机不符合 Windows PowerShell 远程处理的要求,您也可在任何运行 Windows 
   PowerShell 的计算机上使用这些 cmdlet。

   这些 cmdlet 包括以下 cmdlet:

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


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

        get-help * -parameter ComputerName

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

	get-help <cmdlet-name> -parameter ComputerName

   例如:

        get-help get-process -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}

        - 或 -

      invoke-command -session $s -scriptblock {get-process}

   若要中断远程命令,请按 Ctrl+C。中断请求将传递给远程计算机,在该计算机上终止远程命令。

   有关远程命令的详细信息,请参阅 about_Remote 以及有关支持远程处理的 cmdlet 的帮助主题。


 可以通过 Telnet 方式连接到远程计算机吗?

    可以使用 Enter-PSSession cmdlet 启动与远程计算机的交互式会话。

    在 Windows Powershell 提示符下,键入:

	Enter-PSSession <ComputerName>

    命令提示符会更改以表明已连接到远程计算机。

        <ComputerName>\C:>

    现在,键入的命令会在远程计算机上运行,就像直接在远程计算机上键入这些命令一样。

    若要终止交互式会话,请键入:

        Exit-PSSession

    交互式会话是使用 WS-Management 协议的持续会话。它与使用 Telnet 并不相同,但提供相似的体验。

    有关详细信息,请参阅 Enter-PSSession。


 可以创建持续性连接吗?

    可以。可以通过指定远程计算机的名称、其 NetBIOS 名称或 IP 地址来运行远程命令。也可通过指定连接到远程
    计算机的 Windows PowerShell 会话 (PSSession) 来运行远程命令。
    
    使用 Invoke-Command 或 Enter-PSSession 的 ComputerName 参数时,Windows PowerShell 会建立
    临时连接。Windows PowerShell 仅将使用该连接运行当前命令,随后将关闭该连接。这是
    运行单个命令或多个不相关命令的非常高效的方法,即使是在很多远程计算机上运行也是如此。

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

    通常情况下,您创建 PSSession 的目的是运行一系列共享数据的相关命令。而在其他情况下,ComputerName 
    参数创建的临时连接已经足以满足大多数命令的需求。

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


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

   可以。Invoke-Command cmdlet 的 ComputerName 参数接受多个计算机名称,Session 参数接受多个 
   PSSession。

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

   Windows PowerShell 可以管理成百上千个并发远程连接。但是,您可以发送的远程命令的数量可能会受到计算机
   资源及其建立和维持多个网络连接的能力的限制。

   有关详细信息,请参阅 Invoke-Command 帮助主题中的示例。


 我的配置文件位于何处?

    Windows 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 中使用。

    还可使用会话配置中的启动脚本在使用该会话配置的每个远程会话中运行配置文件。

    有关 Windows PowerShell 配置文件的详细信息,请参阅 about_Profiles。有关会话配置的详细信息,
    请参阅 Register-PSSessionConfiguration。



 针对远程命令的限制功能如何起作用?

   为了帮助您管理本地计算机上的资源,Windows PowerShell 提供了一种每命令限制功能,用于限制为每个命令建
   立的并发远程连接的数量。

   默认值是 32 个并发连接,但您可以使用 cmdlet 的 ThrottleLimit 参数为特定命令设置自定义限制。

   使用限制功能时,请记住该功能应用于每个命令,而不是应用于整个会话或计算机。如果在多个会话或 PSSession 
   中同时运行命令,则并发连接的数量是所有会话中的并发连接的总数。

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

	get-help * -parameter ThrottleLimit


 远程处理中是否存在系统特定的差异?

   在多台计算机上运行命令时,请注意远程计算机之间的差异,例如操作系统、文件系统结构和注册表方面的差异。

   如果连接到运行 Windows Vista 或 Windows Server 2003 的远程计算机上,则默认起始位置是当前用户的主
   目录,该位置存储在 %homepath% 环境变量 ($env:homepath) 和 Windows PowerShell $home 变量中。在 
   Windows Vista 中,主目录通常是 C:\Users\<用户名>。在 Windows Server 2003 中,主目录通常是 
   C:\Documents and Settings\<用户名>。

   如果连接到运行 Windows XP 的远程计算机上,则默认起始位置是默认用户的主目录,该位置存储在默认用户的 
   %homepath% 环境变量 ($env:homepath) 中。主目录通常是 C:\Documents and Setting\Default User。


 远程命令的输出与本地输出是否有所不同?
   
   如果在本地使用 Windows PowerShell,您会发送和接收"活动".NET Framework 对象;"活动"对象是与实际程序
   或系统组件相关联的对象。当您调用活动对象的方法或更改其属性时,这些更改会影响实际的程序或组件。此
   外,当程序或组件的属性更改时,表示它们的对象的属性也会更改。

   但是,由于大多数活动对象无法通过网络传输,Windows PowerShell 将"序列化"在远程命令中发送的大多数对
   象,也就是说,它将每个对象转换为一系列 XML(XML 中的约束语言 [CLiXML])数据元素以进行传输。

   当 Windows PowerShell 接收序列化对象时,它会将 XML 转换为反序列化对象类型。反序列化对象是程序或组
   件以往的属性的精确记录,但此对象不再是"活动"的,也就是说它不再与组件直接关联。此外,由于方法不再有效,
   它们会被删除。

   通常,可以像使用活动对象那样来使用反序列化对象,但必须认识到它们的局限性。此外,Invoke-Command 
   cmdlet 返回的对象具有其他一些属性,可以帮助您确定命令的来源。

   在接收某些对象类型(例如 DirectoryInfo 对象和 GUID)时,会将它们重新转换为活动对象。这些对象不需要
   任何特殊的处理或格式设置。

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


 可以远程运行后台作业吗?

   可以。Windows PowerShell 后台作业是异步运行而不与会话交互的 Windows PowerShell 命令。启动后台作
   业时,命令提示符会立即返回,您可以在该作业运行的同时继续在会话中工作,即使作业运行时间延长也没关系。
   
   您甚至可以在其他命令正在运行时启动后台作业,因为后台作业始终在一个临时会话中异步运行。

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

   有关 Windows PowerShell 中的后台作业的详细信息,请参阅 about_Jobs 和 about_Remote_Jobs。


 可以在远程计算机上运行 Windows 程序吗?
 
    可以使用 Windows PowerShell 远程命令在远程计算机上运行基于 Windows 的程序。例如,您可在远程计算
    机上运行 Shutdown.exe 或 Ipconfig。

    但是,不能使用 Windows PowerShell 命令打开远程计算机上的任何程序的用户界面。

    在远程计算机上启动 Windows 程序时,在程序完成或您按 Ctrl+C 以中断命令之前,命令将不会完成,
    Windows PowerShell 命令提示符也不会返回。例如,如果在远程计算机上运行 IpConfig 程序,则在 
    IpConfig 完成之前命令提示符不会返回。
 
    如果使用远程命令启动具有用户界面的程序,则程序进程将启动,但用户界面不会显示。在您停止程序进程或按 
    Ctrl+C 以中断命令并停止进程之前,Windows PowerShell 命令将不会完成,命令提示符不会返回。
 
    例如,如果使用 Windows PowerShell 命令在远程计算机上运行记事本,则记事本进程将在远程计算机上启动,
    但记事本的用户界面不会显示。若要中断命令并还原命令提示符,请按 Ctrl+C。
 

 可以限制用户能够在我的计算机上运程运行的命令吗?

    可以。每个远程会话必须使用远程计算机上的某一种会话配置。您可以管理计算机上的
    会话配置(以及对这些会话配置的权限),从而确定哪些用户可以在您的计算机上远程
    运行命令,以及他们可以运行哪些命令。

    会话配置用于配置会话的环境。可以使用实现新配置类的程序集或使用在会话中运行的脚本来定义配置。
    配置可以决定可在会话中使用的命令。此外,配置还可以包括一些保护计算机的设置,例如限制会话可在
    单个对象或命令中远程接收的数据量的设置。您还可以指定一个安全描述符,用于确定使用配置所需的权限。

    Enable-PSRemoting cmdlet 可在计算机上创建默认会话配置 Microsoft.PowerShell(在 64 位操作系统
    上为 Microsoft.PowerShell32)。Enable-PSRemoting 可为配置设置安全描述符,以便只允许计算机的 
    Administrators 组的成员使用这些配置。
 
    可以使用会话配置 cmdlet 来编辑默认会话配置、创建新的会话配置以及更改所有会话配置的安全描述符。

    当用户使用 Invoke-Command、New-PSSession 或 Enter-PSSession cmdlet 时,他们可以使用 
    ConfigurationName 参数指示用于会话的会话配置。此外,他们还可以通过更改会话中的 
    $PSSessionConfigurationName 首选项变量的值,来更改其会话使用的默认配置。

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

	get-command *pssessionconfiguration

   

 什么是扇入和扇出配置?
	
   最常见的涉及多台计算机的 Windows PowerShell 远程处理方案是一对多配置,在这种配置中,一台本地计算机
   (管理员的计算机)在多台远程计算机上运行 Windows PowerShell 命令。这称为"扇出"方案。

   但是,有些企业中采用多对一配置,在此种配置中,很多客户端计算机连接到一台运行 Windows PowerShell 的
   远程计算机,例如文件服务器或网亭。
   这称为"扇入"配置。

   Windows PowerShell 远程处理既支持扇出配置,也支持扇入配置。

   在扇出配置中,Windows PowerShell 使用 Web Services for Management (WS-Management)
   协议以及支持 WS-Management 的 Microsoft 实现的 WinRM 服务。当本地计算机连接到远程计算机时,
   WS-Management 会建立一个连接,并使用 Windows PowerShell 的插件在远程计算机上启动 Windows PowerShell 
   主机进程 (Wsmprovhost.exe)。用户可以指定备用端口、备用会话配置和其他功能以自定义远程连接。

   为了支持"扇入"配置,Windows PowerShell 使用 Internet 信息服务 (IIS) 来承载 WS-Management、
   加载 Windows PowerShell 插件和启动 Windows PowerShell。在此种方案中,所有 Windows 
   PowerShell 会话都在同一个主机进程中运行,而不是在单独进程中启动每个 Windows PowerShell 会话。

   Windows XP 或 Windows Server 2003 不支持 IIS 承载和扇入远程管理。

   在扇入配置中,用户可以指定连接 URI 和 HTTP 终结点,包括传输、计算机名称、端口和应用程序名称。IIS 将
   所有包含指定应用程序名称的请求转发给应用程序。默认值为 WS-Management,它可以承载 Windows PowerShell。

   您还可以指定身份验证机制,并禁止或允许从 HTTP 和 HTTPS 终结点进行的重定向。
      

 可以在单台计算机上(而不是在域中)测试远程处理吗?

    可以。即使本地计算机不在域中,也可使用 Windows PowerShell 远程处理。可以使用远程处理功能来连接到同
    一台计算机上的会话并在其上创建会话。该功能的工作方式与连接到远程计算机时相同。

    若要在工作组中的一台计算机上运行远程命令,请更改该计算机上的以下 Windows 设置。

    注意:这些设置会影响系统上的所有用户,还可导致系统更易于遭受恶意攻击。在进行这些更改时应十分谨慎。


    --  Windows XP SP2:

        使用本地安全设置 (Secpol.msc) 将"安全设置\本地策略\安全选项"下的"网络访问: 本地帐户的共享和
        安全模式"策略的设置更改为"经典"。


    --  Windows Vista:

        创建以下注册表条目,然后将其值设置为 1:
        LocalAccountTokenFilterPolicy,位于
        HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System 下

        可以使用以下 Windows PowerShell 命令添加此项:

        new-itemproperty `
        –path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System `
        –name LocalAccountTokenFilterPolicy –propertyType DWord –value 1

    --  Windows 2003:

        无需进行更改,因为"网络访问: 本地帐户的共享和安全模式"策略的默认设置为"经典"。为防止该设置已
        更改,请对其进行验证。


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

    可以。通常,命令可在不发生错误的情况下运行,但您可能需要使用 Invoke-Command、New-PSSession 或 
    Enter-PSSession cmdlet 的 Credential 参数提供远程计算机上 Administrators 组成员的凭据。即使
    当前用户是本地和远程计算机上 Administrators 组的成员,有时也需要提供凭据。

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

    若要启用身份验证,请使用以下命令将远程计算机添加到 WinRM 中的本地计算机受信任主机列表中。
    在 Windows PowerShell 命令提示符处键入命令。

        set-item WSMan:\localhost\Client\TrustedHosts -value <Remote-computer-name>

    例如,若要将 Server01 计算机添加到本地计算机上的受信任主机列表中,请在 Windows PowerShell 提示符
    处键入以下命令:

        set-item WSMan:\localhost\Client\TrustedHosts -value Server01


另请参阅
    about_Remote
    about_Profiles
    about_PSSessions
    about_Remote_Jobs
    Invoke-Command
    New-PSSession




目录