如何用PowerShell结合CSV重命名Active Directory多台计算机并修复脚本问题?
批量修改域内计算机名脚本问题解决
我们计划通过Active Directory更改域内计算机的命名规范,但进展不顺利。已导出特定OU中的计算机名CSV文件,修改后仅保留两列:旧计算机名、新计算机名。希望批量修改CSV中所有计算机名并重启机器,但脚本无法正常弹出域管理员凭据输入窗口,附上当前脚本:
$oldname = "oldname" $newname = "newname" $computernameold = import-csv -Path "shareddrivepath" | select $oldname $computernamenew = import-csv -Path "shareddrivepath" | select $newname Foreach ($oldname in $computernameold) { Rename-Computer -ComputerName $computernameold -NewName $computernamenew Get-Credential Restart-Computer -Computername $computernamenew -force } pause
问题分析
- 两次导入同一CSV并分别提取列,会导致循环时无法对应每行的新旧名称关系
Rename-Computer命令参数格式错误:Get-Credential未通过参数传递,且-NewName与Get-Credential之间缺少逗号分隔- 循环变量命名冲突:
$oldname既用作CSV列名变量,又用作循环迭代变量 - 直接使用新名称执行
Restart-Computer,改名后AD/DNS可能未同步,导致无法连接目标机器
修正后的脚本
# 定义CSV中的列名 $oldNameColumn = "oldname" $newNameColumn = "newname" # 一次性导入CSV,保留每行的新旧名称对应关系 $computerList = Import-Csv -Path "shareddrivepath" # 提前获取域管理员凭据,避免重复弹窗 $adminCredential = Get-Credential -Message "请输入域管理员账号密码" foreach ($entry in $computerList) { $oldName = $entry.$oldNameColumn $newName = $entry.$newNameColumn try { # 执行计算机重命名,指定域管理员凭据 Rename-Computer -ComputerName $oldName -NewName $newName -DomainCredential $adminCredential -Force -ErrorAction Stop Write-Host "✅ 成功将 $oldName 重命名为 $newName" # 等待AD同步(根据实际环境调整等待时长) Start-Sleep -Seconds 30 # 使用旧名称重启计算机,避免同步延迟导致的连接失败 Restart-Computer -ComputerName $oldName -Force -ErrorAction Stop Write-Host "🔄 已触发 $oldName 重启" } catch { Write-Host "❌ 处理 $oldName 时出错: $_" -ForegroundColor Red } } pause
关键修正说明
- 单次导入CSV,确保每行的新旧名称一一对应
- 提前获取凭据,减少重复操作
- 规范
Rename-Computer参数传递,通过-DomainCredential指定管理员权限 - 使用旧名称执行重启,规避AD/DNS同步延迟问题
- 添加错误捕获与日志输出,便于排查失败案例
- 增加同步等待时间,适配域环境的复制延迟
内容的提问来源于stack exchange,提问作者AscendedMind
相关产品推荐
相关产品推荐

