restart-service -computername批量操作不可靠,应使用invoke-command封装stop-service与start-service,在远程主机上执行并配合可信主机配置、winrm启用、防火墙放行及权限校验。
直接用 restart-service -computername 批量操作不可靠,它不支持多主机并行、失败静默、无法捕获具体错误。真正可行的方式是把服务控制逻辑推到每台远程机器上执行,靠 invoke-command 封装停启动作,并确保通路、权限和脚本策略就绪。
先打通远程管理通道
目标机器必须启用 WinRM,否则所有远程命令都会被拒绝:
- 在每台目标服务器上以管理员身份运行:
winrm quickconfig -q - 检查端口监听状态:
netstat -ano | findstr :5985(确认有 LISTENING) - 若为工作组环境,本地需配置可信主机:
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "192.168.1.10,192.168.1.11" -Force - 防火墙放行 TCP 5985(HTTP)或 5986(HTTPS),域环境建议优先配 HTTPS
确认服务名与执行权限
PowerShell 只认服务注册表中的 Name,不是你在服务管理器里看到的中文显示名:
将提醒同步至 Windows/Outlook 日历。用户提及「提醒我」「设置提醒」「加到日历」「同步到日历」「日程」「calendar」「日历」时触发。支持Microsoft Graph API 设备代码流认证,无需 Web 服务器,直接写入用户 Outlook 日历。
- 查真实服务名(例如 IIS):
Invoke-Command -ComputerName srv01 -ScriptBlock { Get-Service | Where-Object Name -eq 'w3svc' } - 执行账号必须是目标机上的本地管理员,或至少属于
Administrators或Service Operators组 - 避免拼写错误:Spooler ≠ “Print Spooler”,W3SVC ≠ “World Wide Web Publishing Service”
用 Invoke-Command 安全重启服务
推荐拆成 Stop + Start,比单条 Restart-Service -Force 更可控,能捕获中间异常:
- 基础命令示例(两台机器重启两个服务):
Invoke-Command -ComputerName srv01,srv02 -ScriptBlock { Stop-Service W3SVC -Force; Start-Service W3SVC } -ErrorAction Stop - 加
-ThrottleLimit 5控制并发,防 WinRM 资源耗尽 - 配合
try/catch和日志记录,失败时不中断整个循环 - 本地执行策略需设为允许:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
生产环境建议加等待与验证
服务重启后状态可能延迟更新,加简单验证可避免误判成功:
- 重启后等 3 秒再查状态:
Start-Sleep -Seconds 3; Get-Service W3SVC | Select Name,Status - 检查启动类型是否为 Automatic(防止手动启的服务下次开机失效):
Get-CimInstance -ClassName Win32_Service -Filter "Name='w3svc'" | Select StartMode - 失败时记录到文件:
"$server : $($_.Exception.Message)" | Out-File error.log -Append










