共用方式為


使用 PowerShell 進行虛擬機器自動化和管理

您可以使用 PowerShell Direct,從 Hyper-V 主機在 Windows 10 或更新版本的虛擬機器中執行任意 PowerShell,或 Windows Server 2016 或更新版本的虛擬機器。 無論網路組態或遠端管理設定為何,都使用 PowerShell Direct。

以下是執行 PowerShell Direct 的一些方式:

需求

作業系統需求:

  • 主機:運行 Hyper-V 的 Windows 10、Windows Server 2016 或更高版本。
  • 客體/虛擬機器:Windows 10、Windows Server 2016 或更新版本。

如果您要管理較舊的虛擬機器,請使用虛擬機器連線 (VMConnect) 或透過網路連線連線。

配置要求:

  • 虛擬機器必須在主機上本地運行。
  • 虛擬機器必須已開啟,並使用至少一個已設定的使用者設定檔執行。
  • 您必須以 Hyper-V 管理員身分登入主機電腦。
  • 您必須提供虛擬機器的有效使用者認證。

建立並結束互動式 PowerShell 會話

在虛擬機中運行 PowerShell 命令的最簡單方法是啟動交互式會話。

當工作階段啟動時,您輸入的命令會在虛擬機器上執行,就像您直接在虛擬機器本身的 PowerShell 工作階段中輸入命令一樣。

若要開始互動式工作階段:

  1. 在 Hyper-V 主機上,以系統管理員身分開啟 PowerShell。

  2. 執行下列其中一個命令,使用虛擬機器名稱或 GUID 建立互動式工作階段:

    Enter-PSSession -VMName <VMName>
    Enter-PSSession -VMId <VMId>
    

    出現提示時輸入虛擬機器的認證。

  3. 在虛擬機器上執行命令。 您應該會看到 VMName 作為 PowerShell 提示字元的前置詞,如下所示:

    [VMName]: PS C:\>
    

    您執行的任何命令都會在虛擬機器上執行。 若要測試,請執行 ipconfighostname 確定這些命令在虛擬機器中執行。

  4. 完成時,請執行下列命令來關閉工作階段:

     Exit-PSSession 
    

備註

如果您的工作階段無法連線,請參閱 疑難排解 以瞭解潛在原因。

若要深入瞭解這些 Cmdlet,請參閱 Enter-PSSessionExit-PSSession

使用 Invoke-Command 執行指令碼或命令

具有 Invoke-Command 的 PowerShell Direct 非常適合您需要在虛擬機上運行一個命令或一個腳本,但不需要在該點之後繼續與虛擬機交互的情況。

若要執行單一命令:

  1. 在 Hyper-V 主機上,以系統管理員身分開啟 PowerShell。

  2. 執行下列其中一個命令,以使用虛擬機器名稱或 GUID 建立工作階段:

    Invoke-Command -VMName <VMName> -ScriptBlock { command } 
    Invoke-Command -VMId <VMId> -ScriptBlock { command }
    

    出現提示時輸入虛擬機器的認證。

    此命令會在虛擬機器上執行。 如果命令產生輸出,您會在主控台中看到它。 指令執行後,連線會自動關閉。

若要執行指令碼:

  1. 在 Hyper-V 主機上,以系統管理員身分開啟 PowerShell。

  2. 執行下列其中一個命令,以使用虛擬機器名稱或 GUID 建立工作階段:

    Invoke-Command -VMName <VMName> -FilePath C:\host\script_path\script.ps1 
    Invoke-Command -VMId <VMId> -FilePath C:\host\script_path\script.ps1 
    

    當出現提示時,請輸入虛擬機器的憑證。

    指令碼會在虛擬機器上執行。 指令執行後,連線會自動關閉。

如需此 Cmdlet 的詳細資訊,請參閱 Invoke-Command

複製具有 New-PSSession 和 Copy-Item 的檔案

備註

PowerShell Direct 僅支援 Windows 組建 14280 和更新版本中的持續性會話

在編寫跨一或多台遠端機器協調操作的腳本時,持久性 PowerShell 會話非常有用。 建立後,持久性會話會存在於背景中,直到您決定刪除它們為止。 這表示您可以一遍又一遍Invoke-CommandEnter-PSSession地參考相同的工作階段,無論是否傳遞認證。

出於同樣的原因,會話會保留狀態。 由於持續性工作階段會持續存在,因此您在工作階段中建立或傳遞至工作階段的任何變數都會在多個呼叫中保留。 您可以使用多種工具來處理持續會話。 在此範例中,請使用 New-PSSessionCopy-Item 將資料從主機移至虛擬機器,以及從虛擬機器移至主機。

