我正在尝试在服务器 (Windows Server 2008 R2 Enterprise,SP1) 上设置磁盘空间不足情况的警报。为此,我希望在系统事件日志中记录事件 ID 2013 时通过任务计划程序触发电子邮件。
问题是事件 ID 2013 似乎没有发生。LowDiskSpaceMinimum 和 DiskSpaceThreshold 注册表项不存在,据我理解,这意味着当任何分区的磁盘空间低于 10% 时,就会发生事件 2013。
我现在已经尝试在三台服务器上触发此事件,分别在系统驱动器(C:)或数据驱动器(E:)。
我有三种理论:
- 2008 R2 上的默认阈值远低于 10%(但考虑到我在测试中将这些驱动器装满,这个阈值一定非常低)
- 系统很少检查磁盘空间,我等待的时间不够长
- 还有其他一些我没考虑到的因素阻止了此事件的记录
如果有人能给我任何建议我将不胜感激。
答案1
我最终让它工作了。我必须专门添加 LowDiskSpaceMinimum 和 DiskSpaceThreshold 注册表项,然后它才开始工作。
我确实同意在很多情况下安装服务器监控软件可能是一种更好的方法,如果我是系统管理员,我就会这样做,并将其集中起来监控我们所有的服务器。但我只关心一个系统,所以这种方法足以满足我的需求(而且意味着我不需要等待系统管理员真正做些什么!!)
如果其他人想要设置类似的东西,那么这里是注册表设置(DiskSpaceThreshold设置为10%):
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\LanmanServer\Parameters]
"DiskSpaceThreshold"=dword:0000000a
"LowDiskSpaceMinimum"=dword:00000000
这是任务计划程序作业,可以将其保存为 xml 文件并导入。只需更改 [ServerName]、[YourDomain]、[YourUserName] 和电子邮件地址:
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2013-02-05T14:37:17.165247</Date>
<Author>[YourDomain]\[YourUserName]</Author>
<Description>Send an emailed warning when a low disk space event is recorded.</Description>
</RegistrationInfo>
<Triggers>
<EventTrigger>
<Enabled>true</Enabled>
<Subscription><QueryList><Query Id="0" Path="System"><Select Path="System">*[System[Provider[@Name='srv'] and EventID=2013]]</Select></Query></QueryList></Subscription>
</EventTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>S-1-5-20</UserId>
<RunLevel>LeastPrivilege</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
<UseUnifiedSchedulingEngine>false</UseUnifiedSchedulingEngine>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT1H</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<SendEmail>
<Server>smtpServer.YourCompany.co.uk</Server>
<Subject>Low disk space warning on server: [ServerName]</Subject>
<To>[email protected]</To>
<From>[email protected]</From>
<Body>Disk space is running low on server: [ServerName] - please investigate.</Body>
<HeaderFields />
<Attachments />
</SendEmail>
</Actions>
</Task>
答案2
我过去曾使用过 paulH 的方法,并取得了成功。但今天我在 Windows 2016 Server 上遇到了一个问题:保存任务时,我收到一条错误消息,指出电子邮件是弃用功能,Windows 不允许您保存新任务。
为了做到这一点,我找到了另一种方法https://www.netwoven.com/2017/04/28/send-an-e-mail-windows-server-2012-task-scheduler-deprecated-feature-solved/使用 Powershell 如下:
创建如下所示的 Powershell 脚本并将其作为 smtpscript.ps1 保存到已知文件夹,例如C:\Users\Public\Documents
$SmtpClient = new-object system.net.mail.smtpClient
$MailMessage = New-Object system.net.mail.mailmessage
$SmtpClient.Host = "mail.yourserver.com"
$SmtpClient.Port = 587
$SmtpClient.Credentials = New-Object System.Net.NetworkCredential( "[email protected]", "pw" );
$mailmessage.from = ("[email protected]")
$mailmessage.To.add("[email protected]")
$mailmessage.Subject = “An appropriate subject”
$mailmessage.Body = “An appropriate message body.”
$smtpclient.Send($mailmessage)
保存该脚本,然后像上面一样创建任务,但在“操作”选项卡下使用Start a program
并输入以下详细信息:
程序/脚本:powershell.exe
添加参数(可选):C:\Users\Public\Documents\smtpscript.ps1
保存任务,您会收到一封电子邮件提醒。
答案3
如果注册表值更改不会导致创建事件 ID 2013 记录,则我的经验表明,需要重新启动服务器服务(又称 LanmanServer 服务)。这将导致创建相应的事件记录。它出现该服务不监视其注册表项更新时生成的事件,因此我需要重新启动该服务以让其重新读取更新的键值。