The script:
<# .Description Function to get a VM's hard disk and RDM info Originally from Sep 2011, updated Dec 2013 -- vNugglets.com .Example Get-VMDiskAndRDM -vmName someVM -ShowVMDKDatastorePath | ft -a VMName HardDiskName ScsiId DeviceDisplayName SizeGB ScsiCanonicalName VMDKDStorePath ------ ------------ ------ ----------------- ------ ----------------- -------------- someVM Hard disk 1 0:0 50 [dstore0] someVM/someVM.vmdk someVM Hard disk 2 1:0 someVM-/log_dir 20 naa.60000945618415615641111111111111 [dstore0] someVM/someVM_1.vmdk Get the disks (including RDMs) for "someVM", and include the datastore path for each VMDK #> function Get-VMDiskAndRDM { param( ## name pattern of the VM guest for which to get info [parameter(Mandatory=$true)][string]$vmName_str = "myVM", ## switch to specify that VMDK's datastore path should also be returned [switch]$ShowVMDKDatastorePath_sw ) ## the cool, FaF way (using .NET View objects) ## get the VM object(s) $arrVMViewsForStorageInfo = Get-View -Viewtype VirtualMachine -Property Name, Config.Hardware.Device, Runtime.Host -Filter @{"Name" = "$vmName_str"} if (($arrVMViewsForStorageInfo | Measure-Object).Count -eq 0) {Write-Warning "No VirtualMachine objects found matching name pattern '$vmName_str'"; exit} ## end if $arrVMViewsForStorageInfo | %{ $viewVMForStorageInfo = $_ ## get the view of the host on which the VM currently resides $viewHostWithStorage = Get-View -Id $viewVMForStorageInfo.Runtime.Host -Property Config.StorageDevice.ScsiLun $viewVMForStorageInfo.Config.Hardware.Device | ?{$_ -is [VMware.Vim.VirtualDisk]} | %{ $hdThisDisk = $_ $oScsiLun = $viewHostWithStorage.Config.StorageDevice.ScsiLun | ?{$_.UUID -eq $hdThisDisk.Backing.LunUuid} ## the properties to return in new object $hshThisVMProperties = @{ VMName = $viewVMForStorageInfo.Name ## the disk's "name", like "Hard disk 1" HardDiskName = $hdThisDisk.DeviceInfo.Label ## get device's SCSI controller and Unit numbers (1:0, 1:3, etc) ScsiId = &{$strControllerKey = $_.ControllerKey.ToString(); "{0}`:{1}" -f $strControllerKey[$strControllerKey.Length - 1], $_.Unitnumber} DeviceDisplayName = $oScsiLun.DisplayName SizeGB = [Math]::Round($_.CapacityInKB / 1MB, 0) ScsiCanonicalName = $oScsiLun.CanonicalName } ## end hsh ## the array of items to select for output $arrPropertiesToSelect = "VMName,HardDiskName,ScsiId,DeviceDisplayName,SizeGB,ScsiCanonicalName".Split(",") ## add property for VMDKDStorePath if desired if ($ShowVMDKDatastorePath_sw -eq $true) {$hshThisVMProperties["VMDKDStorePath"] = $hdThisDisk.Backing.Filename; $arrPropertiesToSelect += "VMDKDStorePath"} New-Object -Type PSObject -Property $hshThisVMProperties | Select $arrPropertiesToSelect } ## end foreach-object } ## end foreach-object } ## end function
Some example usage:
PS vN:\> Get-VMDiskAndRDM -vmName myVM01 -ShowVMDKDatastorePath | ft -a VMName HardDiskName ScsiId DeviceDisplayName SizeGB ScsiCanonicalName VMDKDStorePath ------ ------------ ------ ----------------- ------ ----------------- -------------- myVM01 Hard disk 1 0:0 50 [dstore0] myVM01/myVM01.vmdk myVM01 Hard disk 2 1:0 myVM01-/data001 660 naa.60000946665554443331111111111111 [dstore0] myVM01/myVM01_1.vmdk
The disks with no values for the DeviceDisplayName or ScsiCanonicalName properties are the "regular" virtual disks, and the others are RDMs. And, this VM has hard disks on two separate SCSI controllers.
Note: the vmName parameter is used as a regular expression when getting the .NET View object of the given VM. As such, one can use a pattern, and can get info on multiple VMs that share the same name pattern.
And, that is that: some juicy disk/RDM info for VMs, and on the quick! Thanks, Get-View, for keeping things FaF! Enjoy
BTW: related post, Get VM by RDM with PowerCLI: how to get the VM that is using a particular SAN storage device as an RDM.