Monitor Microsoft Storage Spaces Direct / Disk Status

For Monitoring the Virtual Disks, Storage Pools and Storage Jobs i’ve created a simple local Check:

Aswell if you want to have all physical disks from s2d in monitoring:

Only for size and status. Performance could be monitored by calling the Performance Counters.
If you are monitoring a s2d hyper-v cluster I would recommend to check aswell for the FailoverCluster Ressources:

Tho have the correct units in the graph’s you have to add a seperate metric file:
vi local/share/check_mk/web/plugins/metrics/

# -*- encoding: utf-8; py-indent-offset: 4 -*-
metric_info["allocatedsize"] = {
    "title": _("Allocated size"),
    "unit": "bytes",
    "color": "#FF0000",
metric_info["footprintonpool"] = {
    "title": _("Footprint on Pool"),
    "unit": "bytes",
    "color": "#FFFF00",
metric_info["size"] = {
    "title": _("Size"),
    "unit": "bytes",
    "color": "blue",


I have installed your check on my server, and it finds all disks and lists them in checkmk. To make sure it works, I connected a disk with SMART errors to a device and tested the script again, it still reports the disk to be fine.
I am managing linux servers too, and these use smartmontools which works fine. you can have smartmontools on windows x64 too, has a precompiled version.
My knowledge in powershell scripting is really small, is it possible to adopt the smart script from linux clients to windows and powershell? We would be able to see much more details about the disks.

Thank you for the scripts, they are a good starting point!

I’ve made a small change to your code - on some windows boxes there are blanks within the serial field. This removes those artifactes:

Other than that - probe is nice and fits nicely into my just published smart probing script :slight_smile:

Best regards

$pdisks = Get-PhysicalDisk | Where { $_.FriendlyName -ne “HP LOGICAL VOLUME” } | Select FriendlyName, SerialNumber, OperationalStatus, HealthStatus, Usage, Size,

AllocatedSize, VirtualDiskFootprint
foreach ($pdisk in $pdisks) {
if ($pdisk.OperationalStatus -eq “OK” -and $pdisk.HealthStatus -eq “Healthy”) {
# All good
$status = “0”
#Remove Whitespaces
$serial=$pdisk.SerialNumber.replace(’ ‘,’’)
$diskname = $pdisk.Friendlyname -replace ‘\s’,’’
$diskname = $pdisk.Friendlyname -replace ’ ‘,’’
$statusText = “OK - " + $diskname + " is in good state. OperationalStatus:” + $pdisk.OperationalStatus + " | HealthStatus:" + $pdisk.HealthStatus + " | Usage: " +

$pdisk.Usage + " | Size:" + $pdisk.Size + " | SN:" + $serial
} else {
$status = “1”
$statusText = “Warning - " + $diskname + " is in unusual state. OperationalStatus:” + $pdisk.OperationalStatus + " | HealthStatus:" + $pdisk.HealthStatus + " |

Usage: " + $pdisk.Usage + " | Size:" + $pdisk.Size + " | SN:" + $serial
$perfdataVirtualDisk = “size=” + $pdisk.Size + “|allocatedsize=” + $pdisk.AllocatedSize + “|virtualdiskfootprint=” + $pdisk.VirtualDiskFootprint
$stringToPost = $status + " S2D_PhysicalDisk_" + $serial + " " + $perfdataVirtualDisk + " " + $statusText
Write-Host $stringToPost

Good idea, i’ve added this aswell in my code.

I’m not 100% sure, but I guess when in an S2D Environment the additional smartmonitor won’t work. The Get-Physicaldisk cmdlet should report disk issues when appearing - but i’m not sure if they are watching the smart counters the same as traditional tools.
For example: In Server 2019 they detect disk issues by comparing the disk latency against other disks from the same type of the server.