This script will monitor the available free space on the Cluster Shared Volumes and if they fall below a set threshold it will send a webhook alert or an email.

You can call this in the task scheduler of a cluster node member.

I wrote this after I noticed that most monitoring tools don't see Cluster Shared Volumes and can't be used to warn if you are running out of space.

Updated: Added switch and input parameters to choose between an email alert or a webhook POST.



[Parameter(ParameterSetName='email',Mandatory=$false)][string]$smtpServer = '', 
[Parameter(ParameterSetName='email',Mandatory=$false)][int]$smtpPort = '25', 
[Parameter(ParameterSetName='email',Mandatory=$false)][string]$mailFrom = '', 
[Parameter(ParameterSetName='email',Mandatory=$false)][string]$mailTo = '', 
[Parameter(ParameterSetName='email',Mandatory=$false)][string]$subject = '[Warning] Free Space on Cluster Storage Volume is low' 
   Checks the available space on cluster Shared Volumes and sends an alert if free space is below set threshold.  
   Riccardo Toni: 2018/06/27  
   Version 1.1  
   Checks free CSV space and sends a webhook or email alert if available space falls below a set threshold.  
   Run the script as a (elevated) scheduled task on a member node of the Hyper-V Cluster. 
   .\Get-ClusterStorageVolumeFreeSpace.ps1 -WebHook -Uri '' 
    To send an email alert instead of a webhook POST: 
    .\Get-ClusterStorageVolumeFreeSpace.ps1 -Email 
# Percent of freespace on CSV to trigger an alert.  
[int]$MinFree = 75  
Import-Module FailoverClusters  
$clustername = Get-Cluster  
$objs = @() 
$CurrentFree = @{}  
$csvs = Get-ClusterSharedVolume  
foreach ( $csv in $csvs )  
    $csvinfos = $csv | select -Property Name -ExpandProperty SharedVolumeInfo  
    foreach ( $csvinfo in $csvinfos )  
        $obj = New-Object PSObject -Property @{  
            Name        = $csv.Name  
            Path        = $csvinfo.FriendlyVolumeName  
            Size        = $csvinfo.Partition.Size  
            FreeSpace   = $csvinfo.Partition.FreeSpace  
            UsedSpace   = $csvinfo.Partition.UsedSpace  
            PercentFree = $csvinfo.Partition.PercentFree  
        $objs +$obj 
        if ($webhook) 
            # Sends Webhook Alert 
            if ($($obj.PercentFree) -lt $MinFree) 
                $notificationPayload = @{ text=”WARNING: Free space on $($obj.Name) CSV is below warning threshold - Current free space: $($obj.PercentFree)%” }  
                Invoke-RestMethod -Uri $uri -Method Post -Body (ConvertTo-Json $notificationPayload)    
        if ($email) 
            # Sends Email Alert 
            if ($($obj.PercentFree) -lt $MinFree) 
                $body = "WARNING: Free space on $($obj.Name) CSV is below warning threshold." 
                $body +"<br></br>" 
                $body +"<b>Current free space: $($obj.PercentFree)%" 
                Send-MailMessage -From $mailFrom -Subject $subject -To $mailTo -SmtpServer $smtpServer -Port $smtpPort -Body $body -BodyAsHtml