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

}