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

使用PowerShell跨多域查询SamAccountName填充CSV员工ID列

问题

需要通过CSV文件中名为OwnerEmail(对应用户主体名称UserPrincipalName)的列查询Active Directory,以此填充CSV的Employee ID列。但OwnerEmail列中的用户并非都属于同一域,需同时查询两个域。

参考表格:

Employee IDOwnerEmailDeptNumberCosts
test@mail.com08944654.45
test2@mail.com34534994.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  
解决思路与修正脚本

原脚本核心问题

  1. 循环逻辑混乱:在Select-Object的表达式块内重复遍历整个$CSVImport集合,导致每一行数据被无意义地重复处理,逻辑完全错误。
  2. 无有效返回值:循环中仅将查询结果赋值给变量,未返回最终结果;且未处理"多域查询到重复用户"或"查询不到用户"的场景。
  3. 属性名称不匹配:原表格列名为DeptNumber,但后续选择列用了DepartmentNumber,会导致该列数据丢失;Costs列名也被误写为Cost。
  4. 缺失CSV导入步骤:原脚本未执行Import-Csv加载数据源,这是脚本无法运行的关键原因之一。
  5. 无错误捕获:查询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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:01:00