Автоматизация vmware; Vix API и C#

Порядка недели назад мне потребовалось управлять виртуальной машиной vmware программным путем, желательно из C#. Решение было найдено на CodeProject.

Автор реализовал Vix API на C# и выпустил DLL. Я кратко расскажу об этом проекте на русском языке.

У Vmware имеется мощный API, который позволяет управлять состоянием виртуальной машины, а также запускать внутри нее сторонние приложения, копировать файлы с хоста на гостевую систему и обратно.

API состоит из 2х частей:

  • VMWare Virtual Infrastructure SDK —  набор инструментов и API который позволяет управлять инфраструктурой VMWare. Этот набор инструментов содержит управляемые обертки для SOAP интерфейса, обеспечивающие развертывание VMWare. Эти инструменты в основном нацелены на управление VMWare ESX или VirtualCenter
  • VMWare VIX API. VIX API позволяет разработчиком писать программы и скрипты, которые автоматизируют операции над виртуальными машинами, а также гостевыми операционными системами внутри виртуальных машин. Оно работает на Windows и Linux и поддерживает управление VMware Server, Workstation и Virtual Infrastructure (ESX и vCenter). Существуют связи с  C, Perl, и COM (Visual Basic, VBscript, C#).

Использование библиотеки

Чтобы использовать библиотеку или собрать, или же запустить ее из исходного кода, вы должны установить следующее программное обеспечение от VMWare:

  • VMWare VIX. Это SDK, находится по адресу http://www.vmware.com/download/sdk/vmauto.html. Новая версия 1.6.2 требуется для поддержки VI.
  • VMWare Workstation 6.5 или окружение VI (например ESX), или и то и то.

В своем проекте добавьте ссылку, на Vestris.VMWareLib.dll и namespace reference.

1
using Vestris.VMWareLib;
using Vestris.VMWareLib;

Сейчас вы можете соединяться с локальной VMWare Workstation или с удаленной ESX server и выполнять задачи VMWare. Ниже представлен пример, которы создает, восстанавливает, включает и удаляет снепшоты на VMWare Workstation.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Объявление виртуального хоста
VMWareVirtualHost virtualHost = new VMWareVirtualHost();
// соединение с локальной (VMWare Workstation) виртуальной машиной
virtualHost.ConnectToVMWareWorkstation();
// открытие существующей виртуальной машины
VMWareVirtualMachine virtualMachine = virtualHost.Open("C:\Virtual Machines\xp\xp.vmx");
// включение этой виртуальной машины
virtualMachine.PowerOn();
// вход в гостевую операционную систему на этой виртуальной машине
virtualMachine.Login("Administrator", "password");
// запуск блокнота
virtualMachine.RunProgramInGuest("notepad.exe", string.Empty);
// создание нового снепшота
string name = "New Snapshot";
// сохранение текущего состояния
virtualMachine.Snapshots.CreateSnapshot(name, "test snapshot");
// выключение
virtualMachine.PowerOff();
// нахождение созданного снепшота
VMWareSnapshot snapshot = virtualMachine.Snapshots.GetNamedSnapshot(name);
// возврат к состоянию, когда был сделан снепшот
snapshot.RevertToSnapshot();
// его удаление
snapshot.RemoveSnapshot();
// Объявление виртуального хоста
VMWareVirtualHost virtualHost = new VMWareVirtualHost();
// соединение с локальной (VMWare Workstation) виртуальной машиной
virtualHost.ConnectToVMWareWorkstation();
// открытие существующей виртуальной машины
VMWareVirtualMachine virtualMachine = virtualHost.Open("C:\Virtual Machines\xp\xp.vmx");
// включение этой виртуальной машины
virtualMachine.PowerOn();
// вход в гостевую операционную систему на этой виртуальной машине
virtualMachine.Login("Administrator", "password");
// запуск блокнота
virtualMachine.RunProgramInGuest("notepad.exe", string.Empty);
// создание нового снепшота
string name = "New Snapshot";
// сохранение текущего состояния
virtualMachine.Snapshots.CreateSnapshot(name, "test snapshot");
// выключение
virtualMachine.PowerOff();
// нахождение созданного снепшота
VMWareSnapshot snapshot = virtualMachine.Snapshots.GetNamedSnapshot(name);
// возврат к состоянию, когда был сделан снепшот
snapshot.RevertToSnapshot();
// его удаление
snapshot.RemoveSnapshot();

Если вам интересна реализация, то она описанна в оригинальной статье.

 

1 Response

  1. Сергей 14.12.2014 / 01:08

    Подскажите пожалуйста, что означает сделать ссылку на namespace reference?

    Посмотрел множество примеров, но всегда возникает ошибка на virtualMachine.Login(«Administrator», «password»);

    Ничего кроме включение сделать не могу, везде эксепшины вылазят. Можете чтонибудь подсказать?

Добавить комментарий