C# VMWare PowerCli 6.0 从文件夹中启动虚拟机



如果这个问题已经回答了,我很抱歉,我没有找到任何关于它的信息。

我正在为 vSphere 6 开发 PowerCLi 6.0。

我拥有特定文件夹(称为"XXXFolder"(的所有权限,但对整个主机没有权限。 在此文件夹中,我正在尝试使用 C# 自动执行关机/开机操作。

VMware.Vim.VimClientImpl myClient = new VimClientImpl();
myClient.Connect("https://" + hostName + ":443/sdk");
myClient.Login(userName, passWord);
NameValueCollection propertyFilter = new NameValueCollection();
propertyFilter.Add("name", "VMName");
VMware.Vim.VirtualMachine myVM = (VirtualMachine)myClient.FindEntityView(typeof(VirtualMachine), null, propertyFilter, null);   

关机操作工作正常,方式如下:

myVM.PowerOffVM();

但对于 PowerOn 方法,它将主机作为参数 VM 所在的位置。所以像这样:

myVM.PowerOn(myVM.Runtime.Host);

但是因为我对主机没有权限(我提醒仅在 VM 所在的特定文件夹中(,所以我异常出现以下消息:

"Permission to perform this operation was denied."

请注意,使用以下Powershell命令工作正常:

Start-VM -VM $myVM

有人知道在 C# 中,如何打开位于特定文件夹中的虚拟机的电源吗?

非常感谢您的帮助。

您好@MikaTTC您可以尝试使用 PowerOnMultiVM_Task来自数据中心对象的方法? 我将您的情况转载如下: 成为新用户。 已授予用户对虚拟机文件夹 的管理员访问权限。我在虚拟机文件夹中放置了 1 个虚拟机。

使用 API 使用以下方式打开电源:

$vm = New-Object VMware.Vim.ManagedObjectReference[] (1)
$vm[0] = New-Object VMware.Vim.ManagedObjectReference
$vm[0].Type = 'VirtualMachine'
$vm[0].Value = 'vm-82'
$DCView = Get-View -Id 'Datacenter-datacenter-2'
$DCView.PowerOnMultiVM_Task($vm, $null)

我知道这不是 c#,但我很确定你可以弄清楚这一点。此处介绍了该方法 https://pubs.vmware.com/vsphere-51/index.jsp?topic=%2Fcom.vmware.wssdk.apiref.doc%2Fvim.Datacenter.html

由于您具有客户端和 VM 对象,因此请使用以下命令启动 VM。通常,在打开虚拟机电源时,我会等待工具可用,然后再继续。

myClient.WaitForTask(myVM.PowerOnVM_Task(myVM.Runtime.Host));
while (true) 
{
// Get Fresh details of the VM
VMware.Vim.VirtualMachine myVM = (VirtualMachine)myClient.FindEntityView(typeof(VirtualMachine), null, propertyFilter, null);
if (!myVM.Guest.ToolsRunningStatus.Equals("guestToolsRunning"))
Thread.Sleep(2000); // Wait 2 seconds and try again. (Changeable)
else
break;
// Add another statement here that only loops through x amount of times before quiting tools status. 
// You dont want to be stuck here forever
}

关闭虚拟机电源时也可以使用相同的方法,

myClient.WaitForTask(myVM.PowerOffVM_Task());

感谢格雷古,我解决了这个问题。这是用于打开位于文件夹中的虚拟机电源的 C# 代码。(PowerOnMultiVM_Task不需要整个主机的权限(

请注意,在下面的代码中,我删除了:

  • 条件(检查对象是否为空,以及虚拟机状态已关闭(,
  • 错误处理(尝试/捕获(
  • 同步(等待任务(

为了使这部分代码更容易理解。

再次,感谢@Gregu

// dummy values examples
string hostName = "10.0.0.20"; 
string userName = "myUser"; 
string sFolderName = "myFolderName"; 
string sMyDataCenter = "myDataCenterName"; 
string sMyVM = "sMyVMNAme"; 

List<VMware.Vim.ManagedObjectReference> MOF = new List<VMware.Vim.ManagedObjectReference>();

// Create Client Object
VMware.Vim.VimClientImpl myClient = new VimClientImpl();

// Connect to host
myClient.Connect("https://" + hostName + ":443/sdk");
myClient.Login(userName, passWord);

// Create a Folder object which has the name defined
NameValueCollection propertyFilterFolder = new NameValueCollection();
propertyFilterFolder.Add("name", sFolderName);
VMware.Vim.Folder myFolder = (Folder)myClient.FindEntityView(typeof(Folder), null, propertyFilterFolder, null);

// Create a DataCenter object which has the name defined
NameValueCollection propertyFilterDC = new NameValueCollection();
propertyFilterDC.Add("name", sMyDataCenter);
VMware.Vim.Datacenter myDC = (Datacenter)myClient.FindEntityView(typeof(Datacenter), null, propertyFilterDC, null);

// Create a VM object which has the name defined (From the specified folder)
NameValueCollection propertyFilter = new NameValueCollection();
propertyFilter.Add("name", sMyVM);
VMware.Vim.VirtualMachine myVMF = (VirtualMachine)myFolder.Client.FindEntityView(typeof(VirtualMachine), null, propertyFilter, null);

MOF.Add(myVMF.MoRef);

// Calling the Start VM method
myDC.PowerOnMultiVM_Task(MOF.ToArray(), null);

最新更新