主題
    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) 文件庫中的< WS-Management 通訊協定> 
   (https://go.microsoft.com/fwlink/?LinkId=144634)。 


 WINDOWS POWERSHELL 是否具有遠端安全性?

    連線到遠端電腦時,系統會使用本機電腦上的使用者名稱與密碼認證或是您以命令方式提供
    的認證,將您登入遠端電腦。認證與其他的傳輸內容都會經過加密。

    如果要增加其他防護措施,您可以將遠端電腦設為在接聽 Windows Remote Management 
    (WinRM) 要求時,改採 Secure Sockets Layer (SSL) 取代 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:

       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 名稱> -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 
   參數接受多個 PSSessions。

   執行 Invoke-Command 命令時,Windows PowerShell 會在所有指定的電腦或指定的 
   PSSessions 中執行命令。

   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\<UserName>。在 Windows Server 2003 中,主目錄通常為 C:\Documents 
   and Settings\<UserName>。

   連線到執行 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 完成之前都不會傳回。
 
    如果您使用遠端命令啟動具有使用者介面的程式,程式處理序會啟動,但是不會顯示使用者
    介面。Windows PowerShell 命令並不會完成,同時,在您停止程式處理序或者按下 
    CTRL+C 以中斷命令並停止處理序之前,命令提示字元都不會傳回。
 
    例如,如果使用 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

   

 何謂收斂傳送 (Fan-in) 與展開傳送 (Fan-out) 設定?
	
   最常見的 Windows PowerShell 遠端處理案例包含多部電腦為一對多的設定,其中本機
   電腦 (系統管理員的電腦) 在多部遠端電腦上執行 Windows PowerShell 命令。這便是
   「展開傳送」案例。

   然而,在某些企業中,設定屬於多對一性質,其中許多用戶端電腦連線到執行 Windows 
   PowerShell 的單一遠端電腦,例如檔案伺服器或 Kiosk。這便是「收斂傳送」案例。   

   Windows PowerShell 遠端同時支援收斂傳送與展開傳送設定。

   對於展開傳送設定而言,Windows PowerShell 使用 Web Services for Management 
   (WS-Management) 通訊協定以及支援 Microsoft WS-Management 實作的 WinRM 服
   務。當本機電腦連線到遠端電腦時,WS-Management 會建立連線,並且使用 Windows 
   PowerShell 外掛程式,在遠端電腦上啟動 Windows PowerShell 主機處理序 
   (Wsmprovhost.exe)。使用者可以指定其他連接埠、其他工作階段設定以及自訂遠端連
   線的其他功能。 

   為了能夠支援收斂傳送設定,Windows PowerShell 使用網際網路資訊服務 (IIS) 裝載 
   WS-Management、載入 Windows PowerShell 外掛程式,然後啟動 Windows 
   PowerShell。在這個案例中,並不會在一個獨立的處理序中啟動每一個 Windows 
   PowerShell 工作階段,而是所有 Windows PowerShell 工作階段在同一個主機處理序
   中執行。

   Windows XP 或 Windows Server 2003 中並不支援 IIS 裝載和收斂傳送遠端管理。

   在收斂傳送設定中,使用者可以指定連線 URI 與 HTTP 端點,包括傳輸、電腦名稱與應用
   程式名稱。IIS 會將所有具有特定應用程式名稱的要求轉送給應用程式。預設值為可以裝
   載 Windows PowerShell 的 WS-Management。

   您也可以指定驗證機制,然後禁止或允許來自 HTTP 與 HTTPS 端點的重新導向。
      

 我可以在不屬於同一網域的單一電腦上測試遠端功能嗎?

    是。即使本機電腦不在網域中,也可以使用 Windows PowerShell 遠端處理。您可以
    使用遠端功能與工作階段連線並且在同一部電腦中建立工作階段。遠端功能的運作方式與
    您連線到遠端電腦時的運作相同。

    若要在工作群組中的電腦上執行遠端命令,請在電腦上變更下列 Windows 設定。

    警告:這些設定會影響系統上的所有使用者,而且會讓系統變得更容易遭受惡意攻擊。因
    此,進行這些變更時,務必謹慎小心。


    --  Windows XP 含 SP2: 

        使用 [本機安全性設定值] (Secpol.msc),將 Security Settings\Local 
        Policies\Security Options 中 [網路存取: 共用和安全性模式用於本機帳戶] 原
        則的設定變更為 [傳統]。


    --  Windows Vista: 

        建立下列登錄項目,然後將該值設為 1:
        LocalAccountTokenFilterPolicy in 
        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 <遠端電腦名稱>
         
    例如,若要將 Server01 電腦新增到本機電腦的受信任主機清單中,請在 Windows 
    PowerShell 提示字元中輸入下列命令:

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


請參閱
    about_Remote
    about_Profiles
    about_PSSessions
    about_Remote_Jobs
    Invoke-Command
    New-PSSession




目錄