0

我正在尝试使用 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

我有以下问题:

  1. 是否可以同步执行此方法?我怎么能说呢?http://msdn.microsoft.com/en-us/library/hh850082(v=vs.85).aspx上的 MSDN 文档表明这是可能的(“如果操作同步完成”),但我不知道如何. 我的猜测是这是一个关于如何同步执行方法的一般 WMI 问题,我似乎找不到如何去做。
  2. 如果我被迫做异步,我如何看那个特定的工作?我发现的一切都是关于观看流程事件或事件日志事件,但它们似乎都是我所针对的特定 WQL 事件,而不是一般的工作事件。

如果这些问题太基本,我深表歉意——我只是没有运气找到答案。

谢谢!

[编辑] 我正在考虑添加一个ManagementOperationObserver来告诉我它什么时候完成,虽然目前还不清楚为什么我需要强制它异步时它似乎正在这样做。

4

1 回答 1

1

好的,所以我解决了这个问题。

首先,作业完成时出现错误。4096告诉我它已经开始但没有完成,因为它失败了。我仍然不知道如何从上面的代码中快速解决这个问题,但在 PowerShell 中进行实验后,我清楚地知道这就是正在发生的事情。

其次,我彻底修改了代码。可以让 Visual Studio 从服务器资源管理器生成强类型 WMI 类:http: //msdn.microsoft.com/en-us/library/ms257357.aspx。这样做两次以获得ROOT.virtualization.v2.Msvm_PlannedComputerSystem.csROOT.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);
}
于 2012-12-18T19:35:25.503 回答