I’ve written simple PowerShell script for monitoring of free space on one of our important volumes. As well as inserting it as plaint text below, for the sake of convenience I uploaded the script as a text file on FileDen file hosting service. Here is the link to the file.
$path = "F:\script\dspace.txt" Clear-Content $path $server = "SERVERNAME" $recps = "qwe@contoso.com", "wer@contoso.com", "ert@contoso.com" $sender = "alerts@contoso.com" $user = "alerts" $passw = "123456" $thold = 3 $drives = Get-WmiObject -ComputerName $server Win32_LogicalDisk | ` Where-Object {$_.DriveType -eq 3} $i = 0 echo "This message is to inform you that server $server is low on disk space. Please carry out corrective actions. Find details below. `n" >> $path foreach($drive in $drives) { $size_gb = $drive.size / 1GB $size_gb_fmt = "{0:N2}" -f $size_gb $free_gb = $drive.freespace / 1GB $free_gb_fmt = "{0:N2}" -f $free_gb $ID = $drive.DeviceID $pct = $free_gb / $size_gb * 100 $pct_fmt = "{0:N0}" -f $pct if (($ID -eq "F:") -and ($free_gb -lt $thold)) { echo "Server Name: $server" >> $path echo "Drive Letter: $ID" >> $path echo "Drive Size: $size_gb_fmt GB" >> $path echo "Free Space: $free_gb_fmt GB" >> $path echo "Percent Free: $pct_fmt%" >> $path $i++ } } if ($i -gt 0) { $smtpServer = "mail.contoso.com" $smtp = New-Object Net.Mail.SmtpClient($smtpServer) $smtp.Credentials = New-Object System.Net.NetworkCredential($user, $passw) $msg = new-object Net.Mail.MailMessage $msg.From = $sender foreach ($recp in $recps) { $msg.To.Add($recp) } $subject = "Disk space on $server is under $thold GB" $msg.Subject = $subject foreach ($line in Get-Content $path) { $body += "$line `n" } $msg.Body = $body $smtp.Send($msg) }
To run this script from scheduler just write another simple .bat file with following line inside:
powershell -command “& ‘.\dspace.ps1′”
Tags: authentication, disk space, monitoring, powershell, smtp
November 3, 2011 at 12:52 pm |
One major suggestion I would make is to use the Send-Mailmessage cmdlet that is in PowerShell v2. You might also consider adding some error handling with Try/Catch? What happens if you can’t reach the server to get drive information? Unless you are running this locally in which case you don’t need the -computername parameter.
November 3, 2011 at 1:56 pm |
Sure, you’re right. I’ll consider rewriting this script a little bit.