Setting Low Disk Space Alerts on Windows Server 2008

I was wondering if there is an easy way to trigger an e-mail alert on Windows Server 2008 when any logical disk partitions become low on space. I have 2 SQL servers that have come close to running out of disk space because of the DB log files.

Thanks, Ryan

Answers 7

  • One simple way to get Windows Server 2008 to send low disk space e-mail alerts is to use Task Scheduler and the System Log. If the free space falls below the percentage specified in HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\DiskSpaceThreshold, an event is recorded in the System Log that can trigger a task to send an e-mail message.

    1. Open Task Scheduler and create a new task.
    2. Enter a name for the task, select "Run whether user is logged on or not", and check "Do not store password."
    3. Add a new trigger on the Triggers tab.
    4. Select "On an event" in the "Begin the task" box.
    5. Set Log to "System", Source to "srv", and Event ID to "2013".
    6. Add a new action on the Actions tab.
    7. Set Action to "Send an e-mail" and fill in the rest of the settings appropriately.
    8. To configure when the low disk space event is recorded in the System Log, open the Registry Editor, navigate to HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters and add a DWORD value named “DiskSpaceThreshold”, setting it to the desired percentage. When the entry does not exist, the default value is 10.


  • Why don't you run a powershell script as a schedule task every day? If the script find the free space of the disk is lower than 10%, it will send you an email or notification.

    here is an example code for checking the free space of the disks:

    Get-Content ForEach-Object { $; Get-WMIObject –computername $ Win32_LogicalDisk -filter "DriveType=3" | ForEach-Object { $.DeviceID; $.FreeSpace/1GB } }


  • Both examples do not work because of incorrect PowerShell syntax. The following code lists the volume sizes of the current host (using PowerShell 5.0):

    Get-WmiObject win32_logicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB }
    

    The following code lists the volume sizes of hosts listed in server.txt:

    Get-Content server.txt | %{ Get-WMIObject –computername $_ Win32_LogicalDisk -filter "DriveType=3" | %{ $_.DeviceID; $_.FreeSpace/1GB } }
    

    Sidenote

    Note that the outer place holder $_ enumerates the server addresses whereas the inner place holder $_ enumerates the devices. That's a frequent gotcha for PowerShell newbies. If you wanted to use the server address in the inner loop, you'd have to assign it to a new variable in the outer loop.

    The forum software used here is flawed. In post previews, it displays $_ correctly as a $_ even if not escaped as code. But the final post removes the underscore, thus making the PowerShell examples incorrect.


  • You can use this script to send an email using your email server. Just replace the name of smtp server name with that of your server. If on the same machine then use "localhost" (smtp server must be functional). The script is found here as well: https://gallery.technet.microsoft.com/scriptcenter/Disk-Space-Report-Reports-98e64d65

    After the script is saved in local drive, it can be easily run using powershell and tested. Once script seems to work fine, then it can be scheduled to run everyday or every hour based on requirement using windows task scheduler. This article explains how to run a script using task scheduler. https://www.metalogix.com/help/Content%20Matrix%20Console/SharePoint%20Edition/002_HowTo/004_SharePointActions/012_SchedulingPowerShell.htm

    ############################################################################# 
    #                                                                                                                                                     # 
    #  Check disk space and send an HTML report as the body of an email.                                                   # 
    #  Reports only disks on computers that have low disk space.                                                                 # 
    #  Author: Mike Carmody                                                                                                                   # 
    #  Some ideas extracted from Thiyagu's Exchange DiskspaceHTMLReport module.                                  # 
    #  Date: 8/10/2011                                                          # 
    #  I have not added any error checking into this script yet.                # 
    #                                                                           # 
    #                                                                           # 
    ############################################################################# 
    # Continue even if there are errors 
    $ErrorActionPreference = "Continue"; 
    
    ######################################################################################### 
    # Items to change to make it work for you. 
    # 
    # EMAIL PROPERTIES 
    #  - the $users that this report will be sent to. 
    #  - near the end of the script the smtpserver, From and Subject. 
    
    # REPORT PROPERTIES 
    #  - you can edit the report path and report name of the html file that is the report.  
    ######################################################################################### 
    
    # Set your warning and critical thresholds 
    $percentWarning = 15; 
    $percentCritcal = 10; 
    
    # EMAIL PROPERTIES 
     # Set the recipients of the report. 
      $users = "[email protected]" 
        #$users = "[email protected]" # I use this for testing by uing my email address. 
      #$users = "[email protected]", "[email protected]", "[email protected]";  # can be sent to individuals. 
    
    
    # REPORT PROPERTIES 
     # Path to the report 
      $reportPath = "D:\Jobs\DiskSpaceQuery\Reports\"; 
    
     # Report name 
      $reportName = "DiskSpaceRpt_$(get-date -format ddMMyyyy).html"; 
    
    # Path and Report name together 
    $diskReport = $reportPath + $reportName 
    
    #Set colors for table cell backgrounds 
    $redColor = "#FF0000" 
    $orangeColor = "#FBB917" 
    $whiteColor = "#FFFFFF" 
    
    # Count if any computers have low disk space.  Do not send report if less than 1. 
    $i = 0; 
    
    # Get computer list to check disk space 
    $computers = Get-Content "servers_c.txt"; 
    $datetime = Get-Date -Format "MM-dd-yyyy_HHmmss"; 
    
    # Remove the report if it has already been run today so it does not append to the existing report 
    If (Test-Path $diskReport) 
        { 
            Remove-Item $diskReport 
        } 
    
    # Cleanup old files.. 
    $Daysback = "-7" 
    $CurrentDate = Get-Date; 
    $DateToDelete = $CurrentDate.AddDays($Daysback); 
    Get-ChildItem $reportPath | Where-Object { $_.LastWriteTime -lt $DatetoDelete } | Remove-Item; 
    
    # Create and write HTML Header of report 
    $titleDate = get-date -uformat "%m-%d-%Y - %A" 
    $header = " 
      <html> 
      <head> 
      <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'> 
      <title>DiskSpace Report</title> 
      <STYLE TYPE='text/css'> 
      <!-- 
      td { 
       font-family: Tahoma; 
       font-size: 11px; 
       border-top: 1px solid #999999; 
       border-right: 1px solid #999999; 
       border-bottom: 1px solid #999999; 
       border-left: 1px solid #999999; 
       padding-top: 0px; 
       padding-right: 0px; 
       padding-bottom: 0px; 
       padding-left: 0px; 
      } 
      body { 
       margin-left: 5px; 
       margin-top: 5px; 
       margin-right: 0px; 
       margin-bottom: 10px; 
       table { 
       border: thin solid #000000; 
      } 
      --> 
      </style> 
      </head> 
      <body> 
      <table width='100%'> 
      <tr bgcolor='#CCCCCC'> 
      <td colspan='7' height='25' align='center'> 
      <font face='tahoma' color='#003399' size='4'><strong>AEM Environment DiskSpace Report for $titledate</strong></font> 
      </td> 
      </tr> 
      </table> 
    " 
     Add-Content $diskReport $header 
    
    # Create and write Table header for report 
     $tableHeader = " 
     <table width='100%'><tbody> 
     <tr bgcolor=#CCCCCC> 
        <td width='10%' align='center'>Server</td> 
     <td width='5%' align='center'>Drive</td> 
     <td width='15%' align='center'>Drive Label</td> 
     <td width='10%' align='center'>Total Capacity(GB)</td> 
     <td width='10%' align='center'>Used Capacity(GB)</td> 
     <td width='10%' align='center'>Free Space(GB)</td> 
     <td width='5%' align='center'>Freespace %</td> 
     </tr> 
    " 
    Add-Content $diskReport $tableHeader 
    
    # Start processing disk space reports against a list of servers 
      foreach($computer in $computers) 
     {  
     $disks = Get-WmiObject -ComputerName $computer -Class Win32_LogicalDisk -Filter "DriveType = 3" 
     $computer = $computer.toupper() 
      foreach($disk in $disks) 
     {         
      $deviceID = $disk.DeviceID; 
            $volName = $disk.VolumeName; 
      [float]$size = $disk.Size; 
      [float]$freespace = $disk.FreeSpace;  
      $percentFree = [Math]::Round(($freespace / $size) * 100, 2); 
      $sizeGB = [Math]::Round($size / 1073741824, 2); 
      $freeSpaceGB = [Math]::Round($freespace / 1073741824, 2); 
            $usedSpaceGB = $sizeGB - $freeSpaceGB; 
            $color = $whiteColor; 
    
    # Set background color to Orange if just a warning 
     if($percentFree -lt $percentWarning)       
      { 
        $color = $orangeColor  
    
    # Set background color to Orange if space is Critical 
          if($percentFree -lt $percentCritcal) 
            { 
            $color = $redColor 
           }         
    
     # Create table data rows  
        $dataRow = " 
      <tr> 
            <td width='10%'>$computer</td> 
      <td width='5%' align='center'>$deviceID</td> 
      <td width='15%' >$volName</td> 
      <td width='10%' align='center'>$sizeGB</td> 
      <td width='10%' align='center'>$usedSpaceGB</td> 
      <td width='10%' align='center'>$freeSpaceGB</td> 
      <td width='5%' bgcolor=`'$color`' align='center'>$percentFree</td> 
      </tr> 
    " 
    Add-Content $diskReport $dataRow; 
    Write-Host -ForegroundColor DarkYellow "$computer $deviceID percentage free space = $percentFree"; 
        $i++   
      } 
     } 
    } 
    
    # Create table at end of report showing legend of colors for the critical and warning 
     $tableDescription = " 
     </table><br><table width='20%'> 
     <tr bgcolor='White'> 
        <td width='10%' align='center' bgcolor='#FBB917'>Warning less than 15% free space</td> 
     <td width='10%' align='center' bgcolor='#FF0000'>Critical less than 10% free space</td> 
     </tr> 
    " 
      Add-Content $diskReport $tableDescription 
     Add-Content $diskReport "</body></html>" 
    
    # Send Notification if alert $i is greater then 0 
    if ($i -gt 0) 
    { 
        foreach ($user in $users) 
    { 
            Write-Host "Sending Email notification to $user" 
    
      $smtpServer = "MySMTPServer" 
      $smtp = New-Object Net.Mail.SmtpClient($smtpServer) 
      $msg = New-Object Net.Mail.MailMessage 
      $msg.To.Add($user) 
            $msg.From = "[email protected]" 
      $msg.Subject = "Environment DiskSpace Report for $titledate" 
            $msg.IsBodyHTML = $true 
            $msg.Body = get-content $diskReport 
      $smtp.Send($msg) 
            $body = "" 
        } 
      } 
    

  • I have fixed the script. Just create a text file named for example server.txt and include the ip address or servernames and then you can execute the following script

    Get-Content server.txt | foreach-object{Get-WmiObject -ComputerName 192.168.22.208 win32_logicalDisk -filter "DriveType=3"|ForEach-Object{$.DeviceID; $.FreeSpace/1GB}}

    Regards, Luis.


  • Get-Content server.txt | foreach-object{Get-WmiObject -ComputerName xx.xx.xx.xx win32_logicalDisk -filter "DriveType=3" | forEach-Object{$.DeviceID; $.FreeSpace/1GB}}


Related Questions