必须通过invoke-command远程批量关闭winrm服务,前提为winrm已启用、目标ip加入trustedhosts、账号具管理员权限;推荐先stop-service再set-service为disabled,并可选删除监听器。
批量关闭多台服务器上的 winrm 服务,不能靠本地单点操作,必须通过 powershell 远程执行能力(invoke-command)在目标机器上逐台停用。关键前提是:你已有远程管理通道可用(即 winrm 当前是通的),且具备管理员权限。
前提条件必须满足
• 目标服务器已启用 WinRM 并监听(否则无法远程连接)
• 执行脚本的本地机已将目标 IP 加入 TrustedHosts:
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "192.168.1.10,192.168.1.11" -Force
• 使用的账号在每台目标服务器上是本地管理员或域管理员
• 建议提前测试单台连通性:
Test-WsMan -ComputerName 192.168.1.10
安全关闭 WinRM 的推荐方式
直接停用服务可能影响其他依赖项(如 WMI、组策略刷新),所以推荐“停用 + 禁用启动”两步走,确保重启后也不自启:
- 先停止服务:
Stop-Service WinRM -Force - 再设为禁用:
Set-Service WinRM -StartupType Disabled - 可选:清除监听器(避免残留配置):
winrm delete winrm/config/listener?Address=*+Transport=HTTP或 HTTPS 对应项
批量执行脚本示例
以下脚本读取服务器列表,逐台执行关闭操作,并输出结果:
# 服务器列表(可替换为文件路径:Get-Content C:\servers.txt)
$Servers = @("192.168.1.10", "192.168.1.11", "srv-web01")
# 凭据(首次运行需手动输入,后续可缓存或改用密钥)
$Cred = Get-Credential
foreach ($Server in $Servers) {
Write-Host "正在处理 $Server..." -ForegroundColor Yellow
try {
$Result = Invoke-Command -ComputerName $Server -Credential $Cred -ScriptBlock {
Stop-Service WinRM -Force -ErrorAction Stop
Set-Service WinRM -StartupType Disabled -ErrorAction Stop
"✅ WinRM 已停止并禁用"
}
Write-Host $Result -ForegroundColor Green
} catch {
Write-Host "❌ $Server 失败:$($_.Exception.Message)" -ForegroundColor Red
}
}
注意事项
• 若某台服务器 WinRM 已关闭,Invoke-Command 将失败——这是正常现象,脚本会跳过并报错提示
• 不建议在生产环境无预案地批量关闭;可先对非关键服务器验证流程
• 关闭后,Enter-PSSession、Ansible WinRM 模块等将失效,需切换至其他管理方式(如 SSH、WMI over DCOM、或启用 HTTPS WinRM)
• 如需恢复,反向执行:Set-Service WinRM -StartupType Automatic; Start-Service WinRM











