Steuern Sie Hyper-V-VMs mit Python
Ich versuche, eine Steuerung VMs auf einem HyperV-Server mit Python zu schreiben. Ich beginne mit der Verbindung zu dem Server, auf dem der HyperV-Server ausgeführt wird:
connection = wmi.connect_server(server="servername", namespace=r"root\virtualization", user=r"username", password=r"password")
wmiServerConnection = wmi.WMI(wmi=connection)
Das gibt mir einewmi
Objekt für diese Verbindung.
Zum Stoppen und Starten einer VM kann ich einfach Folgendes verwenden:
#get the wmi object representing the VM
vmSystem = wmiServerConnection.Msvm_ComputerSystem(ElementName="VmName")
#send change request to vm
vmSystem[0].RequestStateChange(3)
Aber bevor ich eine VM starte, möchte ich einen bestimmten Schnappschuss anwenden. Die Klasse Msvm_VirtualSystemManagementService stellt eine Methode bereit:ApplyVirtualSystemSnapshot
/ApplyVirtualSystemSnapshotEx
- dafür. Es braucht dieSnapshotSettingData
als Parameter und ich dachte, ich könnte das mit dem bekommenGetSummaryInformation
Methode der gleichen Klasse. MSDN sagt, dass diese Methode a zurückgibtMsvm_SummaryInformation Klasse.
Ich nenne diese Funktion so:
#get the wmi class object
vmManagement = wmiServerConnection.Msvm_VirtualSystemManagementService()
snapshotInfo = vmManagement[0].GetSummaryInformation([1,107])
Dies sollte mir den Namen und die Snapshot-Informationen für alle VMs auf dem HyperV-Server geben. Aber alles, was ich bekomme, ist eine Liste von COM-Objekten.
Wenn ich versuche, eine bestimmte VM als Parameter zu geben, bekomme ich von
vmSettings = wmiServerConnection.Msvm_VirtualSystemSettingData(ElementName="VmName")
so was
snapshotInfo = vmManagement[0].GetSummaryInformation([1,107], [vmSettings[0]])
es stürzt ab.
Meine Fragen:
Warum bekomme ich kein WMI-Objekt?
Der zweite Parameter ist offensichtlich falsch. MSDN sagt, dass es benötigtCIM_VirtualSystemSettingData REF SettingData[]
als Parameter. Ist das WMI-Objekt das falsche? Wie bekomme ich den richtigen Parameter?
Wie kann ich die benötigten Informationen aus dem COM-Objekt abrufen?
Oder bin ich total auf dem falschen Weg?
Danke, Stefanie