При работе с виртуальными столами VDI на базе VMware Horizon часто возникает необходимость узнать сколько осталось свободных рабочих мест, но если вы делаете привязку пользователей к виртуальной машине (Dedicated Assignment) и у вас много пулов, то такая задача становиться мучением, приходиться заходить в каждый пул и сортируя машины вычислять те, что еще не зарезервированы за пользователями.
Я смог решить такую задачу с помощью специального скрипта для PowerCLI, с дополнительной функцией, не входящей в состав отдельного модуля VMware.Hv.Helper необходимого для работы с VMware Horizon.
Как установить PowerCLI (Набор специальных компонентов для управления продуктами VMware через PowerShell) можно найти в интернете, модуль VMware.Hv.Helper можно скачать по ссылке https://github.com/vmware/PowerCLI-Example-Scripts
После установки всех модулей, мы создаем файл с расширением .ps1 и вставляем в него следующий код (в первой строчке потребуется внести данные для подключения к серверу Horizon, рекомендуется завести отдельную учетную запись с правами "только для чтения"):
Connect-HVServer -Server адрес сервера horizon -User "name@domain" -Password "password"
Function Get-HVMachineDetail{
$queryService = New-Object VMware.Hv.QueryServiceService
$defn = New-Object VMware.Hv.QueryDefinition
$defn.queryEntityType = 'MachineDetailsView'
$defn.sortBy = 'data.name'
$defn.sortDescending = $true
$hvServices = $Global:DefaultHVServers.ExtensionData
$queryResults = $queryService.QueryService_Create($hvServices, $defn)
# Handle results
try {
$vmresults= @()
while ($queryResults.results -ne $null) {
foreach ($result in $queryResults.Results) {
[VMware.Hv.MachineDetailsView]$MachineDetailsView = $result
$vmresults += $MachineDetailsView
# Do work.
}
# Fetch next page
if ($queryResults.id -eq $null) {
break;
}
$queryResults = $queryService.QueryService_GetNext($hvServices, $queryResults.id)
}
} finally {
if ($queryResults.id -ne $null) {
$queryService.QueryService_Delete($hvServices, $queryResults.id)
}
}
#Groups Vm Information
$vms = @()
foreach ($vm in $vmresults)
{
$tempobject = New-Object -TypeName psobject
$tempobject |Add-Member -MemberType NoteProperty -Name VM -value $vm.data.name
$tempobject |Add-Member -MemberType NoteProperty -Name AssignedUser -value $vm.data.assignedusername
$tempobject |Add-Member -MemberType NoteProperty -Name Pool -value $vm.desktopdata.name
$tempobject |Add-Member -MemberType NoteProperty -Name Hostname -value $vm.managedmachinedetailsdata.hostname
$vms += $tempobject
}
return $vms
}
Get-HVMachineDetail | Set-Content -Path c:\temp\all.txt
Выполнение данного скрипта выдаст информацию по всем пулам и по всем виртуальным машинам VDI в файл по пути c:\temp\all.txt
Для того, чтобы получить результат по свободным не назначенным машинам мы можем воспользоваться ограничением для выводимого результата, в следующем примере я оставляю только пулы в названии которых есть цифры 10 и 20, а также попрошу его показать строки, где имя назначенного пользователя пустое и сохранить результат в файл по пути c:\temp\free.txt
Get-HVMachineDetail | Where-Object {$_.Pool -like '*10*' -or $_.Pool -like '*20*' -and $_.AssignedUser -like ''} | Set-Content -Path c:\temp\free.txt