NETWORK ENGINEER BLOG

Tips and Reviews for Engineers

VMware PowerCLI で Horizon 7 環境を制御する

VMware PowerCLI を使って Horizon 7 環境を制御する手順を紹介します。
VMware PowerCLI 6.5.2 以降では、MSI 形式の提供は廃止され、PowerShell Garallry 経由によるインストールとなったようです。
MSI 形式の提供を廃止した理由は、リリース期間の短縮や、より新機能をタイムリーに提供するためとのこと。
参考:
https://kogelog.com/2017/08/29/20170829-03/
https://www.powershellgallery.com/packages/VMware.PowerCLI/11.2.0.12780525

VMware PowerCLI インストール

Windows PowerShell を管理者権限で起動、利用可能な VMware PowerCLI を確認

Find-Module -Name VMware.PowerCLI

VMware.PowerCLI モジュールをインストール

Install-Module -Name VMware.PowerCLI

VMware.PowerCLI の各モジュールをインストール

Get-Module -Name VMware.*View -ListAvailable | Import-Module

拡張機能のインストール

VMware 社が提供する拡張機能をインストール
1. GitHub リポジトリページへアクセス
2. 緑色の [Clone or Download] をクリックし、[Download ZIP] をクリック
3. zip ファイルを解凍し、Modules\VMware.Hv.Helper フォルダを以下のディレクトリにコピー
・ユーザ固有 : %UserProfile%\Documents\WindowsPowerShell\Modules
・システム全体: C:\Program Files\WindowsPowerShell\Modules
4. 拡張機能を解除

dir 'C:\Program Files\WindowsPowerShell\Modules\VMware.Hv.Helper\' | Unblock-File

Horizo​​n Connection Server 接続

Horizo​​n Connection Server 接続

Connect-HVServer -Server cs01.example.com -User Administrator@example.com -Password Password

Horizo​​n Connection Server 切断

Disconnect-HVServer -Server cs01.example.com

注意点:
コマンド実行時、以下のエラーが出力される場合があります。

Connect-HVServer : 機関 '192.168.1.151' との SSL/TLS のセキュリティで保護されているチャネルに対する信頼関係を確立できませんでした。

以下のコマンドを実行し、IP ではなくホスト名を使用することで解決します。

Set-PowerCLIConfiguration -InvalidCertificateAction Ignore -Confirm:$false

コマンド実行例

仮想デスクトップの状態を確認

> Get-HVMachineSummary

Machine         DesktopPool  DNS Name     User     Host            Agent Datastore  Status
-------         -----------  --------     ----     ----            ----- ---------  ------
win10-1         testpool     win10-1.e...          192.168.1.11    7.6.0 ds01       AVAILABLE

「使用可能」となっている仮想デスクトップの台数を抽出

> (get-hvmachinesummary | where {$_.base.basicstate -eq "AVAILABLE"}).count
1234

スクリプト例

仮想デスクトップの状態を表示するスクリプト例

#-------------------------------------------------------------------------
# 変数
#-------------------------------------------------------------------------
$cs = 'cs01.example.com'	# CS サーバの FQDN
$csUser= 'Administrator'	# CS サーバ接続に使用するユーザ名
$csPassword = 'Passw0rd!'	# CS サーバ接続に使用するパスワード
$csDomain = 'example.com'	# CS サーバが所属するドメイン名

#-------------------------------------------------------------------------
# 初期設定
#-------------------------------------------------------------------------
# --- PowerCLI モジュールのインポート ---
Import-Module VMware.VimAutomation.HorizonView
Import-Module VMware.VimAutomation.Core

# --- CS サーバへの接続 ---
$hvServer1 = Connect-HVServer -Server $cs -User $csUser -Password $csPassword -Domain $csDomain

#-------------------------------------------------------------------------
# 仮想デスクトップの状態を表示
#-------------------------------------------------------------------------
Write-Output "仮想デスクトップの状態を表示します。"
Get-HVMachineSummary | Format-table -AutoSize

# --- CS サーバの切断 ---
Write-Output "", "CS サーバの接続を切断します。"
Disconnect-HVServer -Server $cs

問題のある VM を検出して、再起動を実行するスクリプト例
参考:VMware EUC Blog

#-------------------------------------------------------------------------
# 変数
#-------------------------------------------------------------------------
$cs = 'cs01.example.com'		# CS サーバの FQDN
$csUser= 'Administrator'		# CS サーバ接続に使用するユーザ名
$csPassword = 'Passw0rd!'		# CS サーバ接続に使用するパスワード
$csDomain = 'example.com'		# CS サーバが所属するドメイン名

$vc = 'vc01.example.com'		# VC サーバの FQDN 
$vcUser = 'administrator@vsphere.local'	# VC サーバ接続に使用するユーザ名
$vcPassword = 'Passw0rd!'		# VC サーバ接続に使用するパスワード

$baseStates = @('PROVISIONING_ERROR',
                'ERROR',
                'AGENT_UNREACHABLE',
                'AGENT_ERR_STARTUP_IN_PROGRESS',
                'AGENT_ERR_DISABLED',
                'AGENT_ERR_INVALID_IP',
                'AGENT_ERR_NEED_REBOOT',
                'AGENT_ERR_PROTOCOL_FAILURE',
                'AGENT_ERR_DOMAIN_FAILURE',
                'AGENT_CONFIG_ERROR',
                'UNKNOWN')

#-------------------------------------------------------------------------
# 初期設定
#-------------------------------------------------------------------------
# --- PowerCLI モジュールのインポート ---
Import-Module VMware.VimAutomation.HorizonView
Import-Module VMware.VimAutomation.Core

# --- CS サーバへの接続 ---
$hvServer1 = Connect-HVServer -Server $cs -User $csUser -Password $csPassword -Domain $csDomain

# --- View API 連携サービスを取得 ---
$Services1= $hvServer1.ExtensionData

# --- VC サーバへの接続 ---
Connect-VIServer -Server $vc -User $vcUser -Password $vcPassword

#-------------------------------------------------------------------------
# 問題の仮想デスクトップ検出と再起動
#-------------------------------------------------------------------------
Write-Output ""
if ($Services1) {
     foreach ($baseState in $baseStates) {
           # --- 問題の仮想デスクトップを検出 ---
           $ProblemVMs = Get-HVMachineSummary -State $baseState

           foreach ($ProblemVM in $ProblemVMs) {
                $VM = Get-VM -Name $ProblemVM.Base.Name
                # --- 問題の仮想デスクトップを再起動 ---
                Restart-VMGuest -VM $VM
           }
     }
     Write-Output "", "CS サーバの接続を切断します。"
     Disconnect-HVServer -Server $cs
} else {
     Write-Output "", "CS サーバの接続に失敗しました。"
     pause
     }
# --- VC サーバの切断 ---
Write-Output "", "VC サーバの接続を切断します。"
Disconnect-VIServer -Server $vc

参考書籍

以上