powershell 是 windows 自动化运维核心工具,支持本地/远程服务启停、状态检查、批量管理、异常恢复及配置变更,需注意权限、会话限制与错误处理。
powershell 是 windows 系统自动化运维的核心工具,尤其适合服务管理——它能直接调用 .net servicecontroller 类、wmi/cim 接口和原生命令,无需额外安装客户端。关键在于用对命令、加好错误处理、避开权限和会话限制。
快速启停与状态检查
使用 Get-Service、Start-Service、Stop-Service 可完成基础操作。注意服务名(不是显示名),且需管理员权限:
- 检查服务是否运行:
Get-Service -Name "wuauserv" | Where-Object Status -eq "Running" - 安全停止(带超时与依赖处理):
Stop-Service -Name "wuauserv" -Force -PassThru(-Force同时停止依赖服务) - 启动并等待就绪:
Start-Service -Name "wuauserv"; while ((Get-Service wuauserv).Status -ne 'Running') { Start-Sleep -Seconds 1 }
批量管理多台远程主机的服务
通过 Invoke-Command 远程执行,推荐使用 CIM(比 WMI 更现代、防火墙友好):
- 确保目标开启 WinRM(
winrm quickconfig)并信任主机(Set-Item WSMan:\localhost\Client\TrustedHosts -Value "192.168.1.10,192.168.1.11") - 批量重启服务:
Invoke-Command -ComputerName Server01,Server02 -ScriptBlock { Restart-Service -Name "BITS" -Force } - 跨主机状态汇总:
Invoke-Command -ComputerName @("SrvA","SrvB") -ScriptBlock { Get-Service -Name "Spooler" } | Select PSComputerName, Name, Status
自动恢复异常服务(守护脚本)
编写循环监控脚本,适用于关键服务(如数据库代理、消息队列):
- 每 30 秒检测一次,连续失败 3 次后重启:
for ($i = 0; $i -lt 3; $i++) { if ((Get-Service MyAppSvc).Status -ne 'Running') { Start-Sleep -Seconds 30 } else { break } }; if ($i -eq 3) { Start-Service MyAppSvc } - 记录日志到文件:
"$(Get-Date): MyAppSvc restarted" | Out-File C:\Logs\ServiceWatch.log -Append - 以计划任务方式后台运行:用
Register-ScheduledTask创建触发器为“按需”或“每 5 分钟”,动作指向脚本路径,勾选“最高权限”和“不管用户是否登录都运行”
服务配置变更与部署集成
结合 Set-Service 和配置文件,实现标准化部署:
- 修改启动类型:
Set-Service -Name "WinRM" -StartupType AutomaticDelayedStart(支持 Automatic、Manual、Disabled、AutomaticDelayedStart) - 设置服务账户(需密码):
$cred = Get-Credential; Set-Service -Name "MySvc" -Credential $cred - 配合 JSON 配置批量设置:
$config = Get-Content .\services.json | ConvertFrom-Json; $config.Services | ForEach-Object { Set-Service -Name $_.Name -StartupType $_.StartupType }
不复杂但容易忽略:所有服务操作默认在 Session 0(无交互桌面),若服务依赖 GUI 或用户上下文,需改用 Scheduled Task + “已登录用户”触发;生产环境务必测试 -WhatIf 参数,并用 Try/Catch 包裹关键操作捕获 AccessDenied、ServiceCannotAcceptControl 等异常。











