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

您可以使用 PowerShell Direct 在 Windows 10 或更新版本或 Windows Server 2016 或更新版本從 Hyper-V 主機執行任意 PowerShell。 不論網路組態或遠端管理設定為何,都使用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 執行腳本或命令

PowerShell Direct with Invoke-Command 非常適合您需要在虛擬機上執行一個命令或一個腳本,但不需要繼續與該點以外的虛擬機互動的情況。

若要執行單一命令:

  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 會話非常有用。 建立之後,持續性會話就會存在於背景中,直到您決定將其刪除為止。 這表示您可以透過 或不Enter-PSSession傳遞認證來反覆Invoke-Command參考相同的會話。

透過相同的令牌,會話會保留狀態。 由於持續性會話會保存,因此在會話中建立或傳遞至會話的任何變數都會在多個呼叫之間保留。 有許多工具可用於使用持續性會話。 在此範例中,我們將使用 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
  • 目前組建中的 Bug,其中必須使用 明確傳遞認證 -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 Administration (JEA)。

查看 GitHub 上的範例。