Metodo RequestStateChange della classe Msvm_ComputerSystem
Richiede che lo stato della macchina virtuale venga modificato nel valore specificato. Richiamare il metodo RequestStateChange più volte potrebbe comportare la sovrascrittura o la perdita di richieste precedenti. Questo metodo è supportato solo per le istanze della classe Msvm_ComputerSystem che rappresentano una macchina virtuale.
Mentre la modifica dello stato è in corso, la proprietà RequestedState viene modificata nel valore del parametro RequestedState .
Sintassi
uint32 RequestStateChange(
[in] uint16 RequestedState,
[out] CIM_ConcreteJob REF Job,
[in] datetime TimeoutPeriod
);
Parametri
-
RequestedState [in]
-
Tipo: uint16
Nuovo stato. I valori maggiori di 32767 sono valori proposti da DMTF e sono soggetti a modifiche.
Ecco i valori possibili:
-
Altro (1)
-
Corrisponde a CIM_EnabledLogicalElement.EnabledState = Altro.
-
Abilitato (2)
-
Corrisponde a CIM_EnabledLogicalElement.EnabledState = Abilitato.
-
Disabilitato (3)
-
Corrisponde a CIM_EnabledLogicalElement.EnabledState = Disabled.
-
Arresto (4)
-
Valido nella versione 1 (V1) solo di Hyper-V. La macchina virtuale viene arrestata tramite il servizio di arresto. Corrisponde a CIM_EnabledLogicalElement.EnabledState = ShuttingDown.
-
Offline (6)
-
Corrisponde a CIM_EnabledLogicalElement.EnabledState = Abilitato ma offline.
-
Test (7)
-
Rinvio (8)
-
Quiesce (9)
-
Corrisponde a CIM_EnabledLogicalElement.EnabledState = Quiesce, Abilitato ma sospeso.
-
Riavvio (10)
-
Transizione dello stato da Disattivato o Salvato a In esecuzione.
-
Reimpostazione (11)
-
Reimpostare la macchina virtuale. Corrisponde a CIM_EnabledLogicalElement.EnabledState = Reimposta.
-
Salvataggio (32773)
-
Nella versione 1 (V1) di Hyper-V corrisponde a EnabledStateSaving.
-
Sospensione (32776)
-
Nella versione 1 (V1) di Hyper-V corrisponde a EnabledStatePausing.
-
Ripresa (32777)
-
Nella versione 1 (V1) di Hyper-V corrisponde a EnabledStateResuming. Transizione dello stato da Sospeso a In esecuzione.
-
FastSaved (32779)
-
Corrisponde a EnabledStateFastSuspend.
-
FastSaving (32780)
-
Corrisponde a EnabledStateFastSuspending. Transizione dello stato da Running a FastSaved.
Questi valori rappresentano stati critici:
RunningCritical (32781)
OffCritical (32782)
StopCritical (32783)
SavedCritical (32784)
PausedCritical (32785)
StartingCritical (32786)
ResetCritical (32787)
SavingCritical (32788)
PausingCritical (32789)
Ripresacritica (32790)
FastSavedCritical (32791)
FastSavingCritical (32792)
Processo [out]
Tipo: CIM_ConcreteJob
Riferimento facoltativo a un oggetto Msvm_ConcreteJob restituito se l'operazione viene eseguita in modo asincrono. Se presente, il riferimento restituito può essere usato per monitorare lo stato di avanzamento e ottenere il risultato del metodo.
TimeoutPeriod [in]
Tipo: datetime
Questo parametro non viene usato.
Valore restituito
Tipo: uint32
Questo metodo restituisce uno dei valori seguenti.
Codice/valore restituito | Descrizione |
---|---|
|
Esito positivo. |
|
La transizione è asincrona. |
|
Accesso negato. |
|
|
|
|
|
|
|
|
|
|
|
|
|
Il valore specificato nel parametro RequestedState non è supportato. |
|
|
|
|
|
Commenti
L'accesso alla classe Msvm_ComputerSystem potrebbe essere limitato dal filtro controllo dell'account utente. Per altre informazioni, vedere Controllo dell'account utente e WMI.
Esempio
L'esempio C# seguente avvia o disabilita una macchina virtuale. Le utilità a cui si fa riferimento sono disponibili in Utilità comuni per gli esempi di virtualizzazione (V2).
Importante
Per funzionare correttamente, il codice seguente deve essere eseguito nel server host della macchina virtuale e deve essere eseguito con privilegi di amministratore.
using System;
using System.Management;
namespace HyperVSamples
{
public class RequestStateChangeClass
{
public static void RequestStateChange(string vmName, string action)
{
ManagementScope scope = new ManagementScope(@"\\.\root\virtualization\v2", null);
ManagementObject vm = Utility.GetTargetComputer(vmName, scope);
if (null == vm)
{
throw new ArgumentException(
string.Format(
"The virtual machine '{0}' could not be found.",
vmName));
}
ManagementBaseObject inParams = vm.GetMethodParameters("RequestStateChange");
const int Enabled = 2;
const int Disabled = 3;
if (action.ToLower() == "start")
{
inParams["RequestedState"] = Enabled;
}
else if (action.ToLower() == "stop")
{
inParams["RequestedState"] = Disabled;
}
else
{
throw new Exception("Wrong action is specified");
}
ManagementBaseObject outParams = vm.InvokeMethod(
"RequestStateChange",
inParams,
null);
if ((UInt32)outParams["ReturnValue"] == ReturnCode.Started)
{
if (Utility.JobCompleted(outParams, scope))
{
Console.WriteLine(
"{0} state was changed successfully.",
vmName);
}
else
{
Console.WriteLine("Failed to change virtual system state");
}
}
else if ((UInt32)outParams["ReturnValue"] == ReturnCode.Completed)
{
Console.WriteLine(
"{0} state was changed successfully.",
vmName);
}
else
{
Console.WriteLine(
"Change virtual system state failed with error {0}",
outParams["ReturnValue"]);
}
}
public static void Main(string[] args)
{
if (args != null && args.Length != 2)
{
Console.WriteLine("Usage: <application> vmName action");
Console.WriteLine("action: start|stop");
return;
}
RequestStateChange(args[0], args[1]);
}
}
}
Nell'esempio di Visual Basic Scripting Edition (VBScript) seguente viene avviata o disabilitata una macchina virtuale.
Importante
Per funzionare correttamente, il codice seguente deve essere eseguito nel server host della macchina virtuale e deve essere eseguito con privilegi di amministratore.
dim objWMIService
dim fileSystem
const JobStarting = 3
const JobRunning = 4
const JobCompleted = 7
const wmiStarted = 4096
const Enabled = 2
const Disabled = 3
Main()
'-----------------------------------------------------------------
' Main routine
'-----------------------------------------------------------------
Sub Main()
set fileSystem = Wscript.CreateObject("Scripting.FileSystemObject")
strComputer = "."
set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\virtualization\v2")
set objArgs = WScript.Arguments
if WScript.Arguments.Count = 2 then
vmName= objArgs.Unnamed.Item(0)
action = objArgs.Unnamed.Item(1)
else
WScript.Echo "usage: cscript StartVM.vbs vmName start|stop"
WScript.Quit
end if
set computerSystem = GetComputerSystem(vmName)
if RequestStateChange(computerSystem, action) then
WriteLog "Done"
WScript.Quit(0)
else
WriteLog "RequestStateChange failed"
WScript.Quit(1)
end if
End Sub
'-----------------------------------------------------------------
' Retrieve Msvm_VirtualComputerSystem from base on its ElementName
'
'-----------------------------------------------------------------
Function GetComputerSystem(vmElementName)
On Error Resume Next
query = Format1("select * from Msvm_ComputerSystem where ElementName = '{0}'", vmElementName)
set GetComputerSystem = objWMIService.ExecQuery(query).ItemIndex(0)
if (Err.Number <> 0) then
WriteLog Format1("Err.Number: {0}", Err.Number)
WriteLog Format1("Err.Description:{0}",Err.Description)
WScript.Quit(1)
end if
End Function
'-----------------------------------------------------------------
' Turn on a virtual machine
'-----------------------------------------------------------------
Function RequestStateChange(computerSystem, action)
WriteLog Format2("RequestStateChange({0}, {1})", computerSystem.ElementName, action)
RequestStateChange = false
set objInParam = computerSystem.Methods_("RequestStateChange").InParameters.SpawnInstance_()
if action = "start" then
objInParam.RequestedState = Enabled
else
objInParam.RequestedState = Disabled
end if
set objOutParams = computerSystem.ExecMethod_("RequestStateChange", objInParam)
if (WMIMethodStarted(objOutParams)) then
if (WMIJobCompleted(objOutParams)) then
WriteLog Format1("VM {0} was started successfully", computerSystem.ElementName)
RequestStateChange = true
end if
end if
End Function
'-----------------------------------------------------------------
' Handle wmi return values
'-----------------------------------------------------------------
Function WMIMethodStarted(outParam)
WMIMethodStarted = false
if Not IsNull(outParam) then
wmiStatus = outParam.ReturnValue
if wmiStatus = wmiStarted then
WMIMethodStarted = true
end if
end if
End Function
'-----------------------------------------------------------------
' Handle wmi Job object
'-----------------------------------------------------------------
Function WMIJobCompleted(outParam)
dim WMIJob
set WMIJob = objWMIService.Get(outParam.Job)
WMIJobCompleted = true
jobState = WMIJob.JobState
while jobState = JobRunning or jobState = JobStarting
WScript.Sleep(1000)
set WMIJob = objWMIService.Get(outParam.Job)
jobState = WMIJob.JobState
wend
if (jobState <> JobCompleted) then
WriteLog Format1("ErrorDescription:{0}", WMIJob.ErrorDescription)
WMIJobCompleted = false
end if
End Function
'-----------------------------------------------------------------
' Create the console log files.
'-----------------------------------------------------------------
Sub WriteLog(line)
dim fileStream
set fileStream = fileSystem.OpenTextFile(".\StartVM.log", 8, true)
WScript.Echo line
fileStream.WriteLine line
fileStream.Close
End Sub
'------------------------------------------------------------------------------
' The string formatting functions to avoid string concatenation.
'------------------------------------------------------------------------------
Function Format2(myString, arg0, arg1)
Format2 = Format1(myString, arg0)
Format2 = Replace(Format2, "{1}", arg1)
End Function
'------------------------------------------------------------------------------
' The string formatting functions to avoid string concatenation.
'------------------------------------------------------------------------------
Function Format1(myString, arg0)
Format1 = Replace(myString, "{0}", arg0)
End Function
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato |
Windows 8 [solo app desktop] |
Server minimo supportato |
Windows Server 2012 [solo app desktop] |
Spazio dei nomi |
Root\Virtualization\V2 |
MOF |
|
DLL |
|