PowerShell 遠端處理常見問題

當您從遠端工作時,您會在一部計算機上輸入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 管理通訊協定的相關信息,請參閱 Windows 檔中的 WS 管理通訊協定

從 Windows PowerShell 3.0 開始,遠端會話會儲存在遠端電腦上。 這可讓您中斷會話的連線,並從不同的會話或不同計算機重新連線,而不會中斷命令或失去狀態。

PowerShell 遠端處理是否安全?

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

若要新增額外的保護,您可以將遠端電腦設定為使用安全套接字層 (SSL), 而不是 HTTP 來接聽 Windows 遠端管理 (WinRM) 要求。 然後,用戶可以在建立連線時,使用 New-PSSessionEnter-PSSession Cmdlet 的 Invoke-CommandUseSSL 參數。 此選項會使用更安全的 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-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。 中斷要求會傳遞至遠端電腦,並終止遠端命令。

如需遠端命令的詳細資訊,請參閱支援遠端處理之 Cmdlet 的about_Remote和說明主題。

我是否可以直接將 telnet 連線到遠端電腦?

您可以使用 Enter-PSSession Cmdlet 來啟動遠端電腦的互動式工作階段。

在 PowerShell 提示字元中,輸入:

Enter-PSSession <ComputerName>

命令提示字元會變更,以顯示您已連線到遠端計算機。

<ComputerName>\C:>

現在,您輸入的命令會在遠端電腦上執行,就像您直接在遠端電腦上輸入它們一樣。

若要結束互動式工作階段,請輸入:

Exit-PSSession

互動式會話是使用 WS 管理通訊協議的持續性會話。 這與使用 Telnet 不同,但它提供類似的體驗。

如需詳細資訊,請參閱Enter-PSSession

我可以建立持續性連線嗎?

是。 您可以指定遠端電腦的名稱、其 NetBIOS 名稱或其 IP 位址,以執行遠端命令。 或者,您可以指定連線到遠端電腦的 PowerShell 工作階段 (PSSession) 來執行遠端命令。

當您使用 或Enter-PSSessionInvoke-Command ComputerName 參數時,PowerShell 會建立暫時連線。 PowerShell 會使用連線只執行目前的命令,然後關閉連線。 這是一個非常有效率的方法,可用於執行單一命令或數個不相關的命令,即使在許多遠端計算機上也是如此。

當您使用 New-PSSession Cmdlet 建立 PSSession 時,PowerShell 會建立 PSSession 的持續連線。 然後,您可以在 PSSession 中執行多個命令,包括共用數據的命令。

一般而言,您會建立 PSSession 來執行一系列共享數據的相關命令。 否則,ComputerName 參數所建立的暫存連線就足以用於大部分的命令。

如需會話的詳細資訊,請參閱 about_PSSessions

我可以一次在多部計算機上執行命令嗎?

是。 Cmdlet 的 Invoke-Command ComputerName 參數接受多個計算機名稱,而 Session 參數則接受多個 PSSession。

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

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 轉換成還原串行化的物件類型。 還原串行化物件是先前程式或元件屬性的精確記錄,但不再「即時」,也就是說,它不再與元件直接產生關聯。 而且,會移除方法,因為它們不再有效。

一般而言,您可以使用還原串行化的物件,就像使用即時對象一樣,但您必須注意其限制。 此外,Cmdlet 所 Invoke-Command 傳回的物件具有其他屬性,可協助您判斷命令的來源。

某些物件類型,例如 DirectoryInfo 物件和 GUID,會在收到物件時重新轉換成實時物件。 這些物件不需要任何特殊的處理或格式設定。

如需解譯和格式化遠端輸出的相關信息,請參閱 about_Remote_Output

我可以從遠端執行背景工作嗎?

是。 PowerShell 背景作業是 PowerShell 命令,其會以異步方式執行,而不需與會話互動。 當您啟動背景工作時,命令提示字元會立即傳回,而且即使工作長時間執行,也可以繼續在會話中工作。

即使其他命令正在執行,您也可以啟動背景工作,因為背景工作一律會在暫存會話中異步執行。

您可以在本機或遠端電腦上執行背景工作。 根據預設,背景工作會在本機計算機上執行。 不過,您可以使用 Cmdlet 的 Invoke-Command AsJob 參數,以背景工作的形式執行任何遠端命令。 此外,您可以使用 Invoke-Command 遠端執行 Start-Job 命令。

如需PowerShell中背景工作的詳細資訊,請參閱 about_Jobsabout_Remote_Jobs

