Создайте снимок с помощью WMI в C # с помощью пространства имен microsoft.management.infrastructure - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь создать метод в C #, в котором создается снимок виртуальной машины в Hyper-V.

Я использую новое пространство имен microsoft.management.infrastructure вместо system.management.instrumentation.

Моя самая большая проблема - создать объект CIM_VirtualSystemSettingData, который я передаю методу invoke в качестве ссылочного параметра. Я не знаю, как установить атрибут InstanceId. Так как я всегда получаю сообщение об ошибке: не могу обработать Targetobject, потому что атрибут ключа имеет значение null (перевод с немецкого). Когда я устанавливаю его вручную (что, вероятно, не следует делать), я получаю код ошибки:

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

Я также не уверен, является ли объект настройки виртуальной системы единственной проблемой. Но сообщение об ошибке настолько расплывчато, что я не знаю, с чего еще начать отладку.

мой код до сих пор:

 // 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);
}

Это описание метода WMI от Microsoft для класса Msvm_VirtualSystemSnapshotService

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

Заранее спасибо.

1 Ответ

1 голос
/ 09 апреля 2019

Вам потребуется создать пустой CimInstance соответствующего типа и использовать метод Add коллекции CimInstanceProperties, чтобы добавить необходимые свойства ключа.Затем используйте метод GetInstance класса CimSession, чтобы получить полный CimInstance со всеми его заполненными данными.Необходимые ключевые свойства задокументированы онлайн для каждого класса, но я сталкивался с ситуациями, когда документация неполная.Чтобы автоматически создаваемая документация не отвлекала вас от того, что вы видите своими глазами, я рекомендую просмотреть свойство __RELPATH для экземпляра класса WMI, на который вы нацеливаетесь.Это обеспечит пары ключ-значение.

В 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);
}
...