Про то как оживить зависшую виртуальную машину с помощью скрипта PowerShell я уже писал где-то здесь. С этим, думаю, проблем не должно возникнуть. Но, как это часто бывает, беда, с изяществом киношного ниндзя, появляется оттуда откуда её меньше всего ждёшь.
Ситуация такая — есть сервер с изолированными виртуальными машинами, на которых работают пользователи, которым в свою очередь необходимы права локальных администраторов. Но с большой силой приходит и большая ответственность, которую — как всегда — никто не хочет на себя брать.
Пользователи умудряются выключать виртуальные хосты. Даже если скрыть из системы любое упоминание о функции выключения как таковой — всё равно найдётся кто-то, кто положит хост.
Бороться с этим можно простейшим скриптом и созданием назначенного задания на сервере виртуализации с получасовым (к примеру) циклом выполнения. Содержимое скрипта будет таким:
if (Get-VM -Name TEST | where {$_.State -eq 'Off'})
{ Start-VM -Name TEST }
else { Write-Host "Машина уже запущена!" }
Эта конструкция проверит состояние виртуальной машины и если она выключена — скрипт запустит указанную машину. В моём примере используется виртуальная машина с именем TEST. В Вашем случае это будет имя виртуальной машины на Вашем HV-сервере.
Чтобы каждый раз не упоминать имя машины в командах, предлагаю запихнуть его в переменную. Например так:
$vmhost = "TEST"
if (Get-VM -Name $vmhost | where {$_.State -eq 'Off'})
{ Start-VM -Name $vmhost }
else { Write-Host "Машина уже запущена!" }
Кончено, условие else здесь носит пояснительный характер и просто выводит надпись о том, что машина и без того работает и никаких действий не требуется.
К скрипту можно прикрутить простейший логгер. Например, о котором я писал в этом посте.
Как следствие, из этого функционала родилась вот такая штука:
if (Get-VM -Name TEST | where {$_.State -eq 'Running'})
{ Stop-VM -Name TEST }
else { Write-Host "Машина уже выключена!" }
Она наоборот выключает запущенные виртуальные машины и следит за тем, чтобы не останавливать и без того уже остановленную машину. Возможно, кому-то это пригодится.
Вместо P.S.
Выключить машину без перехода в состояние завершения работы можно вот такой командой:
Stop-VM -Name TEST –TurnOff
Получить IP адреса всех запущенных виртуальных машин можно вот так:
(Get-VM | Select -ExpandProperty NetworkAdapters | Select VMName, IPAddresses, Status | ft -HideTableHeaders | Out-String).Trim()