Get-ScsiDisks: Combine Physicaldisk and Logicaldisk Objects

Hi there, following function Get-ScsiDisks retrieves disk details for VMWare Guests or any computer with corresponding SCSI disk details like SCSI ID and SCSI Bus. The function concatenates objects consisting of Win32_DiskDrive, Win32_LogicalDisk and Win32_DiskDriveToDiskPartition using WMI. For WinRM you can use Invoke-Command and inject the script.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
Function Get-ScsiDisks
{
<#
.SYNOPSIS
    Retrieves disk details for VMWare Guests with corresponding SCSI disk details like SCSI ID
    and SCSI Bus.

.DESCRIPTION
    Retrieves a concatenated object consisting of Win32_DiskDrive, Win32_LogicalDisk and
    Win32_DiskDriveToDiskPartition using WMI. For WinRM you can use Invoke-Command and inject the script.

.PARAMETER ComputerName
    A single Computer or an array of computer names. The default is localhost ($env:COMPUTERNAME).

.PARAMETER Credentials
    Commit Credentials for a different domain.

.PARAMETER Verbose
    Run in Verbose Mode.

.EXAMPLE
    PS C:> Get-ScsiDisks

    ComputerName    Disk               DriveLetter VolumeName  Size FreeSpace DiskModel
    ------------    ----               ----------- ----------  ---- --------- ---------
    SERVER          \.PHYSICALDRIVE1 D:          Data         767       767 VMware Virtual di...
    SERVER          \.PHYSICALDRIVE0 C:          OS            59        39 VMware Virtual di...

.EXAMPLE
	PS C:> Get-ScsiDisks | Out-GridView

.EXAMPLE
	PS C:> Get-ScsiDisks | ft -a

.EXAMPLE
	PS C:> Get-ScsiDisks -ComputerName (gc 'C:VMs.txt') -Credentials Get-Credential

.LINK

Home


.NOTES
    Author:  Sebastian Gräf
    Email:   ps@graef.io
    Date:    September 12, 2017
    PSVer:   3.0/4.0/5.0
#>

	[Cmdletbinding()]
	Param (
		[Parameter(ValueFromPipelineByPropertyName = $true, ValueFromPipeline = $true)]
		$ComputerName = $Env:COMPUTERNAME,
		[Parameter(ValueFromPipelineByPropertyName = $true, ValueFromPipeline = $true)]
		[ValidateNotNull()]
		[System.Management.Automation.PSCredential][System.Management.Automation.Credential()]
		$Credentials = [System.Management.Automation.PSCredential]::Empty
	)

	Begin
	{
		Write-Verbose " [$($MyInvocation.InvocationName)] :: Start Process"
		$result=@()
		$ProgressCounter = 0
	}


	Process
	{
		foreach ($Computer in $ComputerName)
		{
			$ProgressCounter++
			Write-Progress -activity "Running on $Computer" -status "Please wait ..." -PercentComplete (($ProgressCounter / $ComputerName.length) * 100)
			if (Test-Connection $Computer -Count 1 -Quiet)
			{
				Write-Verbose " [$($MyInvocation.InvocationName)] :: Processing $Computer"
				try
				{
					Get-WmiObject -Class Win32_DiskDrive -ComputerName $Computer -Credential $Credentials | % {
						$disk = $_
						$partitions = "ASSOCIATORS OF " +
						"{Win32_DiskDrive.DeviceID='$($disk.DeviceID)'} " +
						"WHERE AssocClass = Win32_DiskDriveToDiskPartition"
						Get-WmiObject -Query $partitions -ComputerName $Computer -Credential $Credentials | % {
							$partition = $_
							$drives = "ASSOCIATORS OF " +
							"{Win32_DiskPartition.DeviceID='$($partition.DeviceID)'} " +
							"WHERE AssocClass = Win32_LogicalDiskToPartition"
							Get-WmiObject -Query $drives -ComputerName $Computer -Credential $Credentials | % {
								$obj = New-Object -Type PSCustomObject -Property @{
									ComputerName = $Computer
									Disk = $disk.DeviceID
									DiskSize = [math]::Truncate($disk.Size / 1GB);
									DiskModel = $disk.Model
									Partition = $partition.Name
									DriveLetter = $_.DeviceID
									VolumeName = $_.VolumeName
									Size = [math]::Truncate($_.Size / 1GB)
									FreeSpace = [math]::Truncate($_.FreeSpace / 1GB)
									SCSIBus = $disk.SCSIBus
									SCSITargetId = $disk.SCSITargetId
								}
								$result += $obj
							}
						}
					}
				}
				catch
				{
					Write-Verbose " Host [$Computer] Failed with Error: $($Error[0])"
				}
			}
			else
			{
				Write-Verbose " Host [$Computer] Failed Connectivity Test"
			}
		}
        $result | select ComputerName,Disk,DriveLetter,VolumeName,Size,FreeSpace,DiskModel,Partition,SCSIBus,SCSITargetId
	}
	End
	{
		Write-Progress -activity "Running on $Computer" -Status "Completed." -Completed
		Write-Verbose " [$($MyInvocation.InvocationName)] :: End Process"
	}
}