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

如何用PowerShell解析CSV中DistinguishedName列的指定OU

解决PowerShell查询AD用户时提取指定OU并导出的问题

原脚本问题分析

你的脚本存在两个主要问题:

  1. 重复调用Get-ADUser,造成不必要的性能损耗
  2. 未实现从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
}

逻辑说明

  1. 拆分DN:将DistinguishedName按, 拆分,提取所有以OU=开头的项并去掉前缀
  2. 过滤无关OU:排除users OU,聚焦后续层级
  3. 提取目标OU:优先选择第一个非company的OU(即部门OU),如果没有则直接取company

运行后生成的CSV会完全符合你期望的输出格式。

内容的提问来源于stack exchange,提问作者noobCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 01:08:28