【问题标题】:Create Snapshot with WMI in C# with help of the microsoft.management.infrastructure namespace在 microsoft.management.infrastructure 命名空间的帮助下,在 C# 中使用 WMI 创建快照
【发布时间】:2019-03-05 15:25:10
【问题描述】:

我正在尝试在 C# 中创建一个方法,在该方法中创建 Hyper-V 中虚拟机的快照。

我正在使用新的 microsoft.management.infrastructure 命名空间,而不是 system.management.instrumentation。

我最大的问题是创建 CIM_VirtualSystemSettingData 对象,我将它作为引用参数传递给调用方法。 我不知道如何设置 InstanceId 属性。因为我总是收到错误消息:无法处理 Targetobject 因为键属性为空(从德语翻译)。 当我手动设置它时(我可能不应该这样做)我得到一个错误代码:

WBEM_E_INVALID_METHOD_PARAMETERS
2147749935 (0x8004102F)
Parameters provided for the method are not valid.

我也不确定 virtualsystemsetting 对象是否是唯一的问题。但是错误信息太模糊了,我不知道从哪里开始调试。

到目前为止我的代码:

 // id is the Virtual machine i want the snapshot to be made of
 public String CreateSnapshot(string id) { 

        string cimNamespace = @"root\virtualization\v2";
        string cimMethodName = "CreateSnapshot";
        string cimClassName = "Msvm_VirtualSystemSnapshotService";

        CimInstance QuellComputer = Session.QueryInstances(@"ROOT\virtualization\v2", "WQL", $"SELECT * FROM CIM_Computersystem").Skip(2).FirstOrDefault();// WHERE Name={id}

        CimClass systemSettingClass = Session.GetClass(cimNamespace, "CIM_VirtualSystemSettingData");
        CimInstance systemSettingInstance = new CimInstance(systemSettingClass);            
        systemSettingInstance.CimInstanceProperties["SnapshotDataRoot"].Value = @"C:\Users\SnapshotsTemp";                        
        systemSettingInstance.CimInstanceProperties["ElementName"].Value = @"SnapshotNo1";
        systemSettingInstance.CimInstanceProperties["VirtualSystemType"].Value = 5;          

        CimMethodParametersCollection cimMethodParameters = new CimMethodParametersCollection();
        CimMethodParameter cimMethodParameter1 = CimMethodParameter.Create("AffectedSystem", QuellComputer, CimType.Reference, CimFlags.In);
        CimMethodParameter cimMethodParameter2 = CimMethodParameter.Create("SnapshotSettings", "", CimType.String, CimFlags.In);
        CimMethodParameter cimMethodParameter4 = CimMethodParameter.Create("ResultingSnapshot", generateid, CimType.Reference, CimFlags.In);
        CimMethodParameter cimMethodParameter3 = CimMethodParameter.Create("SnapshotType", 2, CimType.UInt16, CimFlags.In);            
        cimMethodParameters.Add(cimMethodParameter1);
        cimMethodParameters.Add(cimMethodParameter4);
        cimMethodParameters.Add(cimMethodParameter2);
        cimMethodParameters.Add(cimMethodParameter3);

        CimMethodResult result = Session.InvokeMethod(cimNamespace, cimClassName, cimMethodName, cimMethodParameters);
}

这是来自 Microsoft 的 Msvm_VirtualSystemSnapshotService 类的 WMI 方法描述

uint32 CreateSnapshot(
  [in]      CIM_ComputerSystem           REF AffectedSystem,
  [in]      string                           SnapshotSettings,
  [in]      uint16                           SnapshotType,
  [in, out] CIM_VirtualSystemSettingData REF ResultingSnapshot,
  [out]     CIM_ConcreteJob              REF Job

提前致谢。

【问题讨论】:

    标签: c# wmi hyper-v


    【解决方案1】:

    您需要创建一个适当类型的空 CimInstance,并使用 CimInstanceProperties 集合的 Add 方法添加所需的关键属性。然后使用 CimSession 类的 GetInstance 方法检索填充了所有数据的完整 CimInstance。每个类都在线记录了所需的关键属性,但我遇到了文档不完整的情况。为避免让自动生成的文档分散您对亲眼所见内容的注意力,我建议查看您所定位的 WMI 类实例上的 __RELPATH 属性。这将提供键值对。

    在 PowerShell 中:

    gwmi -Namespace root\virtualization\v2 -Class Msvm_VirtualSystemSnapshotService | select __relpath | fl
    

    得到...

    __RELPATH : Msvm_VirtualSystemSnapshotService.CreationClassName="Msvm_VirtualSystemSnapsho
                tService",Name="vssnapsvc",SystemCreationClassName="Msvm_ComputerSystem",Syste
                mName="MYHOSTNAME"
    

    这意味着在 C# 中,您需要这样做:

    // Using Microsoft.Management.Infrastructure
    private const string _namespace = @"root\virtualization\v2";
    private const string _hypervHost = "MYHOSTNAME";
    
    using (var cimSession = CimSession.Create(_hyperVHost))
    {
        // Create generic instance with no instance data
        var keyInstance = new CimInstance("Msvm_VirtualSystemSnapshotService");
        // Attach key CimProperties
        keyInstance.CimInstanceProperties.Add(CimProperty.Create("CreationClassName", "Msvm_VirtualSystemSnapshotService", CimFlags.Key));
        keyInstance.CimInstanceProperties.Add(CimProperty.Create("SystemCreationClassName", "Msvm_ComputerSystem", CimFlags.Key));
        keyInstance.CimInstanceProperties.Add(CimProperty.Create("Name", "vssnapsvc", CimFlags.Key));
        keyInstance.CimInstanceProperties.Add(CimProperty.Create("SystemName", _hyperVHost, CimFlags.Key));
        // Retrieve the object
        snapShotService = cimSession.GetInstance(_namespace, keyInstance);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多