如何用PowerShell解析CSV中DistinguishedName列的指定OU
解决PowerShell查询AD用户时提取指定OU并导出的问题
原脚本问题分析
你的脚本存在两个主要问题:
- 重复调用
Get-ADUser,造成不必要的性能损耗 - 未实现从
DistinguishedName中提取目标OU的逻辑
优化后的脚本
以下脚本会保留原DistinguishedName列,同时新增OU列,按规则提取部门或公司OU:
$UserList = Get-Content C:\User\useremails.csv $outputPath = 'C:\User\accounts.csv' # 可选:清空输出文件,避免多次运行重复追加 if (Test-Path $outputPath) { Remove-Item $outputPath } foreach ($user in $UserList) { # 使用字符串Filter提升兼容性,避免脚本块的潜在问题 Get-ADUser -Filter "EmailAddress -eq '$user'" -Properties Name | Select-Object samAccountName, UserPrincipalName, @{ Name = 'OU' Expression = { # 拆分DN并提取所有OU名称 $ouParts = $_.DistinguishedName -split ', ' | Where-Object { $_ -match '^OU=' } | ForEach-Object { $_ -replace '^OU=', '' } # 过滤掉"users" OU,保留后续层级 $relevantOUs = $ouParts | Where-Object { $_ -ne 'users' } # 优先取第一个非"company"的OU,无匹配则取"company" $targetOU = $relevantOUs | Where-Object { $_ -ne 'company' } | Select-Object -First 1 $targetOU ?? 'company' # PowerShell 7+可用,低版本用if判断 } }, DistinguishedName | Export-Csv -Path $outputPath -Append -NoTypeInformation }
兼容PowerShell 5.x版本的写法
如果使用PowerShell 5.x(不支持空值合并运算符??),请将Expression部分替换为:
Expression = { $ouParts = $_.DistinguishedName -split ', ' | Where-Object { $_ -match '^OU=' } | ForEach-Object { $_ -replace '^OU=', '' } $relevantOUs = $ouParts | Where-Object { $_ -ne 'users' } $targetOU = $relevantOUs | Where-Object { $_ -ne 'company' } | Select-Object -First 1 if (-not $targetOU) { $targetOU = 'company' } $targetOU }
逻辑说明
- 拆分DN:将
DistinguishedName按,拆分,提取所有以OU=开头的项并去掉前缀 - 过滤无关OU:排除
usersOU,聚焦后续层级 - 提取目标OU:优先选择第一个非
company的OU(即部门OU),如果没有则直接取company
运行后生成的CSV会完全符合你期望的输出格式。
内容的提问来源于stack exchange,提问作者noobCoder
相关产品推荐
相关产品推荐

