Я часто сталкиваюсь с необходимостью делать снимки экрана виртуальных машин vSphere. Работаю как с vCenter так и с ESXi. Устал нажимать Alt + PrScr в VMRC и решил разобраться со встроенными возможностями vSphere, которые позволяют делать снимки экрана виртуальной машины.
В vSphere есть два способа делать скриншоты: неправильный и мой. Шучу:
- vSphere API
- HTTP Handler
Скриншот с помощью vSphere API
Этот способ заключается в использовании vSphere API метода CreateScreenshot_Task для виртуальной машины. При этом снимок экрана работающей виртуальной машины будет сохранён в файл PNG в рабочей директории виртуальной машины. Файл будет содержать название машины и порядковый номер, например, "MyVM-screenshot-0.png". Пользователь должен иметь привилегии VirtualMachine.Interact.CreateScreenshot.
Метод можно использовать в vCenter и ESXi. Для скачивания файла нужно войти на хост ESXi.
Способ можно и нужно использовать разработчикам софта под VMware, но системным администраторам пользоваться этим методом неудобно.
Скриншот с помощью HTTP Handler
Второй метод позволяет извлечь скриншот по URL в ESXi или vCenter. Для этого достаточно зайти на URL vCenter:
https://vcenter/screen?id=vm-8
Или URL ESXi:
https://esxi/screen?id=8
Где id — MoRef (Managed Object Reference) идентификатор виртуальной машины, в ESXi он числовой, в vCenter у него есть префикс "vm-". Узнать его просто, достаточно выбрать виртуальную фашину и внимательно рассмотреть URL. Про MoRef можно почитать здесь: KB 1017126.
Нужно будет указать логин и пароль, т.к. включена basic authentication. Пользователь должен иметь привилегию VirtualMachine.Interact.ConsoleInteract.
Пример получения скриншота виртуальной машины на ESXi 7:
https://192.168.1.10/screen?id=8
В UI гипервизора используется тот же способ получения миниатюры виртуальной машины, там я его и подсмотрел.
Параметрами скриншота можно рулить:
- w — ширина скриншота в пикселях
- h — высота скриншота в пикселях
- x0 — расстояние слева до левого верхнего угла выбранной области
- y0 — расстояние сверху до левого верхнего угла выбранной области
- x1 — расстояние слева до правого нижнего угла выбранной области
- y1 — расстояние сверху до правого нижнего угла выбранной области
Пример:
https://192.168.1.10/screen?id=8&w=800&h=600&x0=170&y0=60&x1=620&y1=680
Программируй, автоматизируй, ускоряй
Всё замечательно, когда нужно сделать один скриншот. А когда много? Нужно как-то автоматизировать процесс, например, написать BAT файл.
Я воспользовался тем, что Windows 10 и Windows 11 имеют на борту утилиту curl.
Код
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
rem =============================
rem ========= variables =========
rem =============================
set user=root
(set pass=hello^^^!)
set host=https://192.168.1.10
set id=8
set /a w=800
set /a h=0
set /a x0=0
set /a y0=300
set /a x1=0
set /a y1=0
rem =============================
rem ==== select NEXT screeen ====
rem =============================
set /a nn=0
@for /f "delims=" %%i in ('"2>nul dir /a-d/b/o-n "screen_*.png""') do (
set curname=%%i
set /a curnn=!curname:~7,-4!
if !curnn! GTR !nn! set /a nn=!curnn!
)
set /a nn=%nn% + 1
set nns=screen_%nn%.png
rem =============================
rem ========= screenshot ========
rem =============================
set url=%host%/screen?id=%id%
if %w% GTR 0 set url=!url!^&w=%w%
if %h% GTR 0 set url=!url!^&h=%h%
if %x0% GTR 0 set url=!url!^&x0=%x0%
if %y0% GTR 0 set url=!url!^&y0=%y0%
if %x1% GTR 0 set url=!url!^&x1=%x1%
if %y1% GTR 0 set url=!url!^&y1=%y1%
curl ^
-k ^
-s ^
-u "%user%:!pass!" ^
!url! ^
--output %nns%
- user — имя пользователя
- pass — пароль, если в пароле есть символ восклицательного знака "!", то заменяем его на конструкцию "^^^!"
- host — URL гипервизора ESXi или vCenter
- id — MoRef идентификатор VM
- w — ширина скриншота в пикселях, если не используется, то 0
- h — высота скриншота в пикселях, если не используется, то 0
- x0 — расстояние слева до левого верхнего угла выбранной области, если не используется, то 0
- y0 — расстояние сверху до левого верхнего угла выбранной области, если не используется, то 0
- x1 — расстояние слева до правого нижнего угла выбранной области, если не используется, то 0
- y1 — расстояние сверху до правого нижнего угла выбранной области, если не используется, то 0
Скрипт коннектится к vCenter или ESXi от имени указанного пользователя и создаёт в текущей директории файлы вида:
- screen_1.png
- screen_2.png
- screen_3.png
- и так далее
Если файл скриншота в директории уже есть, то создаётся следующий по счёту.
Ссылки
Про скриншоты в VMware Workstation написано здесь:
Ещё есть код Мартина (Martin Pugh) на PowerShell:
https://thesurlyadmin.com/2013/01/31/discovery-with-powershell/
Ещё предлагают вариант сделать скриншот с помощью утилиты vmrun:
vmrun -T server -h https://hostname:8333/sdk -u root -p mypassword -gu fred -gp guestpasswd captureScreen "[Vol1] CentOS 5.2/CentOS 5.2.vmx" /home/fred/images/vm_screen.png
По идее оно может показать экран конкретного пользователя ОС...