我可以在遠端電腦上執行 Windows 程式嗎?

您可以使用 PowerShell 遠端命令,在遠端電腦上執行以 Windows 為基礎的程式。 例如,您可以在遠端電腦上執行 Shutdown.exeIpconfig.exe

不過,您無法使用 PowerShell 命令開啟遠端電腦上任何程式的使用者介面。

當您在遠端電腦上啟動 Windows 程式時,命令未完成,而且 PowerShell 命令提示字元不會傳回,直到程式完成,或直到您按 CTRL+C 中斷命令為止。 例如,如果您在遠端電腦上執行 Ipconfig.exe 程式,則命令提示字元在完成之前 Ipconfig.exe 不會傳回。

如果您使用遠端命令來啟動具有使用者介面的程式,程序進程就會啟動,但使用者介面不會出現。 PowerShell 命令未完成,而且命令提示字元不會傳回,直到您停止程式程式或按 CTRL+C 為止,這會中斷命令並停止進程。

例如,如果您使用 PowerShell 命令在遠端電腦上執行Notepad,記事本 進程就會在遠端電腦上啟動,但 記事本 使用者介面不會出現。 若要中斷命令並還原命令提示字元,請按 CTRL+C。

我可以限制使用者可以在電腦上遠端執行的命令嗎?

是。 每個遠端會話都必須使用遠端電腦上的其中一個會話設定。 您可以管理計算機上的會話組態(以及這些會話設定的許可權),以判斷誰可以在您的計算機上遠端執行命令,以及哪些命令可以執行。

會話組態會設定會話的環境。 您可以使用實作新組態類別的元件,或使用會話中執行的腳本,來定義組態。 組態可以判斷會話中可用的命令。 此外,組態可以包含保護計算機的設定,例如限制會話可以在單一物件或命令中遠端接收的數據量設定。 您也可以指定安全性描述元,以決定使用組態所需的許可權。

Cmdlet Enable-PSRemoting 會在您的計算機上建立預設會話設定:Microsoft.PowerShell、Microsoft.PowerShell.Workflow 和 Microsoft.PowerShell32(僅限 64 位操作系統)。 Enable-PSRemoting會設定的安全性描述元,只允許計算機上 管理員 istrators 群組的成員使用它們。

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

從 Windows PowerShell 3.0 開始, New-PSSessionConfigurationFile Cmdlet 可讓您使用文本檔建立自定義會話組態。 檔案包含設定語言模式的選項,以及指定使用會話設定之會話中可用的 Cmdlet 和模組。

當使用者使用 Invoke-CommandNew-PSSessionEnter-PSSession Cmdlet 時,他們可以使用 ConfigurationName 參數來指出會話所使用的會話組態。 此外,他們可以變更會話中喜好設定變數的值 $PSSessionConfigurationName ,以變更其會話所使用的預設組態。

如需會話設定的詳細資訊,請參閱會話設定 Cmdlet 的說明。 若要尋找會話設定 Cmdlet,請輸入:

Get-Command *PSSessionConfiguration

什麼是風扇和展開組態?

涉及多部計算機的最常見PowerShell遠端案例是一對多組態,其中一部本機電腦(系統管理員的電腦)會在許多遠端電腦上執行PowerShell命令。 這稱為「展開傳送」案例。

不過,在某些企業中,設定是多對一,其中許多用戶端計算機會連線到執行 PowerShell 的單一遠端電腦,例如文件伺服器或 kiosk。 這稱為「扇入」組態。

PowerShell 遠端處理同時支援向外傳送和扇入組態。

針對展開組態,PowerShell 會使用 Web Services for Management (WS-Management) 通訊協定,以及支援 Microsoft 實作 WS-Management 的 WinRM 服務。 當本機計算機連線到遠端計算機時,WS-Management 會建立連線,並使用 PowerShell 外掛程式在遠端電腦上啟動 PowerShell 主機進程(Wsmprovhost.exe)。 使用者可以指定替代埠、替代會話設定,以及其他功能來自定義遠端連線。

為了支援「風扇」設定,PowerShell 會使用因特網資訊服務 (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: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 參數,以提供遠端電腦上 管理員 istrators 群組成員的認證。 即使目前使用者是本機和遠端計算機上 管理員 istrators 群組的成員,有時也需要這樣做。

不過,如果遠端電腦不在本機計算機信任的網域中,遠端計算機可能無法驗證用戶的認證。

若要啟用驗證,請使用下列命令,將遠端電腦新增至 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 遠端處理。