Hi,
I am having issue getting vendor details for the volumes as it showing the same vendor name for all the disks instead of its respective vendor name. we have presented the RDM disks from two storage one is Pure and another is Nimble, for all the disks, it showing Vendor as Pure only 😞
Please help
$DiskInfo= @()
foreach ($VMview in Get-VM mysql03 | Get-View){
foreach ($VirtualSCSIController in ($VMView.Config.Hardware.Device | where {$_.DeviceInfo.Label -match "SCSI Controller"})) {
foreach ($VirtualDiskDevice in ($VMView.Config.Hardware.Device | where {$_.ControllerKey -eq $VirtualSCSIController.Key})) {
$VirtualDisk = "" | Select VMname, SCSIController, DiskName, SCSI_ID, DeviceName, DiskFile, DiskSize, Vendor
$VirtualDisk.VMname = $VMview.Name
$VirtualDisk.SCSIController = $VirtualSCSIController.DeviceInfo.Label
$VirtualDisk.DiskName = $VirtualDiskDevice.DeviceInfo.Label
$VirtualDisk.SCSI_ID = "$($VirtualSCSIController.BusNumber) : $($VirtualDiskDevice.UnitNumber)"
#$VirtualDisk.DeviceName = $VirtualDiskDevice.Backing.DeviceName.substring(22) -replace ".{12}$"
#$VirtualDisk.DeviceName = $VirtualDiskDevice.Backing.DeviceName.substring(22,24).ToUpper()
$VirtualDisk.DeviceName = $VirtualDiskDevice.Backing.DeviceName.Where{$_ -ne ''} | %{$_.Substring(22,24).ToUpper()}
$VirtualDisk.DiskFile = $VirtualDiskDevice.Backing.FileName
$VirtualDisk.DiskSize = $VirtualDiskDevice.CapacityInKB * 1KB / 1GB
$esxcli = Get-EsxCli -VMHost (Get-View -Id $VMview.Runtime.Host -Property Name).Name -V2
$ds = Get-View -Id $VirtualDiskDevice.Backing.Datastore
$VirtualDisk.Vendor = $esxcli.storage.core.device.list.Invoke(@{device = $ds.Info.Vmfs.Extent[0].DiskName }).Vendor
$DiskInfo += $VirtualDisk
}}}
$DiskInfo | Sort VMname, SCSI_ID | ft -auto
You can try something like this
$DiskInfo = @()
foreach ($VMview in Get-VM mysql03 | Get-View) {
foreach ($VirtualSCSIController in ($VMView.Config.Hardware.Device | Where-Object { $_.DeviceInfo.Label -match "SCSI Controller" })) {
foreach ($VirtualDiskDevice in ($VMView.Config.Hardware.Device | Where-Object { $_.ControllerKey -eq $VirtualSCSIController.Key })) {
$VirtualDisk = "" | Select-Object VMname, SCSIController, DiskName, SCSI_ID, DeviceName, DiskFile, DiskSize, Vendor
$VirtualDisk.VMname = $VMview.Name
$VirtualDisk.SCSIController = $VirtualSCSIController.DeviceInfo.Label
$VirtualDisk.DiskName = $VirtualDiskDevice.DeviceInfo.Label
$VirtualDisk.SCSI_ID = "$($VirtualSCSIController.BusNumber) : $($VirtualDiskDevice.UnitNumber)"
$VirtualDisk.DeviceName = $VirtualDiskDevice.Backing.DeviceName.Where{ $_ -ne '' } | ForEach-Object { $_.Substring(22, 24).ToUpper() }
$VirtualDisk.DiskFile = $VirtualDiskDevice.Backing.FileName
$VirtualDisk.DiskSize = $VirtualDiskDevice.CapacityInKB * 1KB / 1GB
$esxcli = Get-EsxCli -VMHost (Get-View -Id $VMview.Runtime.Host -Property Name).Name -V2
if ($VirtualDiskDevice.Backing.CompatibilityMode -in 'physicalMode','virtualmode'){
$devName = $VirtualDiskDevice.Backing.DeviceName
}
else{
$ds = Get-View -Id $VirtualDiskDevice.Backing.Datastore
$devName = $ds.Info.Vmfs.Extent[0].DiskName
}
$VirtualDisk.Vendor = $esxcli.storage.core.device.list.Invoke(@{device = $devName}).Vendor
$DiskInfo += $VirtualDisk
}
}
}
$DiskInfo | Sort-Object VMname, SCSI_ID | Format-Table -auto
On a side note, this will not work when using VSAN.
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
The script is using the datastore on which the VMDK is sitting, to determine the Vendor.
Is the Datastore part in the DiskFile property the same or different?
Update: this snippet does not take RDMs into account.
It looks at the header VMDK datastore, not the RDM LUN, to determine the vendor.
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
LucD,
Is there a way to get the details of the RDM from the above script based on the device name?
You can try something like this
$DiskInfo = @()
foreach ($VMview in Get-VM mysql03 | Get-View) {
foreach ($VirtualSCSIController in ($VMView.Config.Hardware.Device | Where-Object { $_.DeviceInfo.Label -match "SCSI Controller" })) {
foreach ($VirtualDiskDevice in ($VMView.Config.Hardware.Device | Where-Object { $_.ControllerKey -eq $VirtualSCSIController.Key })) {
$VirtualDisk = "" | Select-Object VMname, SCSIController, DiskName, SCSI_ID, DeviceName, DiskFile, DiskSize, Vendor
$VirtualDisk.VMname = $VMview.Name
$VirtualDisk.SCSIController = $VirtualSCSIController.DeviceInfo.Label
$VirtualDisk.DiskName = $VirtualDiskDevice.DeviceInfo.Label
$VirtualDisk.SCSI_ID = "$($VirtualSCSIController.BusNumber) : $($VirtualDiskDevice.UnitNumber)"
$VirtualDisk.DeviceName = $VirtualDiskDevice.Backing.DeviceName.Where{ $_ -ne '' } | ForEach-Object { $_.Substring(22, 24).ToUpper() }
$VirtualDisk.DiskFile = $VirtualDiskDevice.Backing.FileName
$VirtualDisk.DiskSize = $VirtualDiskDevice.CapacityInKB * 1KB / 1GB
$esxcli = Get-EsxCli -VMHost (Get-View -Id $VMview.Runtime.Host -Property Name).Name -V2
if ($VirtualDiskDevice.Backing.CompatibilityMode -in 'physicalMode','virtualmode'){
$devName = $VirtualDiskDevice.Backing.DeviceName
}
else{
$ds = Get-View -Id $VirtualDiskDevice.Backing.Datastore
$devName = $ds.Info.Vmfs.Extent[0].DiskName
}
$VirtualDisk.Vendor = $esxcli.storage.core.device.list.Invoke(@{device = $devName}).Vendor
$DiskInfo += $VirtualDisk
}
}
}
$DiskInfo | Sort-Object VMname, SCSI_ID | Format-Table -auto
On a side note, this will not work when using VSAN.
Blog: lucd.info Twitter: @LucD22 Co-author PowerCLI Reference
ok got it...That worked perfectly now
Thank you very much 🙂