HyperV WMI Применить снимок в c# - PullRequest
       47

HyperV WMI Применить снимок в c#

0 голосов
/ 11 февраля 2020

Я хочу применить снимок с WMI и получить сообщение об ошибке «Служба WS-Management не может обработать запрос, неизвестная ошибка: HRESULT 0x8004102f» Это происходит, если параметр установлен неправильно. Поэтому я думаю, что это как-то связано с входным параметром:

uint32 ApplySnapshot(
  [in]  CIM_VirtualSystemSettingData REF Snapshot,
  [out] CIM_ConcreteJob              REF Job
);

Ссылка на описание ApplySnapshot: https://docs.microsoft.com/de-de/windows/win32/hyperv_v2/applysnapshot-msvm-virtualsystemsnapshotservice?redirectedfrom=MSDN#syntax

Мой код для применения снимок:

public async Task ApplySnapshot(PublicServerSnapshotInfo snapshot, PublicServerInfo publicServer)
        {            
            CimSession session = GetCimSession(publicServer.HostName);
            CimInstance ParamSnapshot = session.QueryInstances(@"root\virtualization\v2", "WQL", "SELECT * From CIM_VirtualSystemSettingData WHERE ConfigurationID='" + snapshot.SnapshotID + "'").FirstOrDefault();

            CimMethodParametersCollection cimMethodParameters = new CimMethodParametersCollection();
            cimMethodParameters.Add(CimMethodParameter.Create("Snapshot", ParamSnapshot,CimType.Reference, CimFlags.In));

            CimMethodResult result = session.InvokeMethod(@"root\virtualization\v2", "Msvm_VirtualSystemSnapshotService", "ApplySnapshot", cimMethodParameters);
        }

У меня уже есть некоторый подобный код, когда я хочу запустить и завершить работу виртуальной машины, и она работает.

Мой код для запуска и остановки виртуальная машина: (эта отлично работает)

public async Task RequestStateChange(PublicServerInfo publicServer, string action)
        {
            CimSession session = GetCimSession(publicServer.HostName);
            CimInstance vm = session.QueryInstances(@"root\virtualization\v2", "WQL", "SELECT * FROM Msvm_ComputerSystem WHERE Name='" + publicServer.MachineID + "'").FirstOrDefault();
            CimMethodParametersCollection parameters = new CimMethodParametersCollection();
            if (action.ToLower() == "start")
            {
                parameters.Add(CimMethodParameter.Create("RequestedState", (UInt16)2, CimFlags.In));
            }
            else if (action.ToLower() == "shutdown")
            {
                parameters.Add(CimMethodParameter.Create("RequestedState", (UInt16)4, CimFlags.In));
            }

            CimMethodResult result = session.InvokeMethod(@"root\virtualization\v2", vm, "RequestStateChange", parameters);
        }

Ссылка на RequestsStateChange: https://docs.microsoft.com/en-us/windows/win32/hyperv_v2/requeststatechange-msvm-computersystem

Спасибо за каждый ответ

1 Ответ

0 голосов
/ 12 февраля 2020

Я наконец нашел решение :

public async Task ApplySnapshot(PublicServerSnapshotInfo snapshot, PublicServerInfo publicServer)
        {            
            CimSession session = GetCimSession(publicServer.HostName);
            CimInstance ParamSnapshot = session.QueryInstances(hvNamespace, "WQL", "SELECT * From CIM_VirtualSystemSettingData WHERE ConfigurationID='" + snapshot.SnapshotID + "'").FirstOrDefault();
            var SnapshotService = session.EnumerateInstances(hvNamespace, "Msvm_VirtualSystemSnapshotService").First();

            CimMethodParametersCollection cimMethodParameters = new CimMethodParametersCollection {
                CimMethodParameter.Create("Snapshot", ParamSnapshot, CimType.Reference, CimFlags.In)
            };

            CimMethodResult result = session.InvokeMethod(hvNamespace, SnapshotService, "ApplySnapshot", cimMethodParameters);

        }

Это работает для меня.

...