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

PowerShell脚本批量更新AD用户属性:经理字段赋值报错求助

批量更新AD用户属性及经理信息脚本

问题分析

你遇到的「期望字符串却传入数组」错误,核心原因有两个:

  1. 原CreateUPN函数中,$CreateUPN是所有用户的UPN数组,循环时直接将整个数组传入Set-ADUser的-Identity参数,而该参数要求单个字符串值
  2. 原Set-ManagerAdUsers函数逻辑混乱:重复导入CSV导致用户与经理的对应关系丢失,同时错误地将所有用户与所有经理进行配对循环,还存在变量赋值错误(比如Write-Output $CreateSAM时变量未定义)

修正后的脚本

$Path = Read-Host "请输入CSV文件路径"

function Update-ADUserProperties {
    Param(
        [Parameter(Mandatory=$True)]
        [string]$CsvPath
    )
    # 仅导入一次CSV,保留用户与经理的对应关系
    $userList = Import-Csv -Path $CsvPath

    foreach ($user in $userList) {
        # 构造当前用户的sAMAccountName(转小写避免大小写匹配问题)
        $userSamAccountName = "$($user."Legal First Name").$($user."Legal Last Name")".ToLower()
        $userUPN = "$userSamAccountName@snipesusa.com"

        # 更新用户基础属性:UPN、职位、员工ID
        try {
            Set-ADUser -Identity $userSamAccountName `
                -UserPrincipalName $userUPN `
                -Title $user."Job Title" `
                -EmployeeID $user."file #" `
                -ErrorAction Stop
            Write-Host "已更新用户 $userSamAccountName 的基础属性"
        }
        catch {
            Write-Warning "更新用户 $userSamAccountName 基础属性失败:$_"
            continue
        }

        # 处理经理信息
        $managerFullName = $user."Reports To Legal Name"
        if ([string]::IsNullOrWhiteSpace($managerFullName)) {
            Write-Host "用户 $userSamAccountName 无汇报对象,跳过经理设置"
            continue
        }

        # 拆分经理姓名:假设格式为「姓, 名」
        $nameParts = $managerFullName -split ',', 2 | ForEach-Object { $_.Trim() }
        if ($nameParts.Count -ne 2) {
            Write-Warning "用户 $userSamAccountName 的经理姓名格式错误:$managerFullName,跳过经理设置"
            continue
        }
        $managerLastName = $nameParts[0]
        $managerFirstName = $nameParts[1].Split(" ")[0] # 取名字的第一个词
        $managerSamAccountName = "$managerFirstName.$managerLastName".ToLower()

        # 查询经理的AD对象路径
        try {
            $managerADObject = Get-ADUser -Filter "sAMAccountName -eq '$managerSamAccountName'" -ErrorAction Stop
            $managerDN = $managerADObject.DistinguishedName

            # 设置用户的经理属性
            Set-ADUser -Identity $userSamAccountName -Manager $managerDN -ErrorAction Stop
            Write-Host "已为用户 $userSamAccountName 设置经理:$managerSamAccountName"
        }
        catch {
            Write-Warning "为用户 $userSamAccountName 设置经理失败:找不到AD用户 $managerSamAccountName 或权限不足,错误信息:$_"
        }
    }
}

# 调用函数执行更新
Update-ADUserProperties -CsvPath $Path

关键修改说明

  • 单次导入CSV:将CSV内容保存到$userList变量,确保每个用户的信息与其经理信息一一对应,避免重复导入和逻辑混乱
  • 一对一处理逻辑:遍历每个用户时,仅处理该用户对应的经理,而非所有经理循环配对
  • 修正参数类型:使用单个用户的sAMAccountName作为Set-ADUser的-Identity参数,确保传入字符串而非数组
  • 增加错误处理:通过try/catch捕获异常,输出警告信息,避免单个用户出错导致整个脚本终止
  • 格式校验:对经理姓名格式进行校验,拆分失败时给出提示,避免无效AD查询

内容的提问来源于stack exchange,提问作者soltkr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:57:05