Update 20150812
You'll see in the below comments that I left a global variable that was not required in the original script. The below post has been updated with that variable removed.
Original Post
So, I came across a need to have a script that checks the free space of a hard drive, calculates the percentage and send an e-mail notification of the free space is less than 10%. I figured that this could be scripted with PowerShell and run as a scheduled task in Windows. One thing I did find out is that I needed to create a service account in Active Directory with Server Admin permissions. Once you have that account in place simply copy the script below and name it "WhatYouWant.ps1" and set your Windows task accordingly. Disclaimer: I did reach out for assistance with creating this script on StackOverflow. My original script was writing the output to a text file, and copying the contents of that text file into the e-mail notification. This was not acceptable for the long term. You can check out that thread here.
Here's the PowerShell script:
You'll see in the below comments that I left a global variable that was not required in the original script. The below post has been updated with that variable removed.
Original Post
So, I came across a need to have a script that checks the free space of a hard drive, calculates the percentage and send an e-mail notification of the free space is less than 10%. I figured that this could be scripted with PowerShell and run as a scheduled task in Windows. One thing I did find out is that I needed to create a service account in Active Directory with Server Admin permissions. Once you have that account in place simply copy the script below and name it "WhatYouWant.ps1" and set your Windows task accordingly. Disclaimer: I did reach out for assistance with creating this script on StackOverflow. My original script was writing the output to a text file, and copying the contents of that text file into the e-mail notification. This was not acceptable for the long term. You can check out that thread here.
Here's the PowerShell script:
# Set Global ParametersEdit the above accordingly to your own needs and configure Windows Task Manager to run when you want.
$emailTO = "SomeOne@SomeDomain.com"
$emailFrom = "SomeOne@SomeDomain.com"
$smtpServer = "SMTPserverInfo"
$computers = ("server1","server2","server3","server4")
$i = 0
# Get Drive Data
$report = @(
foreach($computer in $computers)
{
$drives = Get-WmiObject -ComputerName $computer Win32_LogicalDisk | Where-Object {$_.DriveType -eq 3}
foreach($drive in $drives)
{
# Calculate Free Space
$obj = new-object psobject -Property @{
ComputerName = $computer
Drive = $drive.DeviceID
Size = $drive.size / 1GB
Free = $drive.freespace / 1GB
PercentFree = $drive.freespace / $drive.size * 100
}
# Monitor for 10% or less in free space and report accordingly
if ($obj.PercentFree -lt 10) {
$obj | Format-Table ComputerName,Drive,@{n='Size';e={'{0:N1}' -f $_.Size}},@{n='Free';e={'{0:N1}' -f $_.Free}},@{n='PercentFree';e={'{0:N1}' -f $_.PercentFree}} | Out-String
$i++
}
}
}
)
# Send notification if script finds more than 0 drives with less than 10% free space
if ($i -gt 0)
{
foreach ($user in $emailTo)
{
echo "Sending Email Notification to $user"
$smtp = New-Object Net.Mail.SmtpClient($smtpServer)
$subject = "Server with Low Disk Space"
foreach ($line in $report)
{
$body += "$line "
}
Send-MailMessage -to $user -From $emailFrom -SmtpServer $smtpServer -Subject $Subject -Body $body
}
}
thanks for this, just curious what the;
ReplyDelete$diskspace = "3"
stands for in global params. thanks!
Hi! Thanks for pointing that one out. I went back though my notes, and it looks like I was using that value for some debugging and failed to remove it in the final product. That global param is not needed. I'll have the post updated to reflect that.
DeleteHi Larry,
ReplyDeleteIt's very good and usefull script.
It's save our lot of time.
just want to ask, can we pull system name from a text file instead of mention directly in code.
so that a L1 engg can update system name without touching the code.
Hi, Thanks for the question. You should be able to pull in a text file quite easily by replacing this line:
Delete$computers = ("server1","server2","server3","server4")
With:
$computers = Get-Content C:\temp\ServerNames.txt
In your "ServerNames.txt" file, you should format it as one system name per line.
Now I haven't had an opportunity to test this, yet, but when I do I will let you know if that works for sure (unless you play around with it before I can). You can read more on the Get-Content command here: https://technet.microsoft.com/en-us/library/ee692806.aspx
Thank you, really simple and usefull!
ReplyDeleteRegards,