В. Как проще изменить состояние всех виртуальных машин сервера 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 уже приостановлена. Если не использовать два последних параметра, то команда переведет каждую виртуальную машину в указанное состояние.