我正在尝试使用C#的System.Management API以编程方式启动Hyper-V VM。我在创建和配置虚拟机方面取得了巨大的成功,但启动虚拟机已经证明是难以捉摸的。
我得到一个Msvm_ComputerSystem对象,使用辅助方法执行WQL查询:
ManagementObject compSys = WMIHelpers.GetMsvm_ComputerSystem(scope, vmName);
更改VM状态的方法是(据称)“RequestStateChange”,我可以获取参数对象并设置它们:
ManagementBaseObject callParams = compSys.GetMethodParameters("RequestStateChange");
callParams["RequestedState"] = WMIHelpers.RequestedState.Enabled;
但是当我调用该方法时,我的返回值为1,这是未记录的:
ManagementBaseObject result = vsServ.InvokeMethod("RequestStateChange", callParams, null);
if(result["ReturnValue"] == 1)
{
System.Console.WriteLine("WTF?!?");
}
我不知道我在这里做错了什么,或者为什么我得到这个无证件的返回值。
答案 0 :(得分:1)
我建议您阅读下面的链接,因为我在尝试从c#启动hyper-v时发现这有很大的帮助
http://msdn.microsoft.com/en-us/library/cc723874(v=vs.85).aspx
答案 1 :(得分:0)
这个问题有点陈旧,但我遇到了同样的问题并找到了解决方案。
作为参考,MSDN中WMIv1的文章命名为cc______,而WMIv2的文章命名为hh______
这个错误的原因是因为我通过代码创建了我的VM,默认情况下,Msvm_ComputerSystem对AvailableRequestedStates有一个空值。随后,当调用RequestStateChange时,它返回一个未记录的1。
要解决此问题,请在调用RequestStateChange之前使用所有可用状态填充Msvm_ComputerSystem:
console.log("'"+files.join("', '")+"'");