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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage