如何通过匹配姓名为AD中缺失EmployeeID的用户批量更新ID?
技术解决方案:匹配HR CSV与AD用户并更新EmployeeID
需求背景
近期已完成SuccessFactors与本地AD(On-Prem AD)的Azure AD配置集成。为使部分现有用户纳入更新配置范围,需先通过员工ID(EmployeeID)进行匹配(当前未启用创建功能)。已确认约400名用户需完成匹配,HR团队提供了包含「全名(Full Name)、员工ID(EmployeeID)」属性的CSV文件。需将该文件与AD中无员工ID的所有用户进行比对,为匹配成功的用户更新EmployeeID。
现有PowerShell脚本
#导入包含「正式姓名(Formal Name)、员工ID(EmployeeID)」属性的HR文件 #返回约6500条记录 $SFUsers = Import-Csv Z:\ExportsFromProd\Global_ActiveHeadcountReport_08292022.csv #返回约1400条记录 #部分账户从未设置员工ID $users = Get-ADUser -Filter "*" -Properties EmployeeID | Where-Object {$_.employeeID -eq $null} foreach ($account in $users) { $accountName = $account.name get-aduser -Filter {Name -eq $accountName} -Properties * | Select-Object samaccountname, displayName #以下是需要帮助的部分: <# try { 在$SFUsers数组中查找匹配$accountName的「正式姓名(Formal Name)」? 获取对应的员工ID并执行:set-aduser $account -employeeId 对应员工ID } catch { } finally { } #> }
优化后的解决方案脚本
核心优化点
- 将HR CSV数据转换为哈希表,以「全名」为键、「员工ID」为值,大幅提升匹配效率(避免每次循环遍历6500条记录)
- 移除冗余的
Get-ADUser调用,直接使用已获取的AD用户对象 - 添加错误处理与日志输出,便于排查问题
# 导入HR CSV文件,注意确认CSV中的姓名列标题是否为"Full Name",如果是中文标题需对应修改 $SFUsers = Import-Csv Z:\ExportsFromProd\Global_ActiveHeadcountReport_08292022.csv # 将SFUsers转换为哈希表,键为全名,值为员工ID $sfUserMap = @{} foreach ($sfUser in $SFUsers) { # 确保姓名不为空,避免无效键 if (-not [string]::IsNullOrWhiteSpace($sfUser.'Full Name')) { $sfUserMap[$sfUser.'Full Name'] = $sfUser.EmployeeID } } # 获取AD中未设置EmployeeID的用户(用AD Filter替代Where-Object,提升查询效率) $adUsersWithoutEmpID = Get-ADUser -Filter "EmployeeID -notlike '*'" -Properties EmployeeID, DisplayName # 遍历AD用户进行匹配与更新 foreach ($adUser in $adUsersWithoutEmpID) { $userName = $adUser.Name Write-Host "正在处理用户: $userName" # 在哈希表中查找匹配的员工ID if ($sfUserMap.ContainsKey($userName)) { $targetEmpID = $sfUserMap[$userName] try { # 更新AD用户的EmployeeID属性 Set-ADUser -Identity $adUser -EmployeeID $targetEmpID -ErrorAction Stop Write-Host "✅ 成功为用户 $userName 更新EmployeeID为: $targetEmpID" } catch { Write-Host "❌ 更新用户 $userName 失败: $_" -ForegroundColor Red } } else { Write-Host "⚠️ 在HR文件中未找到用户 $userName 的匹配记录" -ForegroundColor Yellow } }
注意事项
- 确认CSV文件中的姓名列标题与脚本中
$sfUser.'Full Name'一致,如果CSV列是中文「全名」,需修改为$sfUser.'全名' - 建议先在测试环境验证脚本,避免误操作生产AD
- 如果AD用户的
Name属性与HR文件中的「全名」格式不一致(比如存在后缀、缩写差异),可调整匹配逻辑为使用DisplayName替代Name,或添加模糊匹配逻辑
内容的提问来源于stack exchange,提问作者bomgar
相关产品推荐
相关产品推荐

