1. 程式人生 > >Hyper-V 2016 系列教程40 使用 PowerShell 實現虛擬機自動化和管理虛擬機

Hyper-V 2016 系列教程40 使用 PowerShell 實現虛擬機自動化和管理虛擬機

windows server 2012 2016; hyper-v;虛擬化

註:以下內容部分取自微軟官網:


可以在 Hyper-V 主機上的 Windows 10 或 Windows Server 技術預覽版虛擬機中使用 PowerShell Direct 運行任意 PowerShell,而無論網絡配置或遠程管理設置如何。

運行 PowerShell Direct 的方法:

  • 作為交互式會話 - 請單擊此處以使用 Enter-PSSession 創建和退出交互式 PowerShell 會話。

  • 作為用以執行單個命令或腳本的單用途會話 - 請單擊此處以使用 Invoke-Command 運行腳本或命令。

  • 作為持久性會話(版本 14280 及更高版本)-- 請單擊此處以使用 New-PSSession 創建持久性會話。

    通過使用 Copy-Item 將文件復制到虛擬機或從其復制文件,然後使用 Remove-PSSession 斷開連接來繼續進行操作。

要求

操作系統要求:

  • 主機:可運行 Hyper-V 的 Windows 10 、Windows Server Technical Preview 2 或更高版本。

  • 來賓/虛擬機:Windows 10 、Windows Server Technical Preview 2 或更高版本。

如果要管理較舊的虛擬機,請使用虛擬機連接 (VMConnect) 或為虛擬機配置虛擬網絡。

配置要求:

  • 虛擬機必須在主機上本地運行。

  • 虛擬機必須開啟,且運行時需至少具有一個配置的用戶配置文件。

  • 必須以 Hyper-V 管理員身份登錄主機計算機。

  • 必須為虛擬機提供有效用戶憑據。


創建並退出交互式 PowerShell 會話

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

會話啟動時,所鍵入的命令會在虛擬機上運行,其效果就像直接在虛擬機上將其鍵入到 PowerShell 會話中那樣。

啟動交互會話:

  1. 在 HYPER-V 主機上以管理員身份打開 PowerShell。

  2. 運行以下命令之一以使用虛擬機名稱或 GUID 創建交互會話:

    PowerShell

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

    出現提示時,提供虛擬機的憑據。

  3. 在虛擬機上運行命令。

    你應該會看到作為 PowerShell 提示符前綴的 VMName 顯示如下:

    [VMName]: PS C:\ >

    所有運行的命令將會在虛擬機上進行。 若要測試,可運行 ipconfighostname 以確保這些命令正在虛擬機中運行。

  4. 完成後,運行以下命令來關閉會話:

    PowerShell

    Exit-PSSession

請註意:如果你的會話未連接,請參閱疑難解答了解可能的原因。

若要了解有關這些 cmdlet 的詳細信息,請參閱 Enter-PSSession 和 Exit-PSSession。


使用 Invoke-Command 運行腳本或命令

配合使用 PowerShell Direct 和 Invoke-Command 非常適合需要在虛擬機上運行一個命令或一個腳本但在這一點之外無需繼續與虛擬機進行交互的情況。

運行單個命令:

  1. 在 HYPER-V 主機上以管理員身份打開 PowerShell。

  2. 通過使用虛擬機名稱或 GUID 運行以下命令之一來創建會話:

    PowerShell

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

    出現提示時,提供虛擬機的憑據。

    該命令將在虛擬機上執行,如果存在到控制臺的輸出,會把此輸出打印到控制臺。 命令一運行將會自動關閉連接。

運行腳本:

  1. 在 HYPER-V 主機上以管理員身份打開 PowerShell。

  2. 通過使用虛擬機名稱或 GUID 運行以下命令之一來創建會話:

    PowerShell

    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-PSSession和 Copy-Item 在主機和虛擬機之間移動數據。

創建會話,然後復制文件:

  1. 在 HYPER-V 主機上以管理員身份打開 PowerShell。

  2. 運行以下命令之一使用 New-PSSession 將持久性 PowerShell 會話創建到虛擬機。

    PowerShell

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

    出現提示時,提供虛擬機的憑據。

    警告:
    14500 之前的版本中存在一個 Bug。 如果不使用 -Credential 標誌顯式指定憑據,來賓操作系統中的服務將崩潰,並且將需要重新啟動。 如果點擊此問題,可在此處獲取解決方法說明。

  3. 將文件復制到虛擬機內。

    要將 C:\host_path\data.txt 從主機復制到虛擬機內,運行:

    PowerShell

    Copy-Item -ToSession $s -Path C:\host_path\data.txt -Destination C:\guest_path\
  4. 從虛擬機復制文件(到主機)。

    要將 C:\guest_path\data.txt 從虛擬機復制到主機,運行:

    PowerShell

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

    PowerShell

    Remove-PSSession $s

