Я играю с интерфейсом Hyper-V WMI и пытаюсь создать моментальный снимок одной из моих локальных виртуальных машин Hyper-V, используя С#. Я пытаюсь сделать это БЕЗ использования System.Management. Вместо этого я использую Microsoft.Management.Infrastructure. Причина этого в том, что он поддерживается в .NET Core. Кроме того, System.Management.Infrastructure кажется предполагаемой заменой System.Management.
У меня возникли проблемы с передачей правильных параметров правильному параметру метода CreateSnapshot в классе CIM_VirtualSystemSnapshotService.
Это задокументировано здесь: https://docs.microsoft.com/en-us/windows/desktop/hyperv_v2/cim-virtualsystemsnapshotservice-createsnapshot
Перечислены входные параметры:
uint32 CreateSnapshot( [in] CIM_ComputerSystem REF AffectedSystem, [in] string
SnapshotSettings, [in] uint16
SnapshotType, [in, out] CIM_VirtualSystemSettingData REF ResultingSnapshot, [out] CIM_ConcreteJob REF Job );
Но это не указывает, какие из них являются обязательными, могут ли передаваться значения NULL и т. д.
Метод С#, который я пытаюсь использовать:
public static void CreateSnapshot()
{
const string hvNamespace = @"root\virtualization\v2";
var sessionOptions = new DComSessionOptions
{
Timeout = TimeSpan.FromSeconds(30)
};
var cimSession = CimSession.Create("localhost", sessionOptions);
var vmSnapshotService = new CimInstance(cimSession.GetClass(hvNamespace, "CIM_VirtualSystemSnapshotService"));
// CimInstance of CIM_ComputerSystem. QueryInstances returns Msvm_ComputerSystem
var vm = cimSession.QueryInstances(hvNamespace, "WQL", $"SELECT * FROM CIM_ComputerSystem WHERE ElementName = 'Android'").First();
var snapshotSettingDataClass = cimSession.GetClass(hvNamespace, "CIM_VirtualSystemSettingData");
var snapshotSettingData = new CimInstance(snapshotSettingDataClass);
var snapshotParameters = new CimMethodParametersCollection();
snapshotParameters.Add(CimMethodParameter.Create("AffectedSystem", vm, CimFlags.In));
snapshotParameters.Add(CimMethodParameter.Create("SnapshotSettings", "", CimFlags.In));
snapshotParameters.Add(CimMethodParameter.Create("SnapshotType", 2, CimFlags.In));
snapshotParameters.Add(CimMethodParameter.Create("ResultingSnapshot", snapshotSettingData, CimFlags.Out));
cimSession.InvokeMethod(namespaceName: hvNamespace, instance: vmSnapshotService, methodName: "CreateSnapshot", methodParameters: snapshotParameters);
//Microsoft.Management.Infrastructure.CimException: 'Invalid parameter '
Console.WriteLine($"Snapshot created!");
}
Выдает ошибку "Неверный параметр". Вряд ли конкретно.
Я попытался перестроить это в Powershell:
$session = New-CimSession
$hvNamespace = "root\virtualization\v2"
$snapshotservice = Get-CimClass -ClassName "CIM_VirtualSystemSnapshotService" -Namespace $hvNamespace
$vm = Get-CimInstance -Namespace $hvNamespace -Query "SELECT * FROM CIM_ComputerSystem WHERE ElementName = 'Android'" -QueryDialect WQL
Invoke-CimMethod -ClassName "Msvm_VirtualSystemSnapshotService" -MethodName "CreateSnapshot" -Namespace $hvNamespace -Arguments @{ "AffectedSystem" = $vm ; "SnapshotSettings" = "" ; "SnapshotType" = 2 }
Это дает эту ошибку:
Invoke-CimMethod: несоответствие типов для параметра «AffectedSystem» В строке: 1 символ: 1 + Invoke-CimMethod -ClassName «Msvm_VirtualSystemSnapshotService» -Meth ... + ~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~ + CategoryInfo: InvalidType: (root\virtualiza...SnapshotService: String) [Invoke-CimMethod], CimException + FullyQualifiedErrorId: HRESULT 0x80041005, Microsoft.Management.Infrast
ructure.CimCmdlets.InvokeCimMethodCommand
Итак, похоже, что метод ожидает CIM_ComputerSystem. Однако я передаю ему Msvm_ComputerSystem. С C# это «просто» еще один CIIMstance. Итак, я не могу переходить из одного класса в другой, как мог бы с «обычными» классами.
Есть ли способ «преобразовать» Msvm_ComputerSystem в CIM_ComputerSystem? Или я гоняюсь за большой отвлекающей сельдью?