需先在每台目标主机以管理员身份运行Enable-PSRemoting -Force启用远程处理,确保WinRM服务运行、防火墙放行5985/5986端口,并根据域或工作组环境配置认证方式,再通过Test-WsMan验证连通性及凭据权限。
确认远程主机已启用PowerShell远程处理
批量管理的前提是能远程执行命令。默认情况下Windows禁用PSRemoting,需在每台目标主机上以管理员身份运行:
Enable-PSRemoting -Force
同时确保WinRM服务正在运行(Get-Service WinRM 返回状态为 Running),防火墙允许WinRM入站规则(通常为端口5985/HTTP 或 5986/HTTPS)。若使用域环境,推荐配置HTTPS证书并启用Kerberos认证;工作组环境下可启用基本认证(需额外设置Set-Item WSMan:\localhost\Service\AllowUnencrypted $true 和 Set-Item WSMan:\localhost\Service\Auth\Basic $true),但注意传输安全风险。
建立可信连接并验证会话可用性
使用new-pssession或invoke-command前,先测试连通性。例如:
Test-WsMan -ComputerName "192.168.1.10" -Authentication Negotiate
若失败,检查主机名解析、网络可达性、凭据权限(需本地管理员组成员)及CredSSP是否启用(跨跳场景需要)。建议将目标主机列表存为数组或CSV文件,再循环建立会话:
$Computers = "srv01", "srv02", "srv03"
$Sessions = New-PSSession -ComputerName $Computers -Credential (Get-Credential)
批量添加或移除本地组中的用户
通过Add-LocalGroupMember或Remove-LocalGroupMember。例如批量将域用户DOMAIN\jane加入所有主机的Administrators组:
- Invoke-Command -Session $Sessions -ScriptBlock { Add-LocalGroupMember -Group "Administrators" -Member "DOMAIN\jane" }
- 移除时替换为Remove-LocalGroupMember,支持通配符或SID,避免因用户名大小写或别名导致失败
- 若需添加本地账户(如.\backupuser),注意语法中点号和反斜杠的转义,建议统一用"$env:COMPUTERNAME\backupuser"形式
- 操作前可用Get-LocalGroupMember -Group "Administrators"预检成员列表,避免重复添加
错误捕获与结果汇总输出
生产环境中必须处理常见异常:目标离线、权限不足、组不存在、用户已存在等。推荐使用try/catch包裹远程调用,并记录详细日志:
Invoke-Command -Session $Sessions -ScriptBlock {
try {
Add-LocalGroupMember -Group "Remote Desktop Users" -Member "DOMAIN\tom" -ErrorAction Stop
"$env:COMPUTERNAME : 成功"
} catch {
"$env:COMPUTERNAME : 失败 — $($_.Exception.Message)"
}
}
结果可导出为CSV:
| Export-Csv -Path .\group_update_log.csv -Encoding UTF8 -NoTypeInformation











