0

我正在尝试使用 C# 的 System.Management API 以编程方式启动 Hyper-V VM。我在创建和配置 VM 方面取得了巨大成功,但事实证明,启动 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?!?");
}

我不知道我在这里做错了什么,或者为什么我会得到这个未记录的返回值。

4

2 回答 2

1

我建议阅读下面的链接,因为我在尝试从 c# 启动 hyper-v 时发现这很有帮助

http://msdn.microsoft.com/en-us/library/cc723874(v=vs.85).aspx

于 2012-11-09T08:49:35.693 回答
0

这个问题有点老了,但我遇到了同样的问题并找到了解决方案。

作为参考,MSDN 中 WMIv1 的文章命名为 cc______,而 W​​MIv2 的文章命名为 hh______

WMIv1 WMIv2

出现此错误的原因是因为我通过代码创建了我的 VM,并且默认情况下 Msvm_ComputerSystem 的 AvailableRequestedStates 为空值。随后,当调用 RequestStateChange 时,它​​返回一个 1,这是未记录的。

要解决此问题,请在调用 RequestStateChange 之前使用所有可用状态填充 Msvm_ComputerSystem:

UInt16[] availableRequestedStates = { 2, 3, 4, 6, 7, 8, 9, 10, 11 };
compSystem["AvailableRequestedStates"] = availableRequestedStates;
compSystem.Put();

ManagementBaseObject inParams = compSystem.GetMethodParameters("RequestStateChange");
inParams["RequestedState"] = 2;
ManagementBaseObject result = compSystem.InvokeMethod("RequestStateChange", inParams, null);
于 2016-02-08T21:04:42.017 回答