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"
}
}
|