疑難解答

PowerShell Direct 顯示了一小部分的常見錯誤消息。 以下是最常見的錯誤消息、一些原因和診斷問題的工具。

-VMName 或 -VMID 參數不存在

問題:
Enter-PSSession``Invoke-CommandNew-PSSession 不具有 -VMName-VMId 參數。

可能的原因:
最可能的問題是你的主機操作系統不支持 PowerShell Direct。

可以運行以下命令檢查你的 Windows 版本:

PowerShell

[System.Environment]::OSVersion.Version

如果你運行的是支持的版本,則有可能你的 PowerShell 版本不運行 PowerShell Direct。 對於 PowerShell Direct 和 JEA,主版本必須為 5 或更高版本。

可以運行以下命令檢查你的 PowerShell 版本:

PowerShell

$PSVersionTable.PSVersion

錯誤:遠程會話可能已結束

註意:
對於主機版本在 10240 與 12400 之間的 Enter-PSSession,下面的所有錯誤都報告為“一個遠程會話可能已結束”。

錯誤消息:

Enter-PSSession : An error has occurred which Windows PowerShell cannot handle. A remote session might have ended.

可能的原因:

  • 虛擬機存在但未運行。

  • 來賓操作系統不支持 PowerShell Direct(請參閱要求)

  • PowerShell 尚不可用於來賓

    • 操作系統沒有完成啟動

    • 操作系統無法正常啟動

    • 某些啟動時事件需要用戶輸入

可使用 Get-VM cmdlet 進行檢查以查看主機上正在運行哪些虛擬機。

錯誤消息:

New-PSSession : An error has occurred which Windows PowerShell cannot handle. A remote session might have ended.

可能的原因:

  • 上面列出的原因之一 - 它們都同等適用於 New-PSSession

  • 當前版本中的一個 Bug,在這些版本中,必須使用 -Credential 顯式傳遞憑據。 發生這種情況時,整個服務將在來賓操作系統中掛起,並需要重新啟動。 可以檢查是否仍可通過 Enter-PSSession 使用會話。

若要解決憑據問題,使用 VMConnect 登錄到虛擬機,打開 PowerShell,並使用以下 PowerShell 重新啟動 vmicvmsession 服務:

PowerShell

Restart-Service -Name vmicvmsession

錯誤:無法解析參數集

錯誤消息:

Enter-PSSession : Parameter set cannot be resolved using the specified named parameters.

可能的原因:

  • -RunAsAdministrator 在連接到虛擬機時,不受支持。

    連接到 Windows 容器時,-RunAsAdministrator 標誌將允許管理員連接,而無需顯式憑據。 由於虛擬機未授予主機默示的管理員訪問權限,因此你需要顯式輸入憑據。

使用 -Credential 參數或通過在系統提示時手動輸入,可將管理員憑據傳遞給虛擬機。

錯誤:憑據無效。

錯誤消息:

Enter-PSSession : The credential is invalid.

可能的原因:

  • 無法驗證來賓憑據

    • 提供的憑據不正確。

    • 來賓操作系統中沒有任何用戶帳戶(操作系統以前未啟動)

    • 如果以管理員身份進行連接:管理員還未設置為活動用戶。 在此處了解詳細信息。

錯誤:輸入的 VMName 參數未解析為任何虛擬機。

錯誤消息:

Enter-PSSession : The input VMName parameter does not resolve to any virtual machine.

可能的原因:

  • 你不是 HYPER-V 管理員。

  • 虛擬機不存在。

你可以使用 Get-VM cmdlet 檢查使用中的憑據是否具有 Hyper-V 管理員角色並查看哪些 VM 在主機上本地運行並已啟動。


本文出自 “成杭 的技術博客” 博客,請務必保留此出處http://hangyc.blog.51cto.com/427521/1965725

Hyper-V 2016 系列教程40 使用 PowerShell 實現虛擬機自動化和管理虛擬機