Skip to main content

PowerShell script to check the drive space of each server, and send an email if any are below a given threshold.

[Source](http://gavindraper.com/2012/09/22/automatic-low-hard-disk-alerts-for-windows-server/ "Permalink to Automated Disk Space Alerts For Windows Server")

# Automated Disk Space Alerts For Windows Server

### PowerShell Style

I recently needed to automate disk alerts for each of our servers, to keep it
simple I wrote a little PowerShell script to check the drive space of each
server I'm interested in and send an email if any are below a given threshold. I
then configured a scheduled task on one of the servers to run this script every
hour. It seems to work quite well so far, touch wood.

The script looks like this....

    $minGbThreshold = 25;
    $computers = "localhost", "server1", "server2";
    $smtpAddress = "smtp.myserver.com";
    $toAddress = "gavin@gavin.com";
    $fromAddress = "alerter@gavin.com";

    foreach($computer in $computers)
    {
        $disks = Get-WmiObject -ComputerName $computer -Class Win32_LogicalDisk -Filter "DriveType = 3";
        $computer = $computer.toupper();
        $deviceID = $disk.DeviceID;
        foreach($disk in $disks)
        {
            $freeSpaceGB = [Math]::Round([float]$disk.FreeSpace / 1073741824, 2);
            if($freeSpaceGB -lt $minGbThreshold)
            {
                $smtp = New-Object Net.Mail.SmtpClient($smtpAddress)
                $msg = New-Object Net.Mail.MailMessage
                $msg.To.Add($toAddress)
                $msg.From = $fromAddress
                $msg.Subject = "Diskspace below threshold " + $computer + "" + $disk.DeviceId
                $msg.Body = $computer + "" + $disk.DeviceId + " " + $freeSpaceGB + "GB Remaining";
                $smtp.Send($msg)
            }
        }
    }

As you can see the top 5 lines are the configuration variables that define the
parameters for the script to run within.

To make the script run as a scheduled task without having PowerShell flash up on
the server I used the hidden window style argument in the program to run textbox
of the Windows Task Scheduler. It looks like this...

    PowerShell.exe -WindowStyle "Hidden" Script.ps1