Suppress “Supply values for the following parameters: Credential” when using Get-Credential in PowerShell
When you want to ask the user for alternative credentials, the Get-Credential cmdlet is your friend.
You get a nice popup, asking you for a username and password.
But your PowerShell console always displays this nasty message:
How to Hard Kill a stuck VM with PowerCLI
Sometimes a VM is stuck and can’t be killed with vSphere Client (or from within the VM).
On ESX, you could login and perform the famous kill –9 <PID> to kill the VM. Most people don’t realize that this functionality has been added to PowerCLI in version 4.1 Update 1.
First, connect directly to the ESX(i) host.
Connect-VIServer -Server <Hostname> -Credential $(Get-Credential -Credential root)
PowerCLI: Convert PortWorldWideName or NodeWorldWideName to hexadecimal format.
If you output one of the fields of $VMHost.Config.StorageDevice.MultipathInfo.Lun[x].Path[x].Transport, you will get the output in standard decimal numbers.
This is different from what is used in SAN environment where they mostly use XX:XX:XX:XX:XX:XX:XX:XX where XX is a hexadecimal number.
Use the following code to convert from the decimal format to the hexadecimal SAN format:
[String] $lstrWWNNHex = "{0:x}" -f $NodeWorldWideName
[String] $lstrWWNNHexFormatted = ""
For ($i=0;$i -lt 8;$i++)
{
$lstrWWNNHexFormatted += "{0}:" -f $($lstrWWNNHex.SubString($i * 2, 2))
}
$lstrWWNNHexFormatted = $lstrWWNNHexFormatted.SubString(0, $lstrWWNNHexFormatted.Length - 1)
$NodeWorldWideName is the WWN generated by $VMHost.Config.StorageDevice.MultipathInfo.Lun[x].Path[x].Transport.NodeWorldWideName. You can use the same for PortWorldWideName.
How to check if PowerCLI libraries are loaded in PowerShell/PowerGUI
If you write scripts in PowerShell or PowerGUI, it might be handy to check if the PowerCLI libraries are loaded.
Even though you have PowerCLI installed, this does not mean the objects are loaded in your PowerShell session.
In PowerGUI for example, you can check this by clicking File – PowerShell Libraries.
Get the FQDN of your host with PowerShell
I was looking into a way to get the FQDN of my server in PowerShell. There are some Environment Variables (like USERDNSDOMAIN), but they reflect the current logged on user and not the computer.
Use the following code to list your FQDN:
$objIPProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties()
"{0}.{1}" -f $objIPProperties.HostName, $objIPProperties.DomainName
Done!
Create an ‘Internal’ vSwitch with PowerCLI
I was looking for the correct syntax to create a vSwitch with PowerCLI which has no vmnics attached (aka: Internal vSwitch).
I tried to run the following cmdlet. The pNIC’s are specified with the –Nic parameter.
Get-VirtualSwitch -VMHost "ServerName" -Name "vSwitchName" | Set-VirtualSwitch -Nic "" -Confirm:$false
But this resulted in a nice error 🙂
How to use Try – Catch in PowerCLI the easy way
Sometimes you need to check if something exists. For example, let’s check if a specific user exists on our ESX host (you need to connect directly to the ESX host for this example to work).
We do this by running:
Get-VMHostAccount -Id UserName
Add license to a vSphere host
This is a rather short PowerCLI post.
Licensing is not directly available in PowerCLI cmd-lets, so we’ll have to reach out to the SDK, which is easily accessible from PowerShell. We’ll have to fetch a LicenseAssignmentManager to set the license, so this mean using quite some Get-View cmdlets. These could all be combined into a single line of code but makes it hard to read.
$strVMHostName is the name of your ESX(i) server to license
$strLicense is your licensekey. All zero’s like in the example sets the host to evaluation mode.
Enjoy!
$strVMHostName = "HostName.domain.com"
$strLicense = "00000-00000-00000-00000-00000"
$objServiceInstance = Get-View -Id ServiceInstance -Property Content.LicenseManager
$objLicenseManager = Get-View -Id $objServiceInstance.Content.LicenseManager -Property LicenseAssignmentManager
$objLicenseAssignmentManager = Get-View -Id $objLicenseManager.LicenseAssignmentManager
$objVMHost = Get-View -ViewType "HostSystem" -Filter @{Name=$strVMHostName} -Property Config.Host
$objLicenseAssignmentManager.UpdateAssignedLicense($objVMHost.Config.Host.Value, $strLicense, $null)
How many Powered On VMs are running on my host + Speed up your PowerCLI cmdlets!
A rather simple script today, but we’ll discuss some nice improvements on our way…
Let’s say you want to know how many VMs are running on your host. The following code will do the trick:
Get-VMHost "host" | Get-VM | Where-Object `
{$_.PowerState -eq "PoweredOn"} | Measure-Object
It will give you a nice output like this:
Allright! Script works… but it’s rather slow. Let’s use the Measure-Command cmdlet to see how long it actually takes in my environment. The Measure-Command take a ScriptBlock argument at the –Expression parameter. So pass the whole code as a scriptblock and you know how long it takes to run it.