如果这个问题已经回答了,我很抱歉,我没有找到任何关于它的信息。
我正在为 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);