Ответ 1
Я чувствую твою боль. Я сижу на длинном раздумье о том, насколько болезненны их API, но я пощажу вас. Вот то, что для меня работало достаточно хорошо (я напрямую подключаюсь к ESX-боксам, но думаю, что вы сможете построить это, чтобы добраться туда, куда вы хотите):
(Изменить: форматирование исправлено)
-
Возьмите
vSphere PowerCLI
здесь (ранее называемыйVI Toolkit (for Windows)
); он включает в себя API VMware.Vim и требуемые базовые классы реализации, к которым обращается интерфейс (хотя, естественно, позже не видно из чтения документов). Установите его на своем компьютере-разработчике (это добавит библиотеки реализации .NET VMware.Vim в ваш глобальный кэш сборок, мы позже извлечем библиотеки, о которых мы заботимся о переносимости) -
Создайте проект VS и введите какой-нибудь приветственный мировой код.
using VMware.Vim; //some namespace, some class, some method... VimClient c = new VimClient(); ServiceContent sc = c.Connect("hostnameOrIpHere"); UserSession us = c.Login("usernameHere", "passwordHere"); IList<VMware.Vim.EntityViewBase> vms = c.FindEntityViews(typeof(VMware.Vim.VirtualMachine), null, null, null); foreach (VMware.Vim.EntityViewBase tmp in vms) { VMware.Vim.VirtualMachine vm = (VMware.Vim.VirtualMachine)tmp; Console.WriteLine((bool)(vm.Guest.GuestState.Equals("running") ? true : false)); Console.WriteLine(new Uri(ENDPOINTURL_PREFIX + (vm.Guest.IpAddress != null ? vm.Guest.IpAddress : "0.0.0.0") + ENDPOINTURL_SUFFIX)); Console.WriteLine((string)vm.Client.ServiceUrl); Console.WriteLine(vm.Guest.HostName != null ? (string)vm.Guest.HostName : ""); Console.WriteLine("----------------");
}
-
Если это работает и печатает некоторую информацию о ваших виртуальных машинах, то пока, так хорошо. Если вы видите что-то вроде
System.IO.FileNotFoundException: Could not load file or assembly 'VimService40, Version=4.0.0.0, Culture=neutral, Public KeyToken=10980b081e887e9f' or one of its dependencies. The system cannot find the file specified.
, то вы знаете, что у вас нет фактических файлов реализации: VMware.Vim.dll - это просто интерфейс, а фактические реализации для каждого протокола находятся в таких файлах, как VimService40.dll, которые вы должны иметь получил с шагом 1. -
Как только вы захотите развернуть этот код где-то, вам нужно отправить с ним фактические библиотеки dll (опять же, VMware.vim.dll не хватает). Вы можете использовать командную строку (не Explorer, она не будет работать), чтобы скопировать их из глобального сборочного кэша.
Получить VimService DLL из GAC:
cd %windir%\assembly\GAC_MSIL cp VimService20\2.0.0.0__10980b081e887e9f\VimService20.dll %HOMEDRIVE%\%HOMEPATH%\Desktop cp VimService20.XmlSerializers\2.0.0.0__10980b081e887e9f\VimService20.XmlSerializers.dll %HOMEDRIVE%\%HOMEPATH% cp VimService25\2.5.0.0__10980b081e887e9f\VimService20.dll %HOMEDRIVE%\%HOMEPATH%\Desktop cp VimService25.XmlSerializers\2.5.0.0__10980b081e887e9f\VimService20.XmlSerializers.dll %HOMEDRIVE%\%HOMEPATH% ... etc, for all the VimService versions you might use ...
-
Когда вы разворачиваете свой код на другой компьютер, поместите эти библиотеки в одну и ту же папку (или на путь), и у вас должна быть достойная основа для создания и развертывания кода, который работает с полями ESX.