如何将多OU的AD用户查询结果导出至同一张Excel工作表?
多OU提取空employeeNumber属性的活跃用户并合并导出到同一Excel工作表
原脚本的问题在于三次独立调用Export-Excel,每次都会覆盖目标工作表的内容,最终只会保留最后一个OU的查询结果。以下是修正后的方案,将三个OU的结果合并后一次性导出:
修正后的PowerShell脚本
$date = Get-Date -Format yyyy-MM-dd $path = "c:\temp\empty_attributes.xlsx" # 将需要查询的OU存入数组,便于批量处理 $OUs = @( "OU=Accounts,DC=com,DC=contoso", "OU=TestAccounts,DC=com,DC=contoso", "OU=Users,DC=com,DC=contoso" ) # 初始化空数组存储所有查询结果 $allResults = @() foreach ($ou in $OUs) { # 查询当前OU中employeeNumber为空且启用的用户,仅加载需要的属性(避免-Properties *的性能浪费) $users = Get-ADUser -Filter "(-not(employeeNumber -like '*')) -and (Enabled -eq 'True')" ` -SearchBase $ou ` -Properties employeeNumber | Select-Object Name, SamAccountName, EmployeeNumber # 将当前OU的结果合并到总结果数组 $allResults += $users } # 将合并后的结果一次性导出到Excel的指定工作表 $allResults | Export-Excel -Path $path ` -WorksheetName $date ` -AutoSize ` -AutoFilter ` -TableStyle Medium2
关键优化点
- 批量处理OU:用数组存储OU列表,通过循环遍历减少重复代码
- 属性优化:替换
-Properties *为-Properties employeeNumber,只加载需要的属性,提升查询效率 - 结果合并:先收集所有OU的查询结果到一个数组,再一次性导出,避免覆盖工作表内容
- 过滤条件标准化:将脚本块形式的Filter改为字符串形式,符合PowerShell最佳实践
内容的提问来源于stack exchange,提问作者ak2595
相关产品推荐
相关产品推荐

