Condividi tramite


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
Completata senza errori
0
Esito positivo.
Parametri del metodo controllati - Transizione avviata
4096
La transizione è asincrona.
Accesso negato
32769
Accesso negato.
32768
32770
32771
32772
32773
32774
Stato non valido per questa operazione
32775
Il valore specificato nel parametro RequestedState non è supportato.
32776
32777
32778

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
WindowsVirtualization.V2.mof
DLL
Vmms.exe

Vedi anche

Msvm_ComputerSystem