about_Remote_FAQ

適用於: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

主題

about_Remote_FAQ

簡短描述

包含有關在 Windows PowerShell® 中執行遠端命令的問題和解答。

詳細描述

當您在遠端工作時,您會在某部電腦 (稱為「本機電腦」)上於 Windows PowerShell 中輸入命令,但在另一部電腦 (稱為「遠端電腦」) 上執行命令。遠端工作的體驗應該盡可能類似在遠端電腦上直接工作。

注意:若要使用 Windows PowerShell 遠端,您必須設定遠端電腦使用遠端功能。如需詳細資訊,請參閱 about_Remote_Requirements。

這兩部電腦是否都必須安裝 WINDOWS POWERSHELL?

是的。若要在遠端工作,本機和遠端電腦都必須有 Windows PowerShell、Microsoft .NET Framework 和 Web Services for Management (WS-Management) 通訊協定。遠端電腦上必須有執行特定命令所需的任何檔案和其他資源。

執行 Windows PowerShell 3.0 的電腦和執行 Windows PowerShell 2.0 的電腦可以從遠端彼此連線,並執行遠端命令。不過,某些功能 (例如中斷工作階段的連線並重新連線的功能) 只適用於兩部電腦都執行 Windows PowerShell 3.0 的情況。

您必須具有連線到遠端電腦的權限、執行 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 3.0 開始,遠端工作階段會儲存在遠端電腦上。因此,您可以中斷工作階段的連線,並從其他工作階段或電腦重新連線,而不會中斷命令或遺失狀態。

WINDOWS POWERSHELL 遠端功能安全嗎?

當您連線到遠端電腦時,系統會使用本機電腦上的使用者名稱和密碼認證,或者您在命令中提供的認證,將您登入遠端電腦。認證和傳輸的其餘部分會經過加密。

若要增加額外的保護,您可以設定遠端電腦使用安全通訊端層 (SSL) 而非 HTTP,來接聽 Windows 遠端管理 (WinRM) 要求。然後,使用者可以使用 Invoke-Command、New-PSSession 和 Enter-PSSession Cmdlet 的 UseSSL 參數來建立連線。這個選項使用更安全的 HTTPS 通道,而不是 HTTP。

所有遠端命令都需要 WINDOWS POWERSHELL 遠端功能嗎?

不需要。有幾個具有 ComputerName 參數的 Cmdlet,可讓您從遠端電腦取得物件。

這些 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
        or 
        Get-Command -ParameterName 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}

        - OR -

      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 的 ComputerName 或使用 Enter-PSSession 時,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
      -or-
      Get-Command -ParameterName ThrottleLimit

遠端命令的輸出是否與本機輸出不同?

當您在本機使用 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、Microsoft.PowerShell.Workflow 和 Microsoft.PowerShell32 (僅限 64 位元作業系統)。Enable-PSRemoting 會指定組態的安全性描述元,僅允許您電腦上的 Administrators 群組成員使用。

您可以使用工作階段組態 Cmdlet 來編輯預設工作階段組態、建立新的工作階段組態,以及變更所有工作階段組態的安全性描述元。

從 Windows PowerShell 3.0 開始,New-SessionConfigurationFile Cmdlet 可讓您使用文字檔建立自訂工作階段組態。該檔案中的選項可設定語言模式,以及指定使用工作階段組態之工作階段中可用的 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) 通訊協定和支援 Microsoft 之 WS-Management 實作的 WinRM 服務。當本機電腦連線到遠端電腦時,WS-Management 會建立連線,並使用 Windows PowerShell 的外掛程式在遠端電腦上啟動 Windows PowerShell 主機處理序 (Wsmprovhost.exe)。使用者可以指定替代的連接埠、替代的工作階段組態和其他功能,來自訂遠端連線。

為了支援「收合傳送」組態,Windows PowerShell 使用 Internet Information Services (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、Windows 7、Windows 8:

建立下列登錄項目,然後將其值設定為 1:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System 中的 LocalAccountTokenFilterPolicy

您可以使用下列 Windows PowerShell 命令來新增這個項目:

        New-ItemProperty `
        –Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System `
        –Name LocalAccountTokenFilterPolicy –propertyType DWord –Value 1

-- Windows Server 2003、Windows Server 2008、Windows Server 2012、Windows Server 2012 R2:

不需要進行任何變更,因為 [網路存取:共用和安全性模式用於本機帳戶] 原則的預設設定為 [傳統]。如果已變更,請驗證設定。

我可以在其他網域的電腦上執行遠端命令嗎?

可以。一般而言,命令會執行且不會發生錯誤,不過您可能需要使用 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

about_Remote_Variables

Invoke-Command

New-PSSession