当驱动器快满时,我可以安排发送电子邮件吗?

背景:我是一个开发者不情愿“照看”我的应用程序部署到的机器。 我的客户是一个完全独立的公司,他们支付我们为他们编写代码 – 我们没有共同的老板或类似的东西。 他们有系统pipe理员,但他们在不同的部门,当他们要求我认为系统pipe理员应该能够为他们做的事情时,他们没有得到他们要求的东西。 实现这一目标不在我的手中。 然后我被要求编写代码来做一些事情,我怀疑一个真正受过训练的人可以用几行PowerShell或者在对话框上勾选一些东西。 这是安装了SQL和IIS的Windows Server 2003安装程序。

这导致了今天的问题:如何知道驱动器已经满了。 (数据库增长,导出的文件没有被清理,等等。)理想情况下,一封电子邮件会出现说“驱动器E在xyz(84%)abc”。 这很容易吗? 我当然不想写一个服务来监视磁盘空间和发送电子邮件 – 以前必须有人这样做。 其中一个驱动器实际上是一个映射的驱动器,代表另一台机器上的文件夹,以表示值。

虽然许多答案包括脚本(如果你走这条路线,我也build议使用powershell),你也可以使用perfmon来执行警报。 请参阅如何:使用Windows Server 2003中的性能日志和警报functionconfiguration低磁盘空间警报

请注意,你想采取的行动是执行一个PowerShell或VBScript给你一个电子邮件(或者更可取的是,执行一些基本的清理任务的驱动器,然后发送一封电子邮件,说明什么是问题是什么,后发生的行动号码是)

对于映射的驱动器,您必须使用脚本。 在WMI计数器中使用的是win32_mappedlogicaldisk。 (Get-WmiObject win32_mappedlogicaldisk).freespace。 例如:

$mythreshold = 10GB Get-WmiObject win32_mappedlogicaldisk | select-object deviceid, freespace | foreach { if ($_.freespace -lt $mythreshold){ $from = "[email protected]" $to = "[email protected]" $subject = "Low Disk Space!" $body = "Free Space Remaining: " + $_.FreeSpace + "Drive" + $_.deviceid $smtpServer = "smtp.mycompany.com" $smtp = new-object Net.Mail.SmtpClient($smtpServer) $smtp.Send($from,$to,$subject,$body) } } 

(很多先前的代码都是从squillman中愉快地复制的,否则我将不得不自己input这个代码)

如果您正在运行Server 2003 R2,则可以访问文件服务器资源pipe理工具。 这允许创build附有通知的目录配额。 你会对软配额感兴趣,它不会阻止添加新数据。 您可以添加通知,在预先设置的阈值超出时提醒您。

如果您使用的Server 2003没有R2,那么您将进入外部监视工具或脚本的状态。

这可能适合你。 如果你创build一个脚本(Powershell是我的build议),它会在运行时检查可用磁盘空间,并在电子邮件低于阈值时触发电子邮件,可以在运行该脚本的服务器上创build计划任务。 每X分钟安排一次,你已经得到了一个穷人的监控解决scheme。 无可否认,它比其他解决scheme(如Nagios或R2的资源pipe理器)更容易出错,但嘿…

你的Powershell脚本可能看起来像这样:

 $freeSpaceThreshold = 5GB $computerName = "mycomputer" $drive = "C:" $driveData = Get-WmiObject -class win32_LogicalDisk -computername "$computerName" -filter "Name = '$drive'" if ($driveData.FreeSpace -lt $freeSpaceThreshold) { $from = "[email protected]" $to = "[email protected]" $subject = "Low Disk Space!" $body = "Free Space Remaining: " + $driveData.FreeSpace $smtpServer = "smtp.mycompany.com" $smtp = new-object Net.Mail.SmtpClient($smtpServer) $smtp.Send($from,$to,$subject,$body) } 

您可以使用此PowerShell v2脚本在驱动器达到某个级别时发送电子邮件。

您可以使用“计划任务”来安排它,您需要更改networking脚本底部的smtp详细信息。

 Function DispDisk { $server=$server.toupper() [float]$tempfloat = ($_.freespace/$_.size)*100 $Body= "`r`n$Server - Drive: $($_.Deviceid) has only $([math]::round(($tempfloat),1))% free" $Body+="`r`nTotal Size: $([math]::truncate($_.size / 1gb)) GB" $Body+="`r`nFree Space: $([math]::truncate($_.freespace /1gb)) GB" IF ($tempfloat -lt $PercenttoEmail) { Send-MailMessage -SmtpServer $SMTPServer -To $To -From $From -Subject "Disk Space Issue $Server $($_.Deviceid) is below $percenttoemail%" -Body $Body } } # # SMTP Settings, you will need to change these. # # The Server you want to check, this is the first arguments (example .\getdspace yourserver) would check the YourServer server $server = $args[0] # Percent to send an email, if its below this you should get an email $PercenttoEmail =15 # Your SMTP Server $SMTPServer="smtprelay.YourDomain.co.nz" # Who gets the email $To="[email protected]" # What address does the email Come From $From="[email protected]" get-wmiobject win32_logicaldisk -filter "DriveType=3" -computer $server | foreach-object {DispDisk} 

这里有一些很好的build议 。

我pipe理一个相当大的Nagios设置,但这可能是为了你所需要的矫枉过正。 无论哪种方式,Nagios(参考:NRPE_NT)包含各种插件,正是你所要求的。 但是,您仍然需要编写一些代码,并且可能需要编写Windows调度程序才能将它们结合在一起。

到目前为止,我还没有理由)调查一个能够一举处理所有这些事情的工具,所以不幸的是,我不能指出你一个程序。

根据你想花费多less时间,你可以使用一个简单的服务,如http://monguard.com ,它只是一个廉价的萨斯模型的方法来简单的系统监控。 点击几下,你就可以开始运行了。

因为他们在云端运行,所以您不必担心防火墙等。我们是一家咨询商店,所以这种方法对我们很好,但根据您的情况可能不适合。