如何获取Active Directory指定组的含用户完整子组依赖关系?
列出Active Directory指定组的含用户子组依赖关系
需求说明
获取指定Active Directory组的完整嵌套子组依赖链,仅保留那些至少包含1个用户成员的子组。
现有命令的问题
你当前使用的命令:
dsquery group -samid <specific_group> | dsget group -members -expand | dsquery * -filter "(&(objectclass=group))"
仅能筛选出指定组展开后的所有组类型成员,但存在以下不足:
- 未检查这些子组是否包含用户成员
- 可能输出重复的组条目
- 无法直接关联子组的层级依赖关系
修正后的解决方案
方案1:使用DS命令行工具(批处理脚本)
以下脚本会先递归获取指定组的所有嵌套子组,再逐个验证是否包含用户成员,最终输出符合条件的组信息:
@echo off setlocal enabledelayedexpansion set "targetSamID=<替换为目标组的SAM账户名>" :: 导出指定组的所有嵌套子组(去重) dsquery group -samid !targetSamID! | dsget group -members -expand | dsquery * -filter "(&(objectClass=group))" -limit 0 | sort /unique > temp_groups.txt echo 符合条件的子组(含至少1个用户): echo ------------------------------------- :: 遍历每个组,检查是否存在用户成员 for /f "delims=" %%g in (temp_groups.txt) do ( :: 查询当前组的成员,筛选用户类型条目 dsget group %%g -members | findstr /i "CN=.*,OU=.*,DC=.*" | findstr /v "objectClass=group" > nul if not errorlevel 1 ( echo 组DN:%%g dsget group %%g -samid -displayname echo ------------------------------------- ) ) :: 清理临时文件 del temp_groups.txt endlocal
方案2:使用PowerShell(更高效直观)
PowerShell的AD模块能更灵活地处理递归查询和条件筛选,适合大规模AD环境:
# 替换为目标组的SAM账户名或组DN $targetGroup = "<替换为目标组标识>" # 递归获取指定组的所有嵌套子组(去重) $allNestedGroups = Get-ADGroupMember -Identity $targetGroup -Recursive | Where-Object { $_.ObjectClass -eq 'group' } | Select-Object -Unique # 筛选出包含至少1个用户成员的组 $groupsWithUsers = $allNestedGroups | ForEach-Object { $group = Get-ADGroup $_ -Properties Members # 检查组内是否存在用户类型的成员 if ($group.Members | ForEach-Object { (Get-ADObject $_).ObjectClass } -contains 'user') { $_ } } # 格式化输出结果 $groupsWithUsers | Select-Object Name, SamAccountName, DistinguishedName | Format-Table -AutoSize
说明
- 方案1需要确保你有AD命令行工具(dsquery、dsget)的执行权限,且命令行环境已加入AD域
- 方案2需要安装RSAT-AD-PowerShell模块,且运行PowerShell的账号拥有AD读取权限
内容的提问来源于stack exchange,提问作者Doublementi
相关产品推荐
相关产品推荐

