Scripts/Get-PCDiskAttributes.ps1
Function Get-PCDiskAttributes { <# .SYNOPSIS Get hard drive information/configuration .DESCRIPTION Get hard drive information/configuration .PARAMETER ComputerName The target computer name .EXAMPLE Get-PCDiskAttributes -ComputerName LabPC2024 .NOTES N/A .LINK N/A #> [CmdletBinding ()] Param ( [Parameter (Mandatory = $True, ValueFromPipeline = $True, ValueFromPipelineByPropertyName = $True, HelpMessage = 'Enter computer name' ) ] [String[]]$ComputerName ) BEGIN { $DriveBusType = @{ '0' = 'Unknown' '1' = 'SCSI' '2' = 'ATAPI' '3' = 'ATA' '4' = '1394' '5' = 'SSA' '6' = 'Fiber channel' '7' = 'USB' '8' = 'RAID' '9' = 'iSCSI' '10' = 'SAS' '11' = 'SATA' '12' = 'SD' '13' = 'MMC' '14' = 'MAX' '15' = 'File backed virtual' '16' = 'Storage spaces' '17' = 'NVMe' '18' = 'Microsoft reserved' } $DriveHealthStatus = @{ '0' = 'Healthy' '1' = 'Warning' '2' = 'Unhealthy' '5' = 'Unknown' } $DriveMeadiaType = @{ '0' = 'Unspecified' '3' = 'HDD' '4' = 'SSD' '5' = 'SCM' } Function Show-Output ($Computer, $Values, $Status) { If ($Values.Size) { [Int]$HDSize = $Values.Size / 1GB $DriveSize = "$($HDSize)$(' GB')" } [PSCustomObject]@{ ComputerName = $Computer Caption = $Values.FriendlyName Description = $Values.Description Manufacturer = $Values.Manufacturer Model = $Values.Model MediaType = $DriveMeadiaType["$($Values.MediaType)"] BusType = $DriveBusType["$($Values.BusType)"] FirmwareVersion = $Values.FirmareVersion HealthStatus = $DriveHealthStatus["$($Values.HealthStatus)"] Size = $DriveSize LogicalSectorSize = $Values.LogicalSectorSize PhysicalSectorSize = $Values.PhysicalSectorSize SerialNumber = $Values.SerialNumber SlotNumber = $Values.SlotNumber SpindleSpeed = $Values.SpindleSpeed Status = $Status } } } PROCESS { ForEach ($Computer In $ComputerName) { If (Test-Connection -ComputerName $Computer -Count 1 -Quiet) { Try { $Data = Get-WmiObject MSFT_PhysicalDisk -Namespace 'ROOT\Microsoft\Windows\Storage' -ComputerName $Computer | Select-Object * ForEach ($Item In $Data) { Show-Output $Computer.ToUpper() $Item 'Ok' } } Catch { If ($PSItem.Exception.Message -like '*Invalid namespace*') { $ErrorMsg = 'Unavailable' } Else { $ErrorMsg = $PSItem.Exception.Message } Show-Output $Computer.ToUpper() $Null $ErrorMsg } } Else { Show-Output $Computer.ToUpper() $Null 'Unreachable' } } } END {} } |