Как получить имя виртуальной машины с помощью VMWare API?
Я использую API Vestris.VMWareLib для удаленного управления своими виртуальными машинами на сервере ESX 5.0. Я использую метод VMWareVirtualMachine.Open для включения моих виртуальных образов. Мой код написан на C#. Проблема в том, что вам нужно знать путь к хранилищу данных, прежде чем вы сможете включить образ - я бы хотел включить его, зная только имя виртуальной машины. Есть ли способ сделать это? Я включил мой текущий код ниже. Спасибо Джон
using Vestris.VMWareLib;
//Works if VM name is in the path but what if it isn't?
List<VMWareVirtualMachine> vitualMachines = esxServer.RegisteredVirtualMachines.ToList();
VMWareVirtualMachine virtualMachine = vitualMachines.Where(vm => vm.PathName.Contains(vmName)).First();
VMWareVirtualMachine virtualMachine = esxServer.Open(vmName);
Есть метод VMWareVirtualMachine.GetProperty(), который можно использовать для получения имени виртуальной машины, но я не знаю, как его использовать. Любые предложения или идеи, как я могу это сделать?
Спасибо Джон
2 ответа
VMWareTasks зафиксировал добавление свойства "Name" к классу VMWareVirtualMachine, оно взято из свойства "displayName" в файле vmx. Это свойство отсутствует в VMWareTasks 1.7, поэтому на данный момент вам нужно будет извлечь исходный код и собрать его самостоятельно.
Используйте его для итерации зарегистрированных гостей, проверки этой переменной и включения соответствующей.
using Vestris.VMWareLib;
private void powerOnVm(string vmName)
{
using (VMWareVirtualHost esxServer = new VMWareVirtualHost())
{
esxServer.ConnectToVMWareVIServer("yourHost", "yourUser", "yourPassword");
using (VMWareVirtualMachine virtualMachine = esxServer.RegisteredVirtualMachines.FirstOrDefault(vm => vm.Name == vmName))
{
if (virtualMachine != null && !virtualMachine.IsRunning)
virtualMachine.PowerOn();
}
}
}
Я только что проверил выше, и это работало нормально.
Чтобы упростить приведенный выше ответ: вам не нужно перекомпилировать исходники против старого коммита. Просто используйте вызов метода ниже:
GetProperty<string>(Constants.VIX_PROPERTY_VM_NAME) instead of vm.Name
(У меня недостаточно репутации, чтобы комментировать ответ, извините за новый).