Compartir a través de


Método RequestStateChange de la clase Msvm_ComputerSystem

Solicita que el estado de la máquina virtual se cambie al valor especificado. Invocar el método RequestStateChange varias veces podría dar lugar a que las solicitudes anteriores se sobrescriban o pierdan. Este método solo se admite para instancias de la clase Msvm_ComputerSystem que representan una máquina virtual.

Mientras el cambio de estado está en curso, la propiedad RequestedState se cambia al valor del parámetro RequestedState .

Sintaxis

uint32 RequestStateChange(
  [in]  uint16              RequestedState,
  [out] CIM_ConcreteJob REF Job,
  [in]  datetime            TimeoutPeriod
);

Parámetros

RequestedState [in]

Tipo: uint16

El nuevo estado. Los valores mayores que 32767 son valores propuestos por DMTF y están sujetos a cambios.

Estos son los valores posibles:

Otros (1)

Corresponde a CIM_EnabledLogicalElement.EnabledState = Otros.

Habilitado (2)

Corresponde a CIM_EnabledLogicalElement.EnabledState = Enabled.

Deshabilitado (3)

Corresponde a CIM_EnabledLogicalElement.EnabledState = Disabled.

Apagar (4)

Válido solo en la versión 1 (V1) de Hyper-V. La máquina virtual se apaga a través del servicio de apagado. Corresponde a CIM_EnabledLogicalElement.EnabledState = ShuttingDown.

Sin conexión (6)

Corresponde a CIM_EnabledLogicalElement.EnabledState = Habilitado pero sin conexión.

Prueba (7)

Aplazar (8)

Quiesce (9)

Corresponde a CIM_EnabledLogicalElement.EnabledState = Quiesce, Habilitado pero en pausa.

Reinicio (10)

Transición de estado de Desactivado o Guardado a En ejecución.

Restablecimiento (11)

Restablezca la máquina virtual. Corresponde a CIM_EnabledLogicalElement.EnabledState = Reset.

Guardar (32773)

En la versión 1 (V1) de Hyper-V, corresponde a EnabledStateSaving.

Pausa (32776)

En la versión 1 (V1) de Hyper-V, corresponde a EnabledStatePausing.

Reanudación (32777)

En la versión 1 (V1) de Hyper-V, corresponde a EnabledStateResuming. Transición de estado de Pausa a En ejecución.

FastSaved (32779)

Corresponde a EnabledStateFastSuspend.

FastSaving (32780)

Corresponde a EnabledStateFastSuspending. Transición de estado de Running a FastSaved.

Estos valores representan estados críticos:

RunningCritical (32781)

OffCritical (32782)

DetenerCritical (32783)

SavedCritical (32784)

PausedCritical (32785)

StartingCritical (32786)

ResetCritical (32787)

SavingCritical (32788)

PausingCritical (32789)

ResumingCritical (32790)

FastSavedCritical (32791)

FastSavingCritical (32792)

Trabajo [salida]

Tipo: CIM_ConcreteJob

Referencia opcional a un objeto Msvm_ConcreteJob que se devuelve si la operación se ejecuta de forma asincrónica. Si está presente, la referencia devuelta se puede usar para supervisar el progreso y obtener el resultado del método .

TimeoutPeriod [in]

Tipo: datetime

Este parámetro no se utiliza.

Valor devuelto

Tipo: uint32

Este método devuelve uno de los valores siguientes.

Código o valor devuelto Descripción
Completado sin error
0
Correcto.
Parámetros de método comprobados: transición iniciada
4096
La transición es asincrónica.
Acceso denegado
32769
Acceso denegado.
32 768
32770
32771
32772
32773
32774
Estado no válido para esta operación
32775
No se admite el valor especificado en el parámetro RequestedState .
32776
32777
32778

Observaciones

El acceso a la clase Msvm_ComputerSystem puede estar restringido por el filtrado de UAC. Para obtener más información, consulte Control de cuentas de usuario y WMI.

Ejemplos

En el ejemplo de C# siguiente se inicia o deshabilita una máquina virtual. Las utilidades a las que se hace referencia se pueden encontrar en Utilidades comunes para los ejemplos de virtualización (V2).

Importante

Para funcionar correctamente, el código siguiente debe ejecutarse en el servidor host de la máquina virtual y debe ejecutarse con privilegios de administrador.

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]);
        }

    }
}

El siguiente ejemplo de Visual Basic Scripting Edition (VBScript) inicia o deshabilita una máquina virtual.

Importante

Para funcionar correctamente, el código siguiente debe ejecutarse en el servidor host de la máquina virtual y debe ejecutarse con privilegios de administrador.

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

Requisitos

Requisito Value
Cliente mínimo compatible
Windows 8 [solo aplicaciones de escritorio]
Servidor mínimo compatible
Windows Server 2012 [solo aplicaciones de escritorio]
Espacio de nombres
Root\Virtualization\V2
MOF
WindowsVirtualization.V2.mof
Archivo DLL
Vmms.exe

Consulte también

Msvm_ComputerSystem