如何修改PowerShell代码实现从CSV批量更新Active Directory用户数据?
解决PowerShell仅更新AD第一行CSV数据的问题
你的核心问题是**Set-ADUser命令没有放在ForEach-Object的循环块内部**——当前代码会先遍历所有CSV行,最后才执行一次用户更新操作,自然只能处理最后一行数据(你提到只更新第一行,可能是后续行的参数为空导致无变化,但本质是逻辑执行位置错误)。
另外还要注意CSV列名和代码变量的对应问题:你的CSV里职位列是Job Title,但原代码用的是$_.Title,这会导致职位信息无法更新;还有CSV里的HomePhone对应代码里的OfficePhone,需要调整匹配才能正确赋值。
下面是修正后的完整代码:
Import-Module ActiveDirectory # 导入CSV文件,注意列名和后续变量的对应关系 Import-Csv "C:\code.csv" -Delimiter ';' -Encoding "UTF8" | ForEach-Object { # 初始化参数哈希表,每行都会重新创建一个独立的params对象 $params = @{Identity = $_.SamAccountName} # 逐个判断字段是否非空,非空则添加到参数表中 if (-not [string]::IsNullOrWhiteSpace($_.Surname)) { $params.Surname = $_.Surname } if (-not [string]::IsNullOrWhiteSpace($_.Givenname)) { $params.Givenname = $_.Givenname } if (-not [string]::IsNullOrWhiteSpace($_.DisplayName)) { $params.DisplayName = $_.DisplayName } # 修正CSV列名匹配:CSV里是"Job Title",用反引号包裹带空格的列名 if (-not [string]::IsNullOrWhiteSpace($_.`Job Title`)) { $params.Title = $_.`Job Title` } if (-not [string]::IsNullOrWhiteSpace($_.Department)) { $params.Department = $_.Department } if (-not [string]::IsNullOrWhiteSpace($_.Manager)) { $params.Manager = $_.Manager } # 修正CSV列名匹配:CSV里的"HomePhone"对应AD的OfficePhone字段 if (-not [string]::IsNullOrWhiteSpace($_.HomePhone)) { $params.OfficePhone = $_.HomePhone } if (-not [string]::IsNullOrWhiteSpace($_.MobilePhone)) { $params.MobilePhone = $_.MobilePhone } # 关键修改:把Set-ADUser放到循环内部,每行CSV数据执行一次更新 Set-ADUser @params # 可选:添加日志输出,方便验证哪些用户被处理 Write-Host "已完成AD用户更新: $($_.SamAccountName)" }
额外提示
- 每行CSV数据都会独立触发一次
Set-ADUser,确保所有用户信息都能被更新 - 新增的
Write-Host日志可以帮你快速排查哪条用户数据被处理,方便定位问题 - 注意AD用户的
Manager字段需要填写目标用户的SamAccountName或可分辨名称,确保AD中存在对应用户,否则会触发报错
内容的提问来源于stack exchange,提问作者Lobi
相关产品推荐
相关产品推荐

