В. Как проще изменить состояние всех виртуальных машин сервера Microsoft Hyper-V?
О. Недавно я попытался сделать резервные копии виртуальных машин сервера Hyper-V, но сначала их пришлось перевести в спящий режим. Поэтому был подготовлен приведенный ниже сценарий для изменения состояний всех виртуальных машин. В сценарии предусмотрена возможность изменить виртуальные машины, работа которых приостановлена, и содержатся команды, которые позволяют пропустить одну избранную VM и копировать остальные через диспетчер Microsoft System Center Data Protection Manager (DPM) 2007. Поскольку диспетчер DPM 2007 выполняется в виртуальной машине, пришлось вставить в сценарий команды, чтобы не останавливать эту машину. В сценарии игнорируется имя локального узла сервера Hyper-V.
' sethypervstateall.vbs John Savill
If Wscript.Arguments.Count < 1 Then
Wscript.Echo "Требуются аргументы <желательное состояние> [<текущее состояние>] [<игнорировать VM>]. Например:" & vbCrLf _
& "cscript sethypervstateall.vbs 32769"
Wscript.Echo "Верные желательные состояния 2 (активно), 3 (отключено), 32768 (пауза) и 32769 (приостановлено)" Wscript.Quit(0)
End If
strDesiredState = Trim(Wscript.Arguments(0))
intDesiredState = strDesiredState + 0
strQueryString="."
If Wscript.Arguments.Count > 1 Then
strCurrentState = Trim(Wscript.Arguments(1))
intCurrentState = strCurrentState + 0
strQueryString = "Select * from Msvm_ComputerSystem where EnabledState=" & intCurrentState
Else
strQueryString = "Select * from Msvm_ComputerSystem"
End If
If Wscript.Arguments.Count > 2 Then
strExcludeComputer = Trim(Wscript.Arguments(2))
Else
strExcludeComputer = "NOTUSEDNONONO"
End If
strComputer = "."
Set objNetwork = WScript.CreateObject("WScript.Network")
strLocalServer = objNetwork.ComputerName
Wscript.Echo "Local server - " & strLocalServer
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!" _
& strComputer & " ootVirtualization")
Set colVMs = objWMIService.ExecQuery(strQueryString)
Select Case intDesiredState
Case 0
strNewState = "Unknown (0)"
Case 2
strNewState = "Enabled (2)"
Case 3
strNewState = "Disabled (3)"
Case 32768
strNewState = "Paused (32768)"
Case 32769
strNewState = "Suspended (32769)"
End Select
For Each objVM in colVMs
if (StrComp(strExcludeComputer,Trim(objVM.ElementName),vbTextCompare) <> 0) and (StrComp(strLocalServer,Trim(objVM.ElementName),vbTextCompare) <> 0) then
Select Case objVM.EnabledState
Case 0
strState = "Unknown (0)"
Case 2
strState = "Enabled (2)"
Case 3
strState = "Disabled (3)"
Case 32768
strState = "Paused (32768)"
Case 32769
strState = "Suspended (32769)"
Case 32770
strState = "Starting (32770)"
Case 32771
strState = "Snapshotting (32771)"
Case 32772
strState = "Migrating (32772)"
Case 32773
strState = "Saving (32774)"
Case 32774
strState = "Stopping (32774)"
Case 32775
strState = "Deleted (32775)"
Case 32776
strState = "Pausing (32776)"
End Select
Wscript.Echo "Состояние будет изменено " _
& objVM.ElementName & " из состояния " & strState & " в " & strNewState
objVM.RequestStateChange(intDesiredState)
end if
Next
WScript.Sleep 60000 ' намеревается перейти в спящий режим, поэтому отводится 60 секунд для перевода в режим спячки/возобновления.
Следующая команда приостанавливает активные в данный момент виртуальные машины, за исключением savdalsq101.
cscript sethypervstateall.vbs 32769 2 savdalsql01
Результат следующий:
Microsoft (R) Windows Script Host Version 5.7
Copyright (C) Microsoft Corporation. All rights reserved.
Local server - SAVDALVS01
Will change state of savdaldc01 from state Enabled (2) to Suspended (32769)
Чтобы вернуть приостановленные VM в активное состояние, используйте в качестве образца следующую команду:
cscript sethypervstateall.vbs 2 32769 savdalsql01
Результат:
Microsoft (R) Windows Script Host Version 5.7
Copyright (C) Microsoft Corporation. All rights reserved.
Local server - SAVDALVS01
Will change state of savdaldc01 from state Suspended (32769) to Enabled (2)
Will change state of Vista Client from state Suspended (32769) to Enabled (2)
Обратите внимание, что запущен второй сервер, так как первая VM уже приостановлена. Если не использовать два последних параметра, то команда переведет каждую виртуальную машину в указанное состояние.