You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:02:30