PowerShell脚本批量更新AD用户属性:经理字段赋值报错求助
批量更新AD用户属性及经理信息脚本
问题分析
你遇到的「期望字符串却传入数组」错误,核心原因有两个:
- 原
CreateUPN函数中,$CreateUPN是所有用户的UPN数组,循环时直接将整个数组传入Set-ADUser的-Identity参数,而该参数要求单个字符串值 - 原
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
相关产品推荐
相关产品推荐

