VMware Tools Status report

Script to create a report about the VMware Tools status:

Sample Output:

Total VMs: 527
Total powered on: 474
Total powered off: 53
ToolsOK: 140
ToolsOld: 227
ToolsNotInstalled: 106
DisConnect from Virtual Center

Set-PSDebug -Strict
$VIServer = "VCENTERIP"
Connect-VIServer -server $VIServer -User USERNAME -Password PASSWORD

$vms = Get-VM | Sort Name
$on = 0
$toolsOk = 0
$toolsOld = 0
$toolsNotInstalled = 0
foreach ($vm in $vms){
	if ($vm.PowerState -like "PoweredOn"){
		$vmview = $vm | Get-View
		$toolsstatus = $vmview.Guest.ToolsStatus
		$toolsrunningstatus = $vmview.Guest.ToolsRunningStatus
		$toolsversionstatus = $vmview.Guest.ToolsVersionStatus
		$on = $on+1
		if ($toolsstatus -like "toolsOk"){
			$toolsOk = $toolsOk + 1
		}
		if ($toolsstatus -like "toolsOld"){
			$toolsOld = $toolsOld + 1
		}
		if ($toolsstatus -like "toolsNotInstalled"){
			$toolsNotInstalled = $toolsNotInstalled + 1
		}
	}
}
$count = $vms.Count
$off = $count - $on
Write-Host "Total VMs: $count" 
Write-Host "Total powered on: $on"
Write-Host "Total powered off: $off"
Write-Host "ToolsOK: $toolsOk"
Write-Host "ToolsOld: $toolsOld"
Write-Host "ToolsNotInstalled: $toolsNotInstalled"
# DisConnect to Virtual Center
Write-Host "DisConnect from Virtual Center"
Disconnect-VIServer -Server $VIServer -Confirm:$False

Show WWN of FC devices

First you need to connect to a vCenter:

Connect-VIServer -Server VCENTERIP -User USERNAME -Password PASSWORD

Get-VMHost | Sort | Select Name,
     @{N="FC Device";E={[string]::Join(",",(($_ | Get-View).Config.StorageDevice.HostBusAdapter | where{$_.GetType().Name -eq "HostFibreChannelHba"} | %{$_.Device}))}},
     @{N="FC WWN";E={[string]::Join(",",(($_ | Get-View).Config.StorageDevice.HostBusAdapter | where{$_.GetType().Name -eq "HostFibreChannelHba"} | %{"{0:x}" -f $_.NodeWorldWideName}))}}

Disconnect-VIServer -Server VCENTERIP -Force -Confirm:$false

Get VM information as Script node for the Virtualization EcoShell

This script node will open a small window with a drop down menu with all your VM’s listed. Select one and click on OK. The script will collect some information and then display them.

Script node:

