可通过PowerShell脚本批量重启远程Windows服务,需满足WinRM启用、网络连通、防火墙放行5985/5986端口、执行账户具管理员权限及执行策略设为RemoteSigned。
可以通过 powershell 脚本在本地批量重启远程 windows 机器上的指定服务,无需逐台登录,前提是网络连通、目标主机启用 winrm(或使用 wmi)、且当前用户具备远程管理权限。
前提条件与环境准备
确保以下几点已配置完成:
- 目标 Windows 主机已启用 WinRM(推荐方式):运行
winrm quickconfig(管理员权限);若用域环境,建议配置 HTTPS 或 Kerberos 认证 - 本地与远程主机间能互相 ping 通,且防火墙放行 5985(HTTP)或 5986(HTTPS) 端口
- 执行脚本的账户在远程主机上具有 管理员权限 或至少对目标服务有启动/停止权限(如属于
Administrators或Service Operators组) - PowerShell 执行策略允许脚本运行(如设为
RemoteSigned):执行Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
基础脚本:批量重启指定服务(基于 WinRM)
以下脚本读取服务器列表,对每台远程主机重启指定服务(例如 Spooler 和 W3SVC):
$Servers = @("Server01", "Server02", "192.168.1.100")
$Services = @("Spooler", "W3SVC")
foreach ($server in $Servers) {
Write-Host "正在连接 $server..." -ForegroundColor Cyan
try {
$session = New-PSSession -ComputerName $server -ErrorAction Stop
foreach ($svc in $Services) {
Invoke-Command -Session $session -ScriptBlock {
param($ServiceName)
Write-Host "正在重启服务: $ServiceName"
Restart-Service -Name $ServiceName -Force -ErrorAction Stop
Get-Service -Name $ServiceName | Select-Object Name, Status, StartType
} -ArgumentList $svc
}
Remove-PSSession -Session $session
}
catch {
Write-Warning "连接或操作 $server 失败:$($_.Exception.Message)"
}
}
说明:使用 New-PSSession 建立持久会话,避免重复认证开销;Invoke-Command 在远程上下文中执行服务控制;-Force 确保强制重启(跳过依赖检查)。
替代方案:使用 WMI/CIM(兼容旧系统或禁用 WinRM 时)
若目标主机未启用 WinRM(如 Windows Server 2008 R2 默认关闭),可改用 CIM(兼容 WMI)协议:
$Servers = @("Server01", "Server02")
$Services = @("Spooler")
foreach ($server in $Servers) {
foreach ($svc in $Services) {
try {
$service = Get-CimInstance -ClassName Win32_Service -Filter "Name='$svc'" -ComputerName $server -ErrorAction Stop
if ($service.State -eq 'Running') {
$service | Invoke-CimMethod -MethodName StopService | Out-Null
Start-Sleep -Seconds 2
$service | Invoke-CimMethod -MethodName StartService | Out-Null
Write-Host "$server 上 $svc 已重启" -ForegroundColor Green
} else {
$service | Invoke-CimMethod -MethodName StartService | Out-Null
Write-Host "$server 上 $svc 已启动" -ForegroundColor Yellow
}
}
catch {
Write-Warning "操作 $server\$svc 失败:$($_.Exception.Message)"
}
}
}
注意:Get-CimInstance 默认使用 DCOM(端口 135 + 动态高位端口),需确保防火墙放行;也可显式指定 -Protocol Wsman 强制走 WinRM。
增强实用性:支持从文件读取、日志记录与状态校验
生产环境中建议加入输入文件支持和结果记录:
- 将服务器名存入
servers.txt(每行一个),服务名存入services.txt - 用
Out-File或Export-Csv记录每次操作时间、结果、错误信息 - 重启后增加状态验证(如等待至
Status = Running,超时则报错) - 添加
-ThrottleLimit参数配合Invoke-Command -AsJob实现并行处理(适用于大量主机)
例如添加简单校验逻辑:
$result = Invoke-Command -Session $session -ScriptBlock {
param($svc)
Restart-Service $svc -Force
$s = Get-Service $svc
@{ Name = $s.Name; Status = $s.Status; Timestamp = Get-Date }
} -ArgumentList $svc
if ($result.Status -ne 'Running') {
Write-Error "$server 上 $svc 重启后未运行"
}
不复杂但容易忽略的是权限与协议匹配——WinRM 配置错误或凭据无远程服务控制权,会导致脚本静默失败。建议首次运行前,先手动用 Enter-PSSession -ComputerName xxx 测试连通性与权限。










