windows服务异常停止时,脚本通过定时查询状态、比对上次记录实现轻量告警,支持邮件(smtp)或弹窗(wscript.shell),部署为每2分钟运行的计划任务。
windows 服务异常停止后,系统默认不会通知管理员,容易导致业务中断未被及时发现。一个轻量、可靠、无需第三方依赖的自动报警脚本,可监控指定服务状态并在其意外停止时通过邮件或本地弹窗告警。
核心思路:定时检测 + 状态比对 + 触发动作
不依赖 Windows 事件日志(避免日志被清理或筛选条件复杂),而是直接查询服务当前运行状态,并与“期望状态”比对。关键在于区分“主动停止”和“异常崩溃”——可通过记录上一次检查时的状态实现简单状态跟踪。
- 使用 Get-Service 获取服务当前状态(Running / Stopped / StartPending 等)
- 将上次检查结果存为临时文件(如 C:\temp\svc_laststate.txt),格式为 serviceName|Running
- 本次检查发现服务为 Stopped,但上次是 Running → 判定为异常停止
- 触发报警后,自动更新状态文件,避免重复告警
邮件报警(PowerShell + SMTP)
适用于有内部 SMTP 服务器或支持 SMTP 认证的邮箱(如 Outlook、腾讯企业邮)。以下为关键代码片段:
$svcName = "Spooler"
$smtpServer = "smtp.company.com"
$from = "alert@company.com"
$to = "admin@company.com"
$subject = "【告警】Windows 服务 $svcName 异常停止"
$body = "服务 $svcName 于 $(Get-Date) 被检测到已停止,此前处于运行状态。请立即检查。"
<h1>检查逻辑(略去状态比对部分)</h1><p>if ($isAbnormalStop) {
$cred = New-Object System.Management.Automation.PSCredential("alert@company.com", (ConvertTo-SecureString "your_app_password" -AsPlainText -Force))
Send-MailMessage -SmtpServer $smtpServer -From $from -To $to -Subject $subject -Body $body -Credential $cred -Port 587 -UseSsl
}</p>
注意:建议使用应用专用密码(如 Outlook 的 App Password),而非账户明文密码;若无 SMTP 权限,可用本地弹窗替代。
本地弹窗提醒(兼容 Server Core)
在无桌面环境(如 Windows Server Core)中,[System.Windows.Forms.MessageBox] 不可用。推荐使用更底层的 msg.exe 或 PowerShell 的 WScript.Shell:
- msg * "服务 Spooler 异常停止,请检查!" —— 需启用 Messenger 服务(Win10/11 默认禁用,不推荐)
- 更通用方式:
$shell = New-Object -ComObject WScript.Shell<br>$shell.Popup("⚠ 服务 Spooler 已异常停止", 0, "服务监控告警", 0x10)
该弹窗会强制显示在当前交互式会话桌面(即使用户已锁屏,也会在解锁后可见),适合运维人员驻守场景。
部署为计划任务(每2分钟执行一次)
将脚本保存为 C:\Scripts\Check-ServiceAlert.ps1,并以管理员权限创建计划任务:
- 触发器:每2分钟重复一次,延迟30秒(避免启动风暴)
- 操作:启动程序 powershell.exe,参数填:
-ExecutionPolicy Bypass -File "C:\Scripts\Check-ServiceAlert.ps1" - “不管用户是否登录都要运行” + “使用最高权限” → 勾选“不存储密码”时需配置为“仅当用户登录时”
首次运行前手动执行一次脚本,生成初始状态文件,后续即可全自动值守。