if ($global:defaultviservers) {
	#Generated Form Function
	function GenerateForm {
	########################################################################
	# Code Generated By: SAPIEN Technologies PrimalForms (Community Edition) v1.0.7.0
	# Generated On: 25/11/2009 12:55
	# Generated By: IT2000
	########################################################################
	
	#region Import the Assemblies
	[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
	[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
	#endregion
	
	#region Generated Form Objects
	$form1 = New-Object System.Windows.Forms.Form
	$button1 = New-Object System.Windows.Forms.Button
	$label1 = New-Object System.Windows.Forms.Label
	$comboBox1 = New-Object System.Windows.Forms.ComboBox
	$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
	#endregion Generated Form Objects
	
	#----------------------------------------------
	#Generated Event Script Blocks
	#----------------------------------------------
	#Provide Custom Code for events specified in PrimalForms.
	$button1_OnClick= 
	{
	$global:Cluster = $comboBox1.SelectedItem
	$form1.close()
	}
	
	$handler_label2_Click= 
	{
	#TODO: Place custom script here
	
	}
	
	$OnLoadForm_StateCorrection=
	{#Correct the initial state of the form to prevent the .Net maximized form issue
		$form1.WindowState = $InitialFormWindowState
		
		Foreach ($Cluster in (Get-VM | Sort Name)){
			$comboBox1.items.add($Cluster)
			$comboBox1.SelectedIndex=0
		}
		$Combobox1.visible = $true
		$label1.visible = $true
		$button1.visible = $true
		$form1.Text = "Please select a VM"
	}
	
	#----------------------------------------------
	#region Generated Form Code
	$form1.AutoScaleMode = 0
	$form1.Text = "Please wait loading VM's...."
	$form1.Name = "form1"
	$form1.DataBindings.DefaultDataSourceUpdateMode = 0
	$System_Drawing_Size = New-Object System.Drawing.Size
	$System_Drawing_Size.Height = 66
	$System_Drawing_Size.Width = 392
	$form1.ClientSize = $System_Drawing_Size
	$form1.FormBorderStyle = 1
	
	$form1.Controls.Add($InfoLabel)
	
	$button1.TabIndex = 2
	$System_Drawing_Size = New-Object System.Drawing.Size
	$System_Drawing_Size.Height = 23
	$System_Drawing_Size.Width = 75
	$button1.Size = $System_Drawing_Size
	$button1.Name = "button1"
	$button1.UseVisualStyleBackColor = $True
	
	$button1.Visible = $False
	$button1.Text = "OK"
	$System_Drawing_Point = New-Object System.Drawing.Point
	$System_Drawing_Point.X = 300
	$System_Drawing_Point.Y = 21
	$button1.Location = $System_Drawing_Point
	
	$button1.DataBindings.DefaultDataSourceUpdateMode = 0
	$button1.add_Click($button1_OnClick)
	
	$form1.Controls.Add($button1)
	
	$label1.TabIndex = 1
	$label1.Font = New-Object System.Drawing.Font("Microsoft Sans Serif",8.25,1,3,1)
	$System_Drawing_Size = New-Object System.Drawing.Size
	$System_Drawing_Size.Height = 23
	$System_Drawing_Size.Width = 50
	$label1.Size = $System_Drawing_Size
	$label1.Name = "label1"
	$label1.Visible = $False
	$label1.Text = "VM:"
	$System_Drawing_Point = New-Object System.Drawing.Point
	$System_Drawing_Point.X = 8
	$System_Drawing_Point.Y = 26
	$label1.Location = $System_Drawing_Point
	
	$label1.DataBindings.DefaultDataSourceUpdateMode = 0
	
	$form1.Controls.Add($label1)
	
	$System_Drawing_Point = New-Object System.Drawing.Point
	$System_Drawing_Point.X = 64
	$System_Drawing_Point.Y = 21
	$comboBox1.Location = $System_Drawing_Point
	$comboBox1.Visible = $False
	$comboBox1.DataBindings.DefaultDataSourceUpdateMode = 0
	$comboBox1.FormattingEnabled = $True
	$comboBox1.Name = "comboBox1"
	$comboBox1.TabIndex = 0
	$System_Drawing_Size = New-Object System.Drawing.Size
	$System_Drawing_Size.Height = 21
	$System_Drawing_Size.Width = 217
	$comboBox1.Size = $System_Drawing_Size
	
	$form1.Controls.Add($comboBox1)
	
	#endregion Generated Form Code
	
	#Save the initial state of the form
	$InitialFormWindowState = $form1.WindowState
	#Init the OnLoad event to correct the initial state of the form
	$form1.add_Load($OnLoadForm_StateCorrection)
		
	#Show the Form
	$form1.ShowDialog()| Out-Null
	
	} #End Function
	
	#Call the Function
	GenerateForm
	
	Get-VM $global:Cluster | % {
	$vm = Get-View $_.ID
	$vms = "" | Select-Object VMName, Hostname, VMState, TotalCPU, TotalMemory, TotalNics, OverallCpuUsage, MemoryUsage, ToolsStatus, MemoryLimit, MemoryReservation, CPUreservation
	$vms.VMName = $vm.Name
#	$vms.Hostname = $vm.hostname
	$vms.Hostname = Get-VMHost -VM $vm.Name
#	Write-Host $vms.Hostname
	$vms.VMState = $vm.summary.runtime.powerState
	$vms.TotalCPU = $vm.summary.config.numcpu
	$vms.TotalMemory = $vm.summary.config.memorysizemb
	$vms.TotalNics = $vm.summary.config.numEthernetCards
	$vms.OverallCpuUsage = $vm.summary.quickStats.OverallCpuUsage
	$vms.MemoryUsage = $vm.summary.quickStats.guestMemoryUsage
	$vms.ToolsStatus = $vm.guest.toolsstatus
	$vms.MemoryLimit = $vm.resourceconfig.memoryallocation.limit
	$vms.MemoryReservation = $vm.resourceconfig.memoryallocation.reservation
	$vms.CPUreservation = $vm.resourceconfig.cpuallocation.reservation
#	$vms.CPUlimit = $vm.resourceconfig.cpuallocation.limit
	$vms.PSTypeNames.Clear()
	$vms.PSTypeNames.Add('Virtu-al.PowerPack.VMInfo')
	$vms.PSTypeNames.Add('Virtu-al.PowerPack.VM')
	$vms
	}
}
Else {
	[System.Windows.Forms.MessageBox]::Show('You must connect to one or more hosts before you can use this node. Please click on the ''Managed Hosts'' node of the VMware PowerPack, connect to one or more of the servers you have configured there, and then try again.','Connection not established',[System.Windows.Forms.MessageBoxButtons]::OK,[System.Windows.Forms.MessageBoxIcon]::Information) | Out-Null
}