// Gets the Msvm_ComputerSystem instance that matches the requested virtual machine name. private ManagementObject GetVirtualMachine(ManagementScope scope, string name) { string query = $"SELECT * FROM Msvm_ComputerSystem WHERE ElementName = \"{name}\""; var data = WmiRoutines.WmiQuery(scope, query); var result = WmiRoutines.GetFirstObjectFromCollection(data); if (result == null) { throw new Exception($"Could not find virtual machine with name \"{name}\""); } return(result); }
public bool ExportVirtualSystem(VirtualMachine virtualMachine, SnapshotExport snapshotExport) { virtualMachine.ExportPercentComplete = 0; bool exportSuccess = true; var scope = WmiRoutines.GetScope(WmiRoutines.NAMESPACE_HYPER_V); using (ManagementObject virtualSystemService = WmiRoutines.GetServiceObject(scope, "Msvm_VirtualSystemManagementService")) using (ManagementObject srv = GetVirtualMachine(scope, virtualMachine.Name)) using (ManagementBaseObject inParams = virtualSystemService.GetMethodParameters("ExportSystemDefinition")) { if (!Directory.Exists(virtualMachine.ExportPath)) { Directory.CreateDirectory(virtualMachine.ExportPath); } ManagementPath settingPath = new ManagementPath("Msvm_VirtualSystemExportSettingData"); using (ManagementClass exportSettingDataClass = new ManagementClass(scope, settingPath, null)) using (ManagementObject exportSettingData = exportSettingDataClass.CreateInstance()) { exportSettingData["CopySnapshotConfiguration"] = snapshotExport; exportSettingData["CopyVmRuntimeInformation"] = true; exportSettingData["CopyVmStorage"] = true; exportSettingData["CreateVmExportSubdirectory"] = true; string settingData = exportSettingData.GetText(TextFormat.CimDtd20); inParams["ComputerSystem"] = srv.Path.Path; inParams["ExportDirectory"] = virtualMachine.ExportPath; inParams["ExportSettingData"] = settingData; } using (ManagementBaseObject outParams = virtualSystemService.InvokeMethod("ExportSystemDefinition", inParams, null)) { exportSuccess = ValidateOutput(virtualMachine, outParams, scope, false, true); } } virtualMachine.ExportPercentComplete = 100; return(exportSuccess); }