我正在尝试使用WMI从Windows 8系统上的导出加载Hyper-V系统定义。到目前为止,我有这个:
var managementScope = new ManagementScope(@"root\virtualization\v2");
var invokeMethodOptions = new InvokeMethodOptions();
invokeMethodOptions.Timeout = new TimeSpan(0, 0, 10);
using (var managementService = WmiUtilities.GetVirtualMachineManagementService(managementScope)) {
var inParameters = managementService.GetMethodParameters(@"ImportSystemDefinition");
inParameters["SystemDefinitionFile"] = filePath;
inParameters["SnapshotFolder"] = snapshotPath;
inParameters["GenerateNewSystemIdentifier"] = false;
ManagementBaseObject outParameters = managementService.InvokeMethod(@"ImportSystemDefinition", inParameters, invokeMethodOptions);
foreach (var value in outParameters.Properties) {
Console.WriteLine("{0}: {1}", value.Name, value.Value);
}
return (ManagementBaseObject) outParameters["ImportedSystem"];
}
当我运行此命令时,返回代码为4096
,表示作业已成功启动,并且我返回作业值 - 例如:
ImportedSystem:
Job: \\COREI7\root\virtualization\v2:Msvm_ConcreteJob.InstanceID="B1DC90B6-14A1-42C0-924E-225660E6EC98"
ReturnValue: 4096
我有以下问题:
如果这些问题太基础我道歉 - 我只是没有找到答案的运气。
谢谢!
[编辑]我正在考虑添加一个ManagementOperationObserver
告诉我什么时候完成,虽然我不清楚为什么我需要强制它异步,无论如何它似乎都是这样做。
答案 0 :(得分:1)
好的,所以我解决了这个问题。
首先,作业正在完成并出现错误。 4096
告诉我它已经开始但由于失败而没有完成。我仍然不知道如何从上面的代码快速解决这个问题,但是在PowerShell中进行实验清楚地表明发生了什么。
其次,我完全修改了代码。 Visual Studio可以从服务器资源管理器生成强类型的WMI类:http://msdn.microsoft.com/en-us/library/ms257357.aspx。执行此操作两次以获取ROOT.virtualization.v2.Msvm_PlannedComputerSystem.cs
和ROOT.virtualization.v2.Msvm_VirtualSystemManagementService.cs
可让我执行以下代码,这更清晰:
var managementScope = new ManagementScope(@"root\virtualization\v2");
using (var managementService = new VirtualSystemManagementService(WmiUtilities.GetVirtualMachineManagementService(managementScope))) {
PlannedComputerSystem importedSystem;
ConcreteJob job;
var importResults = managementService.ImportSystemDefinition(
GenerateNewSystemIdentifier: false,
SystemDefinitionFile: filePath,
SnapshotFolder: snapshotPath,
ImportedSystem: out importedSystem,
Job: out job
);
if (importResults != 0) {
MessageBox.Show(String.Format("Error on import of {0}: {1}", filePath, job.ErrorDescription));
}
}
请注意,必须稍微更改生成的代码,以便从ImportSystemDefinition
调用中获取更好的强类型对象:
ImportedSystem = null;
Job = null;
if (outParams == null) {
return 0;
} else {
if (outParams.Properties["ImportedSystem"].Value != null) {
ImportedSystem = new PlannedComputerSystem(new ManagementObject(outParams.Properties["ImportedSystem"].Value.ToString()));
}
if (outParams.Properties["Job"].Value != null) {
Job = new ConcreteJob(new ManagementObject(outParams.Properties["Job"].Value.ToString;
}
return Convert.ToUInt32(outParams.Properties["ReturnValue"].Value);
}