Skip to content

Instantly share code, notes, and snippets.

@vScripter
Created April 7, 2016 16:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vScripter/9053b22fb5b9a6dd92800ebf96ba80b6 to your computer and use it in GitHub Desktop.
Save vScripter/9053b22fb5b9a6dd92800ebf96ba80b6 to your computer and use it in GitHub Desktop.
Get-VMDetails.ps1
function Get-VMDetails {
<#
.SYNOPSIS
Returns more detailed statistics and configuration for a single or multiple VMs
.DESCRIPTION
Returns more detailed statistics and configuration for a single or multiple VMs
.PARAMETER Server
VI (vCenter) server name
.INPUTS
System.String
.OUTPUTS
System.Management.Automation.PSCustomObject
.EXAMPLE
Get-VMDetails -Verbose | Export-Csv C:\VMGuestDetails.csv -NoTypeInformation -Force
.EXAMPLE
Get-VMDetails -Verbose | Out-GridView
.NOTES
Author: Kevin Kirkpatrick
Email: kevin@vmotioned.com
Version: 2.0
Last Update: 20150604
Last Updated by: K. Kirkpatrick
Last Update Notes:
- Added 'FTEnabled' field
- Updated Verbose and Warning messages prefix; added [Get-VMDetails]
- Added 'FolderPath' and 'vCenter' if running against specific guests
#>
[cmdletbinding()]
param (
[parameter(Mandatory = $false)]
[alias('VIServer')]
[System.String]$Server,
[parameter(Mandatory = $false,
ValueFromPipelineByPropertyName = $true,
ValueFromPipeline = $true)]
$Name
)
BEGIN {
#Requires -Version 3
Write-Verbose -Message '[Get-VMDetails] Checking for VMware.VimAutomation.Core PSSnapin'
if ((Get-PSSnapin -Name VMware.VimAutomation.Core -ErrorAction 'SilentlyContinue').Name -eq $null) {
try {
Add-PSSnapin VMware.VimAutomation.Core -ErrorAction 'Stop'
} catch {
Write-Warning -Message "[Get-VMDetails] Error adding VMware PSSnapin: $_"
Write-Warning -Message '[Get-VMDetails] Exiting script'
break
} # try/catch
} else {
Write-Verbose -Message "[Get-VMDetails] 'VMware.VimAutomation.Core' PSSnapin is already added; continuing..."
} # end if/else
# if -Server was specified, try connecting, else make sure there is a valid connection
if ($Server) {
Write-Verbose -Message '[Get-VMDetails] Connecting to vCenter Server'
try {
Connect-VIServer -Server $Server | Out-Null
} catch {
Write-Warning -Message '[Get-VMDetails] Error connecting to vCenter'
Write-Warning -Message '[Get-VMDetails] Exiting script'
break
} # end try/catch
} elseif (($global:defaultviserver).Name -eq $null) {
Write-Warning -Message '[Get-VMDetails] No default vCenter connection. Connect to vCenter or specify a vCenter Server name and try again.'
Write-Warning -Message '[Get-VMDetails] Exiting script'
break
} # end if/elseif
$viServer = $global:defaultviserver.Name
$viServerVersion = $global:defaultviserver.Version
# write selected VI server to the console
Write-Verbose -Message "[Get-VMDetails] Selected VI Server: {$viServer}"
} # end BEGIN block
PROCESS {
if ($Name) {
[System.DateTime]$dateGenerated = Get-Date
foreach ($guest in $Name) {
if ($guest.GetType().FullName -ne 'VMware.VimAutomation.ViCore.Impl.V1.Inventory.VirtualMachineImpl') {
Write-Warning -Message "[Get-VMDetails] Provided input for guest is not the proper type. The current input type is {$($guest.GetType().FullName)}. Please supply input as a '[VMware.VimAutomation.ViCore.Impl.V1.Inventory.VirtualMachineImpl]' object."
break
} # end if
$guestQuery = $null
$objVmMapping = @()
Write-Verbose -Message "[Get-VMDetails] Gathering details for VM guest {$($guest.Name)}"
$guestQuery = $guest | Get-View -Property Name, Guest, Config, Summary, Runtime, Parent
$objVmMapping = [PSCustomObject] @{
Name = $guestQuery.Name
HostName = $guestQuery.Guest.HostName
OS = $guestQuery.Summary.Guest.GuestFullName
IPAddress = $guestQuery.Summary.Guest.IPAddress
FTEnabled = if ($guestQuery.Runtime.FaultToleranceState -eq 'running') { [bool]$true } else { [bool]$false }
CPUHotAddEnabled = $guestQuery.Config.CPUHotAddEnabled
RAMHotAddEnabled = $guestQuery.Config.MemoryHotAddEnabled
VMToolsInstallerMounted = $guestQuery.Summary.Runtime.ToolsInstallerMounted
ToolsVersion = $guestQuery.Guest.ToolsVersion
ToolsStatus = $guestQuery.Guest.ToolsStatus
ToolsVersionStatus = $guestQuery.Guest.ToolsVersionStatus2
ToolsRunningStatus = $guestQuery.Guest.ToolsRunningStatus
ToolsUpgradePolicy = $guestQuery.Config.Tools.ToolsUpgradePolicy
Annotation = $guestQuery.Summary.Config.Annotation
State = $guestQuery.Guest.GuestState
Status = $guestQuery.Summary.Runtime.PowerState
vCenterServer = ($guestQuery.Client.ServiceUrl).split('/')[2]
FolderPath = (Get-VMFolderPath -VM $guestQuery).FolderPath
Generated = $dateGenerated
} # end $objVISummary
$objVmMapping
} # end foreach $guest
} else {
Write-Verbose -Message "[Get-VMDetails][$viServer] Collecting Summary Detail"
try {
$datacenterQuery = Get-View -Server $viServer -ViewType Datacenter -Property Name -ErrorAction 'Stop'
} catch {
Write-Warning -Message "[Get-VMDetails][$viServer] Error Collecting Summary Detail"
Write-Warning -Message "[Get-VMDetails][$viServer] Exiting script"
break
} # end try/catch
foreach ($datacenter in $datacenterQuery) {
$datacenterName = $null
$clusterQuery = $null
[System.DateTime]$dateGenerated = Get-Date
$datacenterName = $datacenter.Name
$clusterQuery = Get-View -Server $viServer -ViewType ClusterComputeResource -Property Name -SearchRoot $datacenter.MoRef
foreach ($cluster in $clusterQuery) {
Write-Verbose -Message "[Get-VMDetails]['$($cluster.Name)' Cluster] Working"
$clusterVMs = $null
$clusterVMs = Get-View -Server $viServer -ViewType VirtualMachine -Property Name, Guest, Runtime, Summary, Config -SearchRoot $cluster.MoRef
foreach ($guest in $clusterVMs) {
Write-Verbose -Message "[Get-VMDetails][$($guest.Name)] Working..."
$objVmMapping = @()
$objVmMapping = [PSCustomObject] @{
Name = $guest.Name
HostName = $guest.guest.hostname
OS = $guest.Summary.Guest.GuestFullName
IPAddress = $guest.Summary.Guest.IPAddress
FTEnabled = if ($guest.Runtime.FaultToleranceState -eq 'running') { [bool]$true } else { [bool]$false }
CPUHotAddEnabled = $guest.Config.CPUHotAddEnabled
RAMHotAddEnabled = $guest.Config.MemoryHotAddEnabled
VMToolsInstallerMounted = $guest.Runtime.ToolsInstallerMounted
ToolsVersion = $guest.Guest.ToolsVersion
ToolsStatus = $guest.Guest.ToolsStatus
ToolsVersionStatus = $guest.Guest.ToolsVersionStatus2
ToolsRunningStatus = $guest.Guest.ToolsRunningStatus
ToolsUpgradePolicy = $guest.Config.Tools.ToolsUpgradePolicy
Annotation = $guest.Summary.Config.Annotation
State = $guest.Guest.GuestState
Status = $guest.Runtime.PowerState
vCenterServer = $viServer
Datacenter = $datacenterName
Cluster = $cluster.Name
vCenterVersion = $viServerVersion
vSphereUUID = $guest.Config.Uuid
Generated = $dateGenerated
} # end $objVISummary
$objVmMapping
} # end forech ($guest in $clusterVMs)
} # end foreach $cluster
} # end foreach $datacenter
} # end if/else $VM
} # end PROCESS block
END {
Write-Verbose -Message '[Get-VMDetails] Processing Complete.'
} # end END block
} # end function Get-VMDetails
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment