使用PowerShell跨多域查询SamAccountName填充CSV员工ID列
问题
需要通过CSV文件中名为OwnerEmail(对应用户主体名称UserPrincipalName)的列查询Active Directory,以此填充CSV的Employee ID列。但OwnerEmail列中的用户并非都属于同一域,需同时查询两个域。
参考表格:
| Employee ID | OwnerEmail | DeptNumber | Costs |
|---|---|---|---|
| test@mail.com | 0894 | 4654.45 | |
| test2@mail.com | 3453 | 4994.15 |
尝试的脚本(无法运行且无错误提示):
$Domains='us.domain.corp', 'uk.domain.corp' $CSVImport |Select-Object @{ Name = "employeeID" Expression = { foreach($user in $CSVImport) { foreach($Domain in $Domains){ $user= (Get-ADUser -Filter "UserPrincipalName -eq '$($_.OwnerEmail)'" -Server $Domain -Properties 'SamAccountName').SamAccountName } } }}, * |Select-Object employeeID, DepartmentNumber, OwnerEmail, @{Name="Costs"; Expression={"$ $($_.Cost)"}} | Export-Csv "$Env:temp/$OutputFile" -NoTypeInformation
解决思路与修正脚本
原脚本核心问题
- 循环逻辑混乱:在
Select-Object的表达式块内重复遍历整个$CSVImport集合,导致每一行数据被无意义地重复处理,逻辑完全错误。 - 无有效返回值:循环中仅将查询结果赋值给变量,未返回最终结果;且未处理"多域查询到重复用户"或"查询不到用户"的场景。
- 属性名称不匹配:原表格列名为
DeptNumber,但后续选择列用了DepartmentNumber,会导致该列数据丢失;Costs列名也被误写为Cost。 - 缺失CSV导入步骤:原脚本未执行
Import-Csv加载数据源,这是脚本无法运行的关键原因之一。 - 无错误捕获:查询AD时失败无提示,无法排查问题。
修正后的脚本
$Domains = 'us.domain.corp', 'uk.domain.corp' $CSVPath = "你的CSV文件完整路径" # 替换为实际CSV路径 $OutputFile = "处理后的结果.csv" # 自定义输出文件名 # 导入CSV数据源 $CSVImport = Import-Csv -Path $CSVPath # 逐行处理CSV数据 $processedData = $CSVImport | ForEach-Object { $currentEmail = $_.OwnerEmail $employeeId = $null # 遍历域查询用户,找到匹配项后立即停止 foreach ($Domain in $Domains) { try { $adUser = Get-ADUser -Filter "UserPrincipalName -eq '$currentEmail'" -Server $Domain -Properties employeeID -ErrorAction Stop if ($adUser) { $employeeId = $adUser.employeeID break } } catch { Write-Warning "查询域 $Domain 时,用户 $currentEmail 出现错误: $_" } } # 构造输出对象 [PSCustomObject]@{ 'Employee ID' = $employeeId ?? "" # 查询不到则留空 'OwnerEmail' = $currentEmail 'DeptNumber' = $_.DeptNumber 'Costs' = "`$ $($_.Costs)" } } # 导出处理后的CSV $processedData | Export-Csv -Path "$Env:temp/$OutputFile" -NoTypeInformation
关键改进点
- 用
ForEach-Object逐行处理数据,逻辑清晰,避免无效循环。 - 添加
try/catch捕获AD查询错误,输出警告便于排查问题。 - 找到匹配用户后立即终止域循环,提升处理效率。
- 修正所有属性名称匹配问题,确保数据完整。
- 明确处理"查询不到用户"的场景,保留空值。
- 补充CSV导入步骤,完善脚本完整性。
内容的提问来源于stack exchange,提问作者CoCoBl
相关产品推荐
相关产品推荐

