powershell脚本可实现windows关键服务的自动检测与恢复,通过定期检查状态、重试机制和日志记录提升系统自愈能力,并以计划任务部署确保自动化执行。
当某个 windows 服务意外停止,又没有及时人工干预时,可能引发业务中断或监控告警。powershell 脚本可以定期检测关键服务状态,并在发现停止时自动启动,实现轻量级的“自愈”能力。
明确目标服务与触发条件
不是所有服务都适合自动重启——比如某些服务停止本身就是故障表现(如 SQL Server 因磁盘满而停),盲目启动可能掩盖真正问题。应优先选择:
• 状态稳定、无依赖冲突的服务(如 WinRM、Spooler 或自定义业务服务)
• 启动后能快速进入“Running”且不报错的服务
• 已通过手动测试验证:Stop-Service + Start-Service 可可靠恢复
基础检测与修复脚本结构
以下是一个最小可行脚本示例,支持单服务检查与自动恢复:
$serviceName = "WinRM"
$status = (Get-Service $serviceName -ErrorAction SilentlyContinue).Status
if ($status -ne "Running") {
Write-Warning "$serviceName 当前状态为 $status,尝试启动..."
try {
Start-Service $serviceName -ErrorAction Stop
Write-Host "$serviceName 已成功启动" -ForegroundColor Green
} catch {
Write-Error "启动 $serviceName 失败:$($_.Exception.Message)"
}
} else {
Write-Host "$serviceName 状态正常" -ForegroundColor Gray
}
关键点:
• 使用 -ErrorAction SilentlyContinue 避免服务不存在时报错中断
• -ErrorAction Stop 配合 try/catch 捕获启动失败细节
• 不直接用 Restart-Service(可能在已停止时报错)
增强可靠性:加入重试与日志记录
网络抖动、资源短暂不足可能导致首次启动失败。可加入简单重试逻辑,并将操作写入本地日志:
$logPath = "$env:TEMP\ServiceRepairLog.txt"
$retryCount = 3
$delaySeconds = 2
for ($i = 1; $i -le $retryCount; $i++) {
try {
Start-Service $serviceName -ErrorAction Stop
"$((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')) INFO: $serviceName 启动成功" | Out-File $logPath -Append
break
} catch {
"$((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')) WARN: 第 $i 次启动 $serviceName 失败 — $($_.Exception.Message)" | Out-File $logPath -Append
if ($i -lt $retryCount) { Start-Sleep -Seconds $delaySeconds }
}
}
部署为计划任务实现自动化
将脚本保存为 Repair-Service.ps1,再通过 PowerShell 注册为每5分钟运行一次的计划任务:
$action = New-ScheduledTaskAction -Execute 'PowerShell.exe' `
-Argument '-NoProfile -ExecutionPolicy Bypass -File "C:\Scripts\Repair-Service.ps1"'
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date) -RepetitionInterval (New-TimeSpan -Minutes 5)
$principal = New-ScheduledTaskPrincipal -UserId "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount
Register-ScheduledTask "AutoRepair-WinRM" -Action $action -Trigger $trigger -Principal $principal -Description "自动检测并修复 WinRM 服务"
注意:
• 使用 NT AUTHORITY\SYSTEM 账户避免权限不足导致启动失败
• -ExecutionPolicy Bypass 绕过执行策略限制(仅限可信脚本)
• 建议先手动运行脚本测试,再启用计划任务











