powershell监控脚本需定义核心服务数组,双重校验状态与启动类型,仅对automatic类异常服务尝试启动,记录带时间戳的日志并捕获系统事件,配合任务计划器每15分钟以最高权限运行。
直接用 powershell 写一个轻量、可靠、可落地的监控脚本,配合任务计划器定时运行,就能实现核心服务存活检查。不需要装额外工具,windows server 自带环境即可运行。
明确要监控的服务列表
先梳理出真正影响业务的核心服务,比如 WinRM(远程管理)、DNS(域名解析)、Netlogon(域登录)、W3SVC(IIS)、Spooler(打印,若用到)等。避免监控太多低优先级服务,增加误报和维护负担。
在脚本开头定义清晰的服务数组:
$criticalServices = @("WinRM", "DNS", "Netlogon", "W3SVC")
检查逻辑要包含状态+启动类型双重判断
只查 status -eq 'Running' 不够——有些服务状态是“Running”,但实际已卡死;有些服务被设为“手动启动”,脚本一重启反而引发异常。所以必须同时校验:
- 服务当前状态是否为 Running
- 启动类型是否为 Automatic(或 Automatic (Delayed Start))
- 若状态异常,且启动类型正确,才执行
Start-Service
示例片段:
Get-Service $svc | Where-Object { $_.Status -ne 'Running' -and $_.StartType -in 'Automatic','AutomaticDelayedStart' } | ForEach-Object {<br> try {<br> Start-Service $_.Name -ErrorAction Stop<br> Write-Host "✅ 已启动服务: $($_.Name)"<br> } catch {<br> Write-Host "❌ 启动失败: $($_.Name) — $($_.Exception.Message)"<br> }<br>}
必须记录日志并区分成功/失败场景
日志不是可选项,而是故障回溯和效果验证的唯一依据。建议写入本地文件,路径固定、按日轮转:
- 日志路径用
$logPath = Join-Path $PSScriptRoot "service-check-$(Get-Date -Format 'yyyy-MM-dd').log" - 每条记录带时间戳、服务名、操作结果(如“Running”、“Started”、“Failed to start”)
- 对失败项额外追加
Get-EventLog -LogName System -Source ServiceControlManager -After (Get-Date).AddMinutes(-5) -Newest 3获取系统级服务事件辅助诊断
用任务计划器设置稳定触发机制
PowerShell 脚本本身不自启,必须靠系统级调度。推荐配置如下:
- 触发器:每15分钟运行一次(生产环境建议5–30分钟区间,兼顾及时性与资源开销)
-
操作:启动程序
powershell.exe,参数填:-ExecutionPolicy Bypass -File "D:\Scripts\check-services.ps1" - 常规设置:勾选“不管用户是否登录都要运行”+“使用最高权限运行”
- 条件:取消勾选“只有在计算机使用交流电源时才启动此任务”(避免服务器接UPS时失效)
这样配置后,脚本就真正脱离人工值守,成为后台自动运转的“服务守夜人”。











