如何将AD OU用户统计结果持续导出至Excel/CSV?
最优实现方案:PowerShell自动统计OU用户数并写入CSV
首先咱们先优化下你原来的AD查询逻辑——之前是先拉取所有用户再过滤启用状态,其实可以直接把启用条件整合到Get-ADUser的-Filter参数里,这样能大幅减少AD返回的数据量,运行效率会更高。
核心思路很清晰:统计两个OU的启用用户数→把日期、统计值封装成结构化对象→判断目标CSV文件状态(不存在就新建带表头,存在就追加数据)→保留你原有的邮件通知逻辑。
完整脚本示例
# 定义要统计的OU路径 $normalOuPath = "OU=Normal,OU=Benutzer und Computer,DC=my,DC=domain" $specialOuPath = "OU=Special,OU=Benutzer und Computer,DC=my,DC=Domain" # 定义CSV文件的保存路径(建议选固定的本地目录或共享文件夹) $csvSavePath = "C:\UserStatistics\OUUserCountHistory.csv" try { # 统计Normal OU的启用用户数(直接在Filter里筛选启用状态,更高效) $normalEnabledCount = (Get-ADUser -SearchBase $normalOuPath -Filter { Enabled -eq $true }).Count # 统计Special OU的启用用户数 $specialEnabledCount = (Get-ADUser -SearchBase $specialOuPath -Filter { Enabled -eq $true }).Count # 获取当前月份(格式MM-yyyy) $currentMonth = Get-Date -Format "MM-yyyy" # 构造要写入CSV的结构化对象 $statsRecord = [PSCustomObject]@{ "日期" = $currentMonth "Special OU用户数" = $specialEnabledCount "Normal OU用户数" = $normalEnabledCount } # 处理CSV写入逻辑:文件不存在则创建(自动生成表头),存在则追加数据 if (-not (Test-Path -Path $csvSavePath)) { # 先创建父目录(如果不存在的话) $null = New-Item -Path (Split-Path $csvSavePath -Parent) -ItemType Directory -Force $statsRecord | Export-Csv -Path $csvSavePath -Encoding UTF8 -NoTypeInformation -Delimiter "," } else { $statsRecord | Export-Csv -Path $csvSavePath -Encoding UTF8 -NoTypeInformation -Delimiter "," -Append } # 保留你原有的邮件发送逻辑(这里给个示例模板) $mailSettings = @{ From = "ou-stats@my.domain" To = "your-email@my.domain" Subject = "[$currentMonth] OU启用用户统计结果" Body = "统计日期:$currentMonth`nSpecial OU启用用户数:$specialEnabledCount`nNormal OU启用用户数:$normalEnabledCount" SmtpServer = "smtp.my.domain" } Send-MailMessage @mailSettings Write-Host "统计完成,数据已写入CSV并发送通知邮件" } catch { Write-Error "执行过程出错:$_" # 可选:添加错误通知邮件逻辑,方便及时排查问题 }
为什么优先选CSV而不是Excel?
- 无依赖:不需要安装Excel或Office组件,PowerShell原生支持,在服务器上也能稳定运行
- 低风险:不会出现Excel文件被占用导致写入失败的情况,追加数据逻辑简单可靠
- 兼容性强:CSV可以直接用Excel、记事本、Power BI等工具打开查看或做后续分析
自动化部署建议
用Windows任务计划程序每月自动运行脚本:
- 创建新任务,触发条件设为「每月」,选择你需要的运行日期和时间
- 操作选择「启动程序」,程序/脚本填
powershell.exe,参数填-ExecutionPolicy Bypass -File "C:\Scripts\YourScriptName.ps1"(替换成你的脚本实际路径) - 确保任务运行的账号拥有AD读取权限和CSV路径的读写权限
内容的提问来源于stack exchange,提问作者batchn00b
相关产品推荐
相关产品推荐

