2012-10-19 3 views
1

Je tente d'écrire une machine virtuelle de contrôle sur un serveur HyperV en utilisant Python. Je commence par la connexion au serveur le serveur HyperV fonctionne sur:Contrôle des machines virtuelles Hyper-V avec Python

connection = wmi.connect_server(server="servername", namespace=r"root\virtualization", user=r"username", password=r"password") 
wmiServerConnection = wmi.WMI(wmi=connection) 

Cela me donne un objet wmi pour cette connexion.

pour arrêter et démarrer une machine virtuelle, je peux simplement utiliser:

#get the wmi object representing the VM 
vmSystem = wmiServerConnection.Msvm_ComputerSystem(ElementName="VmName") 
#send change request to vm 
vmSystem[0].RequestStateChange(3) 

Mais avant de commencer une machine virtuelle que je veux appliquer un certain instantané. La classe Msvm_VirtualSystemManagementService fournit une méthode - ApplyVirtualSystemSnapshot/ApplyVirtualSystemSnapshotEx - pour cela. Il a besoin du SnapshotSettingData comme paramètre et j'ai pensé que je pourrais l'obtenir en utilisant la méthode GetSummaryInformation de la même classe. MSDN indique que cette méthode renvoie une classe Msvm_SummaryInformation.

J'appelle cette fonction comme ceci:

#get the wmi class object 
vmManagement = wmiServerConnection.Msvm_VirtualSystemManagementService() 
snapshotInfo = vmManagement[0].GetSummaryInformation([1,107]) 

Cela devrait me donner le nom et les informations de cliché pour toutes les machines virtuelles sur le serveur HyperV. Mais tout ce que j'ai c'est la liste des objets COM.

Lorsque je tente de donner une certaine VM en tant que paramètre obtenu à partir

vmSettings = wmiServerConnection.Msvm_VirtualSystemSettingData(ElementName="VmName") 

comme celui-ci

snapshotInfo = vmManagement[0].GetSummaryInformation([1,107], [vmSettings[0]]) 

il se bloque.

Mes questions:

  1. Pourquoi ne pas obtenir un objet WMI?

  2. Le deuxième paramètre est évidemment faux. MSDN dit qu'il a besoin de CIM_VirtualSystemSettingData REF SettingData[] comme paramètre. L'objet WMI est-il incorrect? Comment puis-je obtenir le bon paramètre?

  3. Comment puis-je récupérer les informations dont j'ai besoin à partir de l'objet COM?

Ou suis-je totalement sur la mauvaise piste?

Merci, Stefanie

Répondre

5

Alors, j'ai finalement trouvé la solution. Il était beaucoup plus facile que je pensais, mais peu importe:

1.Branchez à votre serveur et obtenir le WMI objet:

connection = wmi.connect_server(server=serverName, namespace=r"root\virtualization", user=username, password=password) 
wmiServerConnection = wmi.WMI(wmi=connection) 

2.Get l'objet système et l'objet de service de gestion:

#get object representing VM 
vmSystem = wmiServerConnection.Msvm_ComputerSystem(ElementName=VmName) 
#get object responsible for VM 
vmManagement = wmiServerConnection.Msvm_VirtualSystemManagementService() 

3.Get les objets associés à la machine virtuelle:

#get objects the VM contains 
    vmObjects = vmSystem[0].associators(wmi_result_class="Msvm_VirtualSystemSettingData ") 

4.Appliquer le cliché que vous voulez:

for singleVmObject in vmObjects:  
    if(singleVmObject.SettingType == 5 and singleVmObject.ElementName == snapshotName): 
     retVal = vmManagement[0].ApplyVirtualSystemSnapshotEx(vmSystem[0].path(), singleVmObject.path()) 

documents complémentaires peuvent être trouvés ici:

http://timgolden.me.uk/python/wmi/wmi.html

http://msdn.microsoft.com/en-us/library/cc136986(v=vs.85).aspx

Questions connexes