若要建立工作階段,然後複製檔案:

  1. 在 Hyper-V 主機上,以系統管理員身分開啟 PowerShell。

  2. 執行下列其中一個指令,以透過 New-PSSession 建立與虛擬機器的持續 PowerShell 會話。

    $s = New-PSSession -VMName <VMName> -Credential (Get-Credential)
    $s = New-PSSession -VMId <VMId> -Credential (Get-Credential)
    

    出現提示時,請輸入虛擬機器的憑證。

    警告

    14500 之前的版本中存在錯誤。 如果您未明確指定具有旗標的 -Credential 認證,客體中的服務會當機,且需要重新啟動。 如果您遇到此問題,請參閱 錯誤:遠端工作階段可能已結束一 節,以取得因應措施指示。

  3. 將檔案複製到虛擬機器中。

    若要從主機複製到虛擬機器,請 C:\host_path\data.txt 執行:

    Copy-Item -ToSession $s -Path C:\host_path\data.txt -Destination C:\guest_path\
    
  4. 從虛擬機器複製檔案 (複製到主機上)。

    若要從虛擬機器複製到主機,請 C:\guest_path\data.txt 執行:

    Copy-Item -FromSession $s -Path C:\guest_path\data.txt -Destination C:\host_path\
    
  5. 使用 Remove-PSSession來停止持續會話。

    Remove-PSSession $s
    

故障排除

PowerShell Direct 會顯示一小部分常見錯誤訊息。 下列各節說明最常見的錯誤訊息、一些原因,以及用於診斷問題的工具。

-VMName 或 -VMID 參數不存在

問題:

Enter-PSSessionInvoke-CommandNew-PSSession沒有-VMName-VMId參數。

潛在原因:

最有可能的問題是您的主機作業系統不支援 PowerShell Direct。

您可以執行下列命令來檢查您的 Windows 組建:

[System.Environment]::OSVersion.Version

如果您執行支援的組建,您的 PowerShell 版本也可能不支援 PowerShell Direct。 針對 PowerShell Direct 和 JEA,主要版本必須是 5 或更新版本。

您可以執行下列命令來檢查 PowerShell 版本組建:

$PSVersionTable.PSVersion

錯誤:遠端工作階段可能已結束

備註

對於主機版本 10240 和 12400 之間的 Enter-PSSession,所有錯誤均報告為「遠端會話可能已結束」。

錯誤訊息:

Enter-PSSession :發生 Windows PowerShell 無法處理的錯誤。 遠端工作階段可能已結束。

潛在原因:

  • 虛擬機器存在,但未執行。
  • 客體 OS 不支援 PowerShell Direct。 請參閱 需求
  • PowerShell 在客體中尚無法使用
    • 作業系統尚未完成開機
    • 作業系統無法正確開機
    • 某些開機時間事件需要使用者輸入

使用 Get-VM Cmdlet 來檢查主機上正在執行哪些 VM。

錯誤訊息:

New-PSSession :發生 Windows PowerShell 無法處理的錯誤。 遠端工作階段可能已結束。

潛在原因:

  • 之前所列出的一個理由——這些理由皆適用於 New-PSSession
  • 目前組建中的一個錯誤,您必須明確傳遞憑證與-Credential。 當發生此錯誤時,整個服務會在客體作業系統中掛起,需要重新啟動。 您可以檢查工作階段是否仍可使用 Enter-PSSession。

若要解決認證問題,請使用 VMConnect 登入虛擬機器、開啟 PowerShell,然後使用下列 PowerShell 命令重新啟動 vmicvmsession 服務:

Restart-Service -Name vmicvmsession

錯誤:無法解析參數集

錯誤訊息:

Enter-PSSession :無法使用指定的具名參數來解析參數集。

潛在原因:

  • 連線到虛擬機器時,您無法使用 -RunAsAdministrator

    連線到 Windows 容器時,旗 -RunAsAdministrator 標允許管理員連線,而不需要明確的認證。 由於虛擬機器不會授與主機隱含的系統管理員存取權,因此您必須明確輸入認證。

您可以使用參數將 -Credential 管理員認證傳遞至虛擬機器,或在出現提示時手動輸入認證。

錯誤:認證無效

錯誤訊息:

Enter-PSSession :認證無效。

潛在原因:

  • 無法驗證來賓認證
    • 提供的認證不正確。
    • 在來賓用戶中沒有使用者帳戶(操作系統從未啟動過)
    • 如果以管理員身分連線:管理員未被設為作用中使用者。 如需詳細資訊,請參閱 啟用和停用內建管理員帳戶

錯誤:輸入 VMName 參數無法解析為任何虛擬機器。

錯誤訊息:

Enter-PSSession:輸入的 VMName 參數無法解析為任何虛擬機器。

潛在原因:

  • 您不是 Hyper-V 管理員。
  • 虛擬機器不存在。

使用 Get-VM Cmdlet 來檢查您使用的認證是否具有 Hyper-V 系統管理員角色,並查看哪些 VM 正在主機上本機執行並開機。

範例和使用者指南

PowerShell Direct 支援 Just Enough 系統管理 (JEA) 。

查看 GitHub 上的範例。