powershell可批量重置windows终端本地管理员密码,但需满足winrm启用、防火墙放行、账户具本地管理员权限及执行策略允许等前提;脚本通过invoke-command分发,支持批量处理与日志审计。
powershell 可以批量重置域内或工作组环境下 windows 终端的本地管理员密码,但必须满足权限、网络连通性和执行策略等前提条件。它不能绕过安全策略“远程重置任意设备密码”,更不能用于未授权设备——这既是技术限制,也是合规红线。
确认适用场景与权限基础
脚本只对以下情况有效:
- 目标终端已启用 WinRM(推荐配置为 HTTPS 或受信任的 HTTP)且防火墙放行 5985/5986 端口
- 运行脚本的账户在每台目标机器的 Administrators 组中(域账户需有本地管理员权限)
- 目标系统 PowerShell 执行策略允许远程签名脚本(如
RemoteSigned或Unrestricted) - 非域环境需提前用
Enable-PSRemoting -Force启用远程管理;域环境建议通过 GPO 统一配置
核心脚本:单机重置 + 批量调用
先写一个可复用的本地密码重置函数,再通过 Invoke-Command 分发执行:
function Reset-LocalAdminPassword {
param(
[string]$ComputerName = 'localhost',
[string]$Username = 'Administrator',
[string]$NewPassword = (ConvertTo-SecureString 'P@ssw0rd123!' -AsPlainText -Force)
)
try {
Invoke-Command -ComputerName $ComputerName -ScriptBlock {
param($user, $pwd)
$acct = Get-LocalUser -Name $user
if ($acct) {
$acct | Set-LocalUser -Password $pwd
Write-Output "[$using:ComputerName] ✔ 密码已更新"
} else {
Write-Warning "[$using:ComputerName] ✘ 用户 $user 不存在"
}
} -ArgumentList $Username, $NewPassword -ErrorAction Stop
} catch {
Write-Error "[$ComputerName] ❌ $($_.Exception.Message)"
}
}
<h1>批量执行(从文本文件读取计算机名)</h1><p>Get-Content .\computers.txt | ForEach-Object {
Reset-LocalAdminPassword -ComputerName $_ -Username 'Administrator'
}</p>
注意:computers.txt 每行一个主机名或 IP,确保能被 DNS 解析或已写入 hosts 文件。
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统
增强可靠性与审计能力
生产环境建议加入检查和日志:
- 用
Test-Connection -Count 1 -Quiet预检主机在线状态 - 用
Test-WSMan验证 WinRM 是否就绪 - 将结果导出为 CSV:
... | Export-Csv .\reset_log.csv -Append -Encoding UTF8 - 密码建议由
New-Guid或System.Web.Security.Membership::GeneratePassword()动态生成,避免硬编码
替代方案与注意事项
若 WinRM 不可用,可考虑:
- 通过组策略首选项(GPP)部署密码(已弃用,存在凭据明文风险,仅限旧环境临时使用)
- 用 SCCM / Intune 等 MDM 工具下发 PowerShell 脚本(推荐企业级场景)
- 物理/带外方式(如 Intel AMT、iDRAC)不依赖操作系统,但需硬件支持
严禁在无授权、无审计、无备份凭证的情况下执行批量密码操作。每次任务前应先导出当前本地管理员 SID 和状态:Get-LocalUser | Where-Object {$_.Enabled} | Select Name,SID,LastLogon。










