Tag Archives: PowerCLI

VMware VMRC Console Links with PowerCLI Core on macOS and Linux

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.

Not supported on PowerShell Core
Not supported on PowerShell 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:-

  1. Must accept pipeline input
    Get-VM test01 | Open-VMRC
  2. 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.