Не удается применить снимок на HyperV с помощью Msvm_VirtualSystemSnapshotService

Тогда я пробую это:

wmiServerConnection = wmi.WMI(namespace=r'root\virtualization\v2')
vmSnapManagement = wmiServerConnection.Msvm_VirtualSystemSnapshotService()[0]
vmSystem = wmiServerConnection.Msvm_ComputerSystem(ElementName=r'wmname')[0]
vmObjects = vmSystem.associators(wmi_result_class='Msvm_VirtualSystemSettingData')

for singleVmObject in vmObjects:
    if singleVmObject.ElementName == r'snapshotname':
        job = vmSnapManagement.ApplySnapshot(singleVmObject)

я получаю сообщение об ошибке: wmi.x_wmi x_wmi: непредвиденная ошибка COM (-2147352567, «Произошло исключение», (0, «SWbemProperty», «Несоответствие типов», «Нет», «0», «-2147217403», «Нет»)


person prom1se    schedule 19.04.2017    source источник


Ответы (1)


Это в VB.Net (не Python), но, надеюсь, это подтолкнет вас в правильном направлении. В этом примере применяется самый последний моментальный снимок, но для применения определенного снимка просто получите экземпляр Msvm_VirtualSystemSettingData снимка, который вы хотите применить, и используйте этот экземпляр вместо «lastSnapshot».

Imports System.Management

Public Class VirtualSystemSnapshot
    Public Shared Function Revert(vmElementName As String)
        Dim scope As New ManagementScope("\\" & ServerName & "\Root\Virtualization\V2", Options)
        Using virtualMachine As ManagementObject = WmiUtilities.GetVirtualMachine(vmElementName, scope)
            Using virtualSystemSettingData As ManagementObject = WmiUtilities.GetVirtualSystemSettingData(scope, virtualMachine)
                Using virtualSystemSnapshotService As ManagementObject = WmiUtilities.GetVirtualSystemSnapshotService(scope)
                    Using lastSnapshot As ManagementObject = WmiUtilities.GetFirstObjectFromCollection(
                            virtualSystemSettingData.GetRelated("Msvm_VirtualSystemSettingData", "Msvm_ParentChildSettingData", Nothing, Nothing, Nothing, Nothing, False, Nothing))
                        Using inParams As ManagementBaseObject = virtualSystemSnapshotService.GetMethodParameters("ApplySnapshot")
                            inParams("Snapshot") = lastSnapshot

                            ' In order to apply a snapshot, the virtual machine must first be saved
                            RequestStateChange.Main(vm, RequestedState.Save)

                            Using outParams As ManagementBaseObject = virtualSystemSnapshotService.InvokeMethod("ApplySnapshot", inParams, Nothing)
                                WmiUtilities.ValidateOutput(outParams, scope)

                                ' Now that the snapshot has been applied, start the VM back up
                                RequestStateChange.Main(vm, RequestedState.Start)
                            End Using
                        End Using
                    End Using
                End Using
            End Using
        End Using
    End Function
End Class
person Mako-Wish    schedule 12.05.2017