如何通过LDAP导出AD指定组用户及完整汇报层级信息至CSV
AD指定用户组导出用户详情+全链路汇报链到CSV实现方案
实现思路
单条LDAP查询无法直接递归获取完整上下级链路,因为AD的manager属性仅存储用户的直接上级可分辨名称(DN),需要结合递归查询逻辑实现全链路追踪,用PowerShell调用AD模块是域环境下最简便的实现方式,无需额外第三方工具。
前置条件
- 在已加入域的机器上操作,提前安装RSAT AD PowerShell模块(普通域用户默认拥有AD属性读权限,无需域管权限)
- 提前确认要查询的目标AD用户组的完整名称
操作步骤
- 以普通域用户身份打开PowerShell,执行下方脚本,将脚本内
你的目标用户组名、导出文件保存路径替换为实际环境值 - 脚本会自动递归展开目标组内的嵌套组成员,对每个用户循环向上追踪上级,直到碰到无manager属性的顶层账号自动停止,同时会自动规避汇报链循环的脏数据避免死循环
- 执行完成后直接在指定路径生成CSV文件,可直接用Excel打开编辑
# 导入AD模块 Import-Module ActiveDirectory # --------------------- 配置项 start --------------------- $targetGroupName = "你的目标用户组名" $exportCsvPath = "C:\temp\AD用户带汇报链导出.csv" # --------------------- 配置项 end --------------------- # 递归查询目标组所有用户成员(自动匹配嵌套组内用户) $groupDN = (Get-ADGroup -Filter "Name -eq '$targetGroupName'").DistinguishedName $users = Get-ADUser -LDAPFilter "(&(objectCategory=person)(objectClass=user)(memberOf:1.2.840.113556.1.4.1941:=$groupDN))" -Properties displayName,mail,employeeID,department,title,manager $result = @() foreach ($user in $users) { $managerChain = @() $currentDN = $user.DistinguishedName $processedDN = @() # 记录已处理的DN,避免循环汇报导致死循环 while ($true) { $currentUser = Get-ADUser -Identity $currentDN -Properties displayName,manager -ErrorAction SilentlyContinue if (-not $currentUser -or $processedDN -contains $currentDN) { break } $processedDN += $currentDN if (-not $currentUser.manager) { break } $managerInfo = Get-ADUser -Identity $currentUser.manager -Properties displayName -ErrorAction SilentlyContinue if ($managerInfo) { $managerChain += $managerInfo.displayName $currentDN = $managerInfo.DistinguishedName } else { break } } # 组装导出字段,可按需增减 $result += [PSCustomObject]@{ 登录账号 = $user.SamAccountName 显示姓名 = $user.displayName 邮箱 = $user.mail 工号 = $user.employeeID 部门 = $user.department 职位 = $user.title 全链路汇报线 = ($managerChain -join " > ") } } # 导出CSV,指定UTF8编码避免中文乱码 $result | Export-Csv -Path $exportCsvPath -NoTypeInformation -Encoding UTF8
核心LDAP查询语法说明
如果需要在其他LDAP客户端(比如ldp、第三方系统对接)使用,核心查询规则如下:
- 递归查询指定组所有用户的LDAP过滤语句:
(&(objectCategory=person)(objectClass=user)(memberOf:1.2.840.113556.1.4.1941:=<目标组的完整DN>))
其中OID1.2.840.113556.1.4.1941是AD专属的递归匹配规则,会自动识别嵌套组内的成员,无需手动逐层拆分组 - 单条LDAP查询仅可获取用户的直接上级DN,要获取完整链路必须循环对每个上级的DN发起查询,直到
manager属性为空为止 - 常用拉取的用户属性对应关系:
sAMAccountName:域登录账号displayName:显示姓名mail:企业邮箱employeeID:工号department:所属部门manager:直接上级DN
效果参考

导出的CSV中全链路汇报线会按从直接上级到最高级的顺序用>分隔,和示例展示效果一致。
内容的提问来源于stack exchange,提问作者Aravind Viswanathan
相关产品推荐
相关产品推荐

