How to Check SSD Health and Wear Level in Windows 11 Using PowerShell

Solid-state drives (SSDs) utilize NAND flash memory to store digital data. Unlike mechanical hard drives with magnetic platters, NAND flash memory cells experience physical degradation with every programmatic write and erase cycle. Over time, as maximum endurance thresholds (Total Bytes Written, or TBW) approach, SSDs lose retention capability and eventually switch into read-only mode to prevent catastrophic data loss.

While third-party utilities like CrystalDiskInfo provide convenient graphical summaries, enterprise environments and automated maintenance scripts require native command-line auditing. Windows 11 contains built-in PowerShell cmdlets within its native Storage module that query controller telemetry directly, reporting SSD health, temperature history, and exact wear level percentages without installing unverified software.

Querying Physical Disks with Get-PhysicalDisk

To begin auditing storage hardware, open an elevated PowerShell prompt on Windows 11:

  1. Right-click the Start button on the taskbar.
  2. Select Terminal (Admin) or PowerShell (Admin).
  3. Run the Get-PhysicalDisk cmdlet to enumerate installed drives:
    Get-PhysicalDisk | Select-Object DeviceId, FriendlyName, MediaType, BusType, OperationalStatus, HealthStatus

Verify that your drive reports a MediaType of SSD and an OperationalStatus of OK.

Extracting Low-Level SSD Wear and Reliability Counters

The dedicated cmdlet Get-StorageReliabilityCounter queries NVMe and SATA SMART telemetry directly from the storage controller. Pipe the physical disk object into the reliability counter:

Get-PhysicalDisk | Get-StorageReliabilityCounter | Format-List

This command outputs an exhaustive telemetry block containing crucial hardware metrics:

DeviceId                   : 0
Wear                       : 8
Temperature                : 36
TemperatureMax             : 62
PowerOnHours               : 4820
ReadErrorsTotal            : 0
ReadErrorsCorrected        : 0
ReadErrorsUncorrected      : 0
WriteErrorsTotal           : 0
FlushLatencyMax            : 18
LoadUnloadCycleCountMax    : 0

Interpreting Critical SSD Health Metrics

Carefully evaluate the following attributes to determine disk longevity:

  • Wear (Wear Level Percentage): Indicates the percentage of estimated drive lifespan consumed. A value of 8 means 8% of the NAND write endurance has been used, leaving 92% remaining life. If this counter approaches 90 or higher, replace the drive promptly.
  • Temperature and TemperatureMax: Reports the current and peak historical temperatures in degrees Celsius. High-performance PCIe Gen 4 and Gen 5 NVMe drives exceeding 70°C undergo thermal throttling, reducing write throughput.
  • ReadErrorsUncorrected: The count of uncorrectable read errors. In a healthy drive, this counter must strictly remain 0. Any non-zero value indicates defective NAND blocks or failing controller channels.
  • PowerOnHours: The cumulative lifetime operating hours of the drive.

Generating a Formatted SSD Audit Summary Report

To combine disk model names with their corresponding wear and temperature metrics in a clean, readable table:

Get-PhysicalDisk | Where-Object { $_.MediaType -eq 'SSD' } | ForEach-Object {
    $disk = $_
    $counter = $disk | Get-StorageReliabilityCounter
    [PSCustomObject]@{
        'Device ID'       = $disk.DeviceId
        'Model'           = $disk.FriendlyName
        'Bus Type'        = $disk.BusType
        'Wear Used (%)'   = $counter.Wear
        'Remaining (%)'   = 100 - $counter.Wear
        'Current Temp (C)'= $counter.Temperature
        'Max Temp (C)'    = $counter.TemperatureMax
        'Uncorrected Err' = $counter.ReadErrorsUncorrected
        'Status'          = $disk.HealthStatus
    }
} | Format-Table -AutoSize

Automating Alerts for Worn or Failing SSDs

For system administrators managing remote servers or fleet workstations, integrate a threshold check into automated monitoring pipelines:

$criticalDrives = Get-PhysicalDisk | Where-Object { $_.MediaType -eq 'SSD' } | ForEach-Object {
    $counter = $_ | Get-StorageReliabilityCounter
    if ($counter.Wear -gt 85 -or $counter.ReadErrorsUncorrected -gt 0) {
        [PSCustomObject]@{
            Disk = $_.FriendlyName
            Wear = $counter.Wear
            UncorrectedErrors = $counter.ReadErrorsUncorrected
        }
    }
}

if ($criticalDrives) {
    Write-Warning "Critical storage warning detected on one or more SSDs!"
    $criticalDrives | Out-String | Write-Warning
} else {
    Write-Host "All solid-state drives are within healthy operating parameters." -ForegroundColor Green
}

Auditing SSD wear levels natively via PowerShell ensures predictable storage lifecycles and guards against unexpected data loss in Windows environments.

Get the best tech tips delivered straight to your inbox.

Join thousands of readers mastering Apple, Google, Microsoft, and Linux.