# encoding: ascii
# api: powershell
# title: Disk Check & Email & Log
# description: <#
# version: 0.1
# type: script
# author: DBAWithABeard
# license: CC0
# x-poshcode-id: 5571
# x-archived: 2016-11-06T01:52:07
# x-published: 2016-11-04T19:52:00
#
# .Synopsis
# Disk Check and email alert for Servers
# .DESCRIPTION
# Author – Rob Sewell
# Date – 29/10/2014
# This script will iterate through the list of servers in the $Servers variable and check the disk space
# for every disk.
# There are three warning levels currently set at 15%,5% and 1%
# If the free disk space for any disk is below a warning level, the script will check for
# the existence of a unique to the disk named text file located in the path of the $location
# variable, presuming one does not exist, the script will create a text file and then send email
# If the script finds a text file it will not email
# Once the free space increases above the warning level the script will remove the text file
# .EXAMPLE
# The script is designed to run under a scheduled agent job on the SQL Server and will run every
# 5 minutes
# .NOTES
# The script will log to the file located at $LogFile location which will be deleted
# #>
#
<#
.Synopsis
Disk Check and email alert for Servers
.DESCRIPTION
Author - Rob Sewell
Date - 29/10/2014
This script will iterate through the list of servers in the $Servers variable and check the disk space
for every disk.
There are three warning levels currently set at 15%,5% and 1%
If the free disk space for any disk is below a warning level, the script will check for
the existence of a unique to the disk named text file located in the path of the $location
variable, presuming one does not exist, the script will create a text file and then send email
If the script finds a text file it will not email
Once the free space increases above the warning level the script will remove the text file
.EXAMPLE
The script is designed to run under a scheduled agent job on the SQL Server and will run every
5 minutes
.NOTES
The script will log to the file located at $LogFile location which will be deleted
#>
#Set variables
$Servers = Get-Content 'PATH\TO\Servers.txt'
$WarningLevel = '15'
$ErrorLevel = '5'
$SevereLevel = '1'
$Date = Get-Date
$Location = 'PATHTOLOGFILEFOLDER\' #trailing slash
$Logdate = Get-Date -Format yyyyMMdd
$LogFile = $Location + 'logfile' + $LogDate+ '.txt'
# if daily log file does not exist create one
if(!(Test-Path $LogFile))
{
New-Item $Logfile -ItemType File
}
# any logfiles older than 7 days delete
Get-ChildItem -Path $Location *logfile* |Where-Object {$_.LastWriteTime -gt (Get-Date).AddDays(7) }|Remove-Item -Force
foreach($Server in $Servers)
{
# get disk information
$Disks = Get-WmiObject win32_logicaldisk -ComputerName $Server | Where-Object {$_.drivetype -eq 3} -ErrorAction SilentlyContinue
foreach($Disk in $Disks)
{
$ServerName = $Disk.__SERVER
$VolumeName = $Disk.VolumeName
$DriveLetter = $Disk.DeviceID.Chars(0)
$TotalSpace=[math]::Round(($Disk.Size/1073741824),2) # change to gb and 2 decimal places
$FreeSpace=[Math]::Round(($Disk.FreeSpace/1073741824),2)# change to gb and 2 decimal places
$UsedSpace = $TotalSpace - $FreeSpace
$PercentFree = [Math]::Round((($FreeSpace/$TotalSpace)*100),2)# change to gb and 2 decimal places
# set variables for unique check file per server and disk
$CheckFile = $Location + $Server + '_' + $DriveLetter + '_Warning.txt'
$CheckFileError = $Location + $Server + '_' + $DriveLetter + '_Error.txt'
$CheckFileSevere = $Location + $Server + '_' + $DriveLetter + '_Severe.txt'
# Check if percent free below warning level
if ($PercentFree -le $SevereLevel)
{
# if text file has been created (ie email should already have been sent) do nothing
if(Test-Path $CheckFileSevere)
{
$logentrydate = (Get-Date).DateTime
$Log = $logentrydate + ' ' + $ServerName + ' ' + $DriveLetter + ' ' + $VolumeName + ' ' + $PercentFree +' -- ' + $CheckFileSevere + ' File Already Created - No Action Taken'
Add-Content -Value $Log -Path $Logfile
}
# if percent free below warning level and text file doesnot exist create text file and email
else
{
# Create File
New-Item $CheckFileSevere -ItemType File
$logentrydate = (Get-Date).DateTime
$Log = $logentrydate + ' ' + $ServerName + ' ' + $DriveLetter + ' ' + $VolumeName + ' ' + $PercentFree +' -- File Created'
Add-Content -Value $Log -Path $Logfile
#Create Email Body
$EmailBody = ''
$EmailBody += "<html> <head> <title> $Date DiskSpace Report</title>"
$EmailBody += "<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>"
$EmailBody += "<table width='100%'><tbody>"
$EmailBody += "<tr>"
$EmailBody += "<td width='100%' colSpan=6><font face='tahoma' color='#003399' size='2'> $Date <BR><BR>Dear Service Desk,<BR><BR> This email has been generated as<font face='tahoma' color='#003399' size='2'><strong> $DriveLetter drive labelled $VolumeName on $ServerName </strong></font> in has <font face='tahoma' color='#FF0000' size='2'><strong>free space which has fallen below $SevereLevel% </strong></font><br><BR> Please raise an incident and assign to the appropriate team and IMMEDIATELY contact them<BR><BR> Regards,<BR><BR> The Automatic Monitoring System<BR><BR></font></td>"
$EmailBody += "</tr>"
$EmailBody += "<tr bgcolor='#FF0000'>"
$EmailBody += "<td width='100%' align='center' colSpan=6><font face='tahoma' color='#003399' size='2'><strong> $ServerName </strong></font></td>"
$EmailBody += "</tr>"
$EmailBody += "<tr bgcolor=#CCCCCC>"
$EmailBody += "<td width='15%' align='center'>Drive</td>"
$EmailBody += "<td width='25%' align='center'>Drive Label</td>"
$EmailBody += "<td width='15%' align='center'>Total Capacity(GB)</td>"
$EmailBody += "<td width='15%' align='center'>Used Capacity(GB)</td>"
$EmailBody += "<td width='15%' align='center'>Free Space(GB)</td>"
$EmailBody += "<td width='15%' align='center'>Freespace %</td>"
$EmailBody += "</tr>"
$EmailBody += "<tr>"
$EmailBody += "<td bgcolor='#FF0000' align=center>$DriveLetter</td>"
$EmailBody += "<td bgcolor='#FF0000' align=center>$VolumeName</td>"
$EmailBody += "<td bgcolor='#FF0000' align=center>$TotalSpace</td>"
$EmailBody += "<td bgcolor='#FF0000' align=center>$UsedSpace</td>"
$EmailBody += "<td bgcolor='#FF0000' align=center>$FreeSpace</td>"
$EmailBody += "<td bgcolor='#FF0000' align=center>$PercentFree</td>"
$EmailBody += "</tr>"
#Send Email
$smtpServer = ""
$To = ""
$From = ""
$Sender = ""
$Subject = "URGENT Disk Space Alert 1%"
$Body = $EmailBody
$msg = new-object Net.Mail.MailMessage
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.port = '25'
$msg.From = $From
$msg.Sender = $Sender
$msg.To.Add($To)
$msg.Subject = $Subject
$msg.Body = $Body
$msg.IsBodyHtml = $True
$smtp.Send($msg)
$logentrydate = (Get-Date).DateTime
$Log = $logentrydate + ' ' + $ServerName + ' ' + $DriveLetter + ' ' + $VolumeName + ' ' + $PercentFree +' -- Severe Email Sent'
Add-Content -Value $Log -Path $Logfile
}
}
# Check if percent free below warning level
elseif ($PercentFree -le $ErrorLevel)
{
# if text file has been created (ie email should already have been sent) do nothing
if(Test-Path $CheckFileError)
{
$logentrydate = (Get-Date).DateTime
$Log = $logentrydate + ' ' + $ServerName + ' ' + $DriveLetter + ' ' + $VolumeName + ' ' + $PercentFree +' --' + $CheckFileError + ' File Already Created - No Action Taken'
Add-Content -Value $Log -Path $Logfile
}
# if percent free below warning level and text file doesnot exist create text file and email
else
{
# Create File
New-Item $CheckFileError -ItemType File
$logentrydate = (Get-Date).DateTime
$Log = $logentrydate + ' ' + $ServerName + ' ' + $DriveLetter + ' ' + $VolumeName + ' ' + $PercentFree +' -- File Created'
Add-Content -Value $Log -Path $Logfile
# Create Email Body
$EmailBody = ''
$EmailBody += "<html> <head> <title> $Date DiskSpace Report</title>"
$EmailBody += "<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>"
$EmailBody += "<table width='100%'><tbody>"
$EmailBody += "<tr>"
$EmailBody += "<td width='100%' colSpan=6><font face='tahoma' color='#003399' size='2'> $Date <BR><BR>Dear Service Desk,<BR><BR> This email has been generated as $DriveLetter drive labelled $VolumeName on $ServerName in has free space which has fallen below $WarningLevel%<br><BR> Please raise an incident and assign to the appropriate team <BR><BR> Regards,<BR><BR> The Automatic Monitoring System<BR><BR></font></td>"
$EmailBody += "</tr>"
$EmailBody += "<tr bgcolor='#CCCCCC'>"
$EmailBody += "<td width='100%' align='center' colSpan=6><font face='tahoma' color='#003399' size='2'><strong> $ServerName </strong></font></td>"
$EmailBody += "</tr>"
$EmailBody += "<tr bgcolor=#CCCCCC>"
$EmailBody += "<td width='15%' align='center'>Drive</td>"
$EmailBody += "<td width='25%' align='center'>Drive Label</td>"
$EmailBody += "<td width='15%' align='center'>Total Capacity(GB)</td>"
$EmailBody += "<td width='15%' align='center'>Used Capacity(GB)</td>"
$EmailBody += "<td width='15%' align='center'>Free Space(GB)</td>"
$EmailBody += "<td width='15%' align='center'>Freespace %</td>"
$EmailBody += "</tr>"
$EmailBody += "<tr>"
$EmailBody += "<td align=center>$DriveLetter</td>"
$EmailBody += "<td align=center>$VolumeName</td>"
$EmailBody += "<td align=center>$TotalSpace</td>"
$EmailBody += "<td align=center>$UsedSpace</td>"
$EmailBody += "<td align=center>$FreeSpace</td>"
$EmailBody += "<td bgcolor='#FF0000' align=center>$PercentFree</td>"
$EmailBody += "</tr>"
#Send Email
$smtpServer = ""
$To = ""
$From = ""
$Sender = ""
$Subject = " Disk Space Alert 5%"
$Body = $EmailBody
$msg = new-object Net.Mail.MailMessage
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.port = '25'
$msg.From = $From
$msg.Sender = $Sender
$msg.To.Add($To)
$msg.Subject = $Subject
$msg.Body = $Body
$msg.IsBodyHtml = $True
$smtp.Send($msg)
$logentrydate = (Get-Date).DateTime
$Log = $logentrydate + ' ' + $ServerName + ' ' + $DriveLetter + ' ' + $VolumeName + ' ' + $PercentFree + ' -- Error Email Sent'
Add-Content -Value $Log -Path $Logfile
}
}
# Check if percent free below warning level
elseif ($PercentFree -le $WarningLevel)
{
# if text file has been created (ie email should already have been sent) do nothing
if(Test-Path $CheckFile)
{
$logentrydate = (Get-Date).DateTime
$Log = $logentrydate + ' ' + $ServerName + ' ' + $DriveLetter + ' ' + $VolumeName + ' ' + $PercentFree + ' --' + $CheckFile + ' File Already Created - No Action Taken'
Add-Content -Value $Log -Path $Logfile
}
# if percent free below warning level and text file doesnot exist create text file and email
else
{
# Create File
New-Item $CheckFile -ItemType File
$logentrydate = (Get-Date).DateTime
$Log = $logentrydate + ' ' + $ServerName + ' ' + $DriveLetter + ' ' + $VolumeName + ' ' + $PercentFree +' -- File Created'
Add-Content -Value $Log -Path $Logfile
#Create Email Body
$EmailBody = ''
$EmailBody += "<html> <head> <title> $Date DiskSpace Report</title>"
$EmailBody += "<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>"
$EmailBody += "<table width='100%'><tbody>"
$EmailBody += "<tr>"
$EmailBody += "<td width='100%' colSpan=6><font face='tahoma' color='#003399' size='2'> $Date <BR><BR>Dear Service Desk,<BR><BR> This email has been generated as $DriveLetter drive labelled $VolumeName on $ServerName in has free space which has fallen below $WarningLevel%<br><BR> Please raise an incident and assign to the appropriate team <BR><BR> Regards,<BR><BR> The Automatic Monitoring System<BR><BR></font></td>"
$EmailBody += "</tr>"
$EmailBody += "<tr bgcolor='#CCCCCC'>"
$EmailBody += "<td width='100%' align='center' colSpan=6><font face='tahoma' color='#003399' size='2'><strong> $ServerName </strong></font></td>"
$EmailBody += "</tr>"
$EmailBody += "<tr bgcolor=#CCCCCC>"
$EmailBody += "<td width='15%' align='center'>Drive</td>"
$EmailBody += "<td width='25%' align='center'>Drive Label</td>"
$EmailBody += "<td width='15%' align='center'>Total Capacity(GB)</td>"
$EmailBody += "<td width='15%' align='center'>Used Capacity(GB)</td>"
$EmailBody += "<td width='15%' align='center'>Free Space(GB)</td>"
$EmailBody += "<td width='15%' align='center'>Freespace %</td>"
$EmailBody += "</tr>"
$EmailBody += "<tr>"
$EmailBody += "<td align=center>$DriveLetter</td>"
$EmailBody += "<td align=center>$VolumeName</td>"
$EmailBody += "<td align=center>$TotalSpace</td>"
$EmailBody += "<td align=center>$UsedSpace</td>"
$EmailBody += "<td align=center>$FreeSpace</td>"
$EmailBody += "<td bgcolor='#FBB917' align=center>$PercentFree</td>"
$EmailBody += "</tr>"
#Send Email
$smtpServer = ""
$To = ""
$From = ""
$Sender = ""
$Subject = "Disk Space Alert"
$Body = $EmailBody
$msg = new-object Net.Mail.MailMessage
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.port = '25'
$msg.From = $From
$msg.Sender = $Sender
$msg.To.Add($To)
$msg.Subject = $Subject
$msg.Body = $Body
$msg.IsBodyHtml = $True
$smtp.Send($msg)
$logentrydate = (Get-Date).DateTime
$Log = $logentrydate + ' ' + $ServerName + ' ' + $DriveLetter + ' ' + $VolumeName + ' ' + $PercentFree + ' -- Warning Email Sent'
Add-Content -Value $Log -Path $Logfile
}
}
# If Percent free above warning level - remove text files so that next time it drops below an email is sent again
else
{
if(Test-Path $CheckFileError)
{
Remove-Item $CheckFileError -Force
$logentrydate = (Get-Date).DateTime
$Log = $logentrydate + ' ' + $ServerName + ' ' + $DriveLetter + ' ' + $VolumeName + ' ' + $PercentFree + ' -- File Removed'
Add-Content -Value $Log -Path $Logfile
}
if(Test-Path $CheckFile)
{
Remove-Item $CheckFile -Force
$logentrydate = (Get-Date).DateTime
$Log = $logentrydate + ' ' + $ServerName + ' ' + $DriveLetter + ' ' + $VolumeName + ' ' + $PercentFree +' -- File Removed'
Add-Content -Value $Log -Path $Logfile
}
if(Test-Path $CheckFileSevere)
{
Remove-Item $CheckFileSevere -Force
$logentrydate = (Get-Date).DateTime
$Log = $logentrydate + ' ' + $ServerName + ' ' + $DriveLetter + ' ' + $VolumeName + ' ' + $PercentFree + ' -- File Removed'
Add-Content -Value $Log -Path $Logfile
}
$logentrydate = (Get-Date).DateTime
$Log = $logentrydate + ' ' + $ServerName + ' ' + $DriveLetter + ' ' + $VolumeName + ' ' + $PercentFree + ' -- Checked No Action Taken'
Add-Content -Value $Log -Path $Logfile
}
}
}