Creating console screenshots with Get-ScreenshotFromVM.ps1
Today, I had a very interesting discussion. As part of an ongoing troubleshooting process, console screenshots of virtual machines should be created.
The colleagues, who were working on the problem, already found a PowerCLI script that was able to create screenshots using the Managed Object Reference (MoRef). But unfortunately all they got were black screens and/ or login prompts. Latter were the reason why they were unable to run the script unattended. They used the Get-VMScreenshot script, which was written by Martin Pugh.
I had some time to take a look at his script and I created my own script, which is based on his idea and some parts of his code.
<# | |
.SYNOPSIS | |
This script retrieves a console screenshot of one or more virtual machines. | |
.DESCRIPTION | |
The script needs four parameters: | |
- the name of the VM (name from the inventory) | |
- the hostname of a vCenter or ESXi host | |
- username, and | |
- password | |
You can also pipeline a list of VMs to the script. | |
History | |
v0.1: Under development | |
.EXAMPLE | |
Get-ScreenshotFromVM -vm testvm -vmhost vcenter -username thomastest -password yoursecretpassword | |
.NOTES | |
Author: Patrick Terlisten, patrick@blazilla.de, Twitter @PTerlisten | |
This script is provided 'AS IS' with no warranty expressed or implied. Run at your own risk. | |
This work is licensed under a Creative Commons Attribution NonCommercial ShareAlike 4.0 | |
International License (https://creativecommons.org/licenses/by-nc-sa/4.0/). | |
This script is inspired by "Get-VMScreenshot" by Martin Pugh (@thesurlyadm1n, www.thesurlyadmin.com) | |
https://community.spiceworks.com/scripts/show/1748-get-vmscreenshot-get-screen-shots-from-the-console-session-of-your-vm-s | |
.LINK | |
http://www.vcloudnine.de | |
#> | |
#Requires -Version 3.0 | |
#Requires -Module VMware.VimAutomation.Core | |
# Parameter | |
Param ( | |
[Parameter(Mandatory=$true, | |
ValueFromPipeline=$true, | |
ValueFromPipelineByPropertyName=$true)] | |
[String[]]$vm = "Name of VM", | |
[Parameter(Mandatory=$true)] | |
[string]$vmhost = "Name of vCenter or ESXi host", | |
[string]$username = "Username", | |
[string]$password = "Password" | |
) | |
Begin { | |
# Variables | |
$secstring = ConvertTo-SecureString $password -asplaintext -force | |
$cred = New-Object System.Management.Automation.PSCredential($username, $secstring) | |
# Connect to vCenter | |
try { | |
Connect-VIServer -Server $vmhost -User $username -Password $password -ErrorAction stop | Out-Null | |
Write-Host -ForegroundColor Green "Successfully connectioned to $vmhost" | |
} | |
catch { | |
throw "Connection to $vmhost failed" | |
} | |
} | |
# Do something | |
Process { | |
Foreach ($item in $vm) { | |
$vmid = (Get-VM -Name $item).ExtensionData.MoRef.Value | |
Invoke-WebRequest -Uri https://$vmhost/screen?id=$vmid -Credential $cred -OutFile $pwd\$item-$(Get-Date -f yyyyMMdd-hhmm).png | |
Write-Host -ForegroundColor Green "Console screenshot was saved as $pwd\$item-$(Get-Date -f yyyyMMdd-hhmm).png" | |
} | |
} | |
# Clean up | |
End { | |
# Disconnect from vCenter | |
Disconnect-VIServer -Force -Confirm:$false | |
Write-Host -ForegroundColor Green "Successfully disconnected from $vmhost" | |
} |
This file is also available on GitHub.
One important note: If you want to take console screenshots of VMs, please make sure that display power saving settings are disabled! Windows VMs are showing a black screen after some minutes. Please disable this using the energy options, or better using a GPO. Otherwise you will capture a black screen!