2017-04-19 1 views
0

Puis-je essayer ceci:Cant appliquer snapshot sur HyperV par 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) 

j'obtiens l'erreur: wmi.x_wmi x_wmi: Erreur inattendue COM (-2147352567, 'Exception produit', (0, ' SWbemProperty ',' Type mismatch ', None, 0, -2147217403), None)

Répondre

0

Ceci est dans VB.Net (pas Python), mais j'espère que cela vous poussera dans la bonne direction. Cet exemple applique l'instantané le plus récent, mais pour appliquer un instantané spécifique, il suffit d'obtenir l'occurrence Msvm_VirtualSystemSettingData de l'instantané que vous souhaitez appliquer et d'utiliser cette instance à la place de '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