0

C# の System.Management API を使用して、Hyper-V VM をプログラムで起動しようとしています。VM の作成と構成には大きな成功を収めましたが、VM の起動は難しいことがわかりました。

ヘルパー メソッドを使用して WQL クエリを実行し、Msvm_ComputerSystem オブジェクトを取得します。

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

この質問は少し古いですが、同じ問題に遭遇し、解決策を見つけました。

参考までに、WMIv1 に関する MSDN の記事は cc______ という名前で、WMIv2 に関する記事は hh______ という名前です。

WMIv1 WMIv2

このエラーが発生した理由は、コードを使用して VM を作成し、既定で Msvm_ComputerSystem の AvailableRequestedStates に null 値が設定されていたためです。その後、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 に答える