使用PowerShell批量注销服务器用户遇RPC服务器不可用错误求助
问题分析与解决步骤
一、脚本本身的问题:凭据未实际使用
你脚本里定义了$creds = Get-Credential但完全没在后续的quser和logoff命令中调用,导致即便输入了凭据,实际执行远程操作时还是用的当前运行脚本的身份(可能存在认证失效或权限不足)。同时这个多余的Get-Credential会每次运行都弹窗要求输入凭据,完全没必要。
修正后的脚本:
$NameToZap = 'Ani_Admin' $USERNAME = 0 $SESSIONNAME = 1 $ID = 2 Get-Content -path C:\Scripts\ServerNamesL.txt | ForEach-Object{ try { # 先验证服务器连通性,避免无效执行 if (Test-Connection -ComputerName $_ -Count 1 -Quiet -ErrorAction Stop) { $x = quser /server:$_ 2>&1 # 检查quser是否执行成功 if ($LASTEXITCODE -eq 0) { for ($i = 1; $i -lt $x.count; $i++){ # 跳过表头行 $y = $x[$i].split(" ",[System.StringSplitOptions]::RemoveEmptyEntries)[$USERNAME..$ID] if ($y[$USERNAME] -eq $NameToZap){ logoff $y[$ID] /server:$_ 2>&1 if ($LASTEXITCODE -eq 0) { Write-Host "已成功注销服务器 $_ 上的会话ID $($y[$ID])" } else { Write-Warning "注销服务器 $_ 上的会话ID $($y[$ID]) 失败" } } } } else { Write-Warning "获取服务器 $_ 的会话列表失败:$x" } } else { Write-Warning "服务器 $_ 无法连通" } } catch { Write-Warning "处理服务器 $_ 时出错:$($_.Exception.Message)" } }
二、RPC服务器不可用(错误1722)的解决
这个错误是远程服务器的RPC服务未正常运行,或防火墙/组策略阻止了RPC通信,按以下步骤排查:
检查远程服务器的RPC相关服务状态:
登录目标服务器,确保以下服务已启动并设置为自动:- Remote Procedure Call (RPC)
- Remote Registry
- Remote Desktop Services(原Terminal Services)
开放防火墙端口:
远程会话管理依赖RPC及相关端口,需在目标服务器的防火墙中允许:- TCP端口135(RPC端点映射器)
- 动态RPC端口范围(默认49152-65535,可通过组策略固定范围)
- 也可直接启用Windows防火墙的「远程桌面服务」和「远程过程调用」预设规则
验证远程RPC连通性:
在运行脚本的机器上执行以下命令测试(替换为目标服务器名):Test-NetConnection -ComputerName 目标服务器名 -Port 135返回
TcpTestSucceeded为True说明135端口连通;若失败,检查防火墙或网络路由。检查组策略限制:
确保目标服务器的组策略未禁用远程RPC访问,或限制了管理员的远程会话管理权限:- 组策略路径:
计算机配置 > 管理模板 > 系统 > 远程过程调用 > 限制远程RPC客户端访问 - 确保该策略未设置为「已启用」并拒绝你的管理员账号
- 组策略路径:
三、额外注意事项
- 运行脚本的账号必须是所有目标服务器的本地管理员或域全局管理员,且拥有远程会话管理权限
- 确保
C:\Scripts\ServerNamesL.txt里的服务器名都是正确的NetBIOS名或FQDN,避免拼写错误
内容的提问来源于stack exchange,提问作者Xfive
相关产品推荐
相关产品推荐

