I got thinking the other day about how much I hate logging into vSphere Web Client/vSphere Client. In a large environment with different SSO domains, you end up wasting 10 mins logging in. So, thinking about work while trying to sleep, I made a note to look into launching VMRC from PowerCLI Core on my Mac.
Being a Mac user, I will pretty much do anything in my power not to have to jump to a windows box, and as it turns out, the Open-VMConsoleWindow cmdlet is not supported within PowerShelll Core.
Yes, I could jump to another machine, but seriously, that is a pain, so I did a search thinking’s Python might be the only way also, would be helpful as I need to knuckle down and up my game on the Python front. I have a hard time creating anything in Python when there is no real requirement, apart from skilling up ….
Understand
To start the process, I did a Google search and came across an article by Roman Dodin, unfortunately, his post is no longer available. The VMRC link looks something like:-
vmrc://ezra@lab.local@vc01.lab.local:443/?moid=vm-320 (vCenter)
vmrc://ezra@lab.local@esx01.lab.local:443/?moid=320 (ESXi)
Link construction is made up of the following:-
- user or user@domain
- vCenter/ESXi IP or FQDN
- Virtual Machine MoRef ID
With that info, what I thought was going to be more complex ended up being super easy, you can craft the URL yourself and use PowerShell.
Design
So recently, I have been building up a “Toolkit” which essentially is a PowerShell module with many cmdlets to make my day to day tasks a whole lot easier, and this function will fit perfectly.
As I have made the function to go into my Toolkit module, there are a couple of things to bear in mind.
- My credentials are stored in a variable called $Creds
- A connection is already established with a ESXi Host or vCenter server.
To keep things nice a simple, I had two requirements for the function:-
- Must accept pipeline input
Get-VM test01 | Open-VMRC
- Must accept VM name parameter
Open-VMRC test01
With the knowledge of the link construction I will use following variables:-
$vm = “test01” # VM Name
$vmID = 320 # MoRef ID
$vcsa = “vc01.lab.local” # vCenter or ESXi Host
$creds = Get-Credentials # Credentials for access
$url = # Crafted URL depending on target
Steps
To get things started, I needed to find a way to launch the URL. I’m sure there are a few ways to tackle this, I choose to use theStart-Process
cmdlet.
Start-Process -Path "vmrc://ezra@lab.local@esx01.lab.local:443/?moid=320"
To meet the pipeline requirement, we can enable the pipeline input to be assigned to the $vm
variable. We start the function using the code below.
[CmdletBinding()]
param
(
[Parameter(Mandatory=$true, ValueFromPipeline=$True)] $vm
)
Next, we need to assign the $vcsa
variable the currently connected VI Server session which is stored in a global variable.
$vcsa = $global:DefaultVIServer.Name
We need a VM object so we can get the MoRef ID. Lets now check if $vm
is a PowerShell object or a string, if a string assign a VM object.
if ($vm.GetType().Name -eq "String")
{
$vm = Get-VM $vm
}
Now we have the VM object, we can get the MoRef ID property we require for the URL.
$vmID = $vm.id.Split("-")[-1]
And finally, we have to check the VM object to see if we are connected to a vCenter server or an ESXi host then assign the $url
variable the appropriate value.
if ($vm.id -like "*vm*")
{
$url = "vmrc://" + $creds.username + "@" + $vcsa + ":443/?moid=vm-" + $vmID
}
else
{
$url = "vmrc://" + $creds.username + "@" + $vcsa + ":443/?moid=" + $vmID
}
Time to launch using the Start-Process
cmdlet.
Start-Process -Path $url
Solution
Many improvements can be made, but for a quick win, it ticks the box. I really hope you have gained something from this article. The complete code can be found on GitHub.