Created
April 7, 2016 16:18
-
-
Save vScripter/9053b22fb5b9a6dd92800ebf96ba80b6 to your computer and use it in GitHub Desktop.
Get-VMDetails.ps1
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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