如何通过CLI在同一AD林中跨域获取域本地组的成员身份信息
如何通过CLI在同一AD林中跨域获取域本地组的成员身份信息
我完全理解你的困扰——跨域场景下的域本地组成员查询确实容易踩坑,尤其是你这种全局组跨域嵌套到域本地组的情况。先再明确下你的环境:
- 主域:
main.contoso.local,用户david@main.contoso.local属于全局组MAIN\Global - 测试域:
test.contoso.local,全局组MAIN\Global是域本地组TEST\DomainLocal的成员
你之前用LDAP_MATCHING_RULE_IN_CHAIN没查到结果,核心原因是域本地组的范围限制:它的成员数据存储在自身所在的测试域DC上,而常规的链式匹配查询如果只针对主域或全局目录,是无法跨域抓取到这种关联的。
下面给你几个可行的CLI解决方案:
方法1:使用PowerShell AD模块(推荐)
PowerShell对AD的跨域查询支持更灵活,你可以直接针对测试域的DC进行操作:
从域本地组出发,递归验证用户是否在嵌套成员中
# 指定测试域DC,查询TEST\DomainLocal的所有递归成员,筛选出david Get-ADGroupMember -Identity "TEST\DomainLocal" -Server test.contoso.local -Recursive | Where-Object {$_.SamAccountName -eq "david"}
如果返回david的用户信息,说明他通过嵌套组属于该域本地组。
从用户出发,遍历测试域的所有域本地组进行匹配
# 获取用户david的SID $userSID = (Get-ADUser david@main.contoso.local -Properties ObjectSID).ObjectSID.Value # 查询测试域中所有域本地组,逐一检查用户是否在其递归成员中 Get-ADGroup -Filter {GroupScope -eq 'DomainLocal'} -Server test.contoso.local -Properties Members | ForEach-Object { if (Get-ADGroupMember $_ -Recursive | Where-Object {$_.ObjectSID.Value -eq $userSID}) { Write-Host "用户david属于域本地组:$($_.Name)" } }
方法2:使用传统dsquery/dsget命令行工具
如果你习惯用原生Windows命令,也可以用这套组合:
# 查询测试域中DomainLocal组的所有递归成员,筛选是否包含david dsquery group -s test.contoso.local -name "DomainLocal" | dsget group -members -expand | dsquery user -samid david
如果命令有输出,就说明用户通过嵌套组关联到了该域本地组。
关键注意事项
- 执行这些命令需要你拥有测试域的AD读取权限,毕竟域本地组的元数据只存放在测试域的DC上
- 全局目录(GC)不会同步域本地组的完整成员信息,所以直接查GC拿不到跨域的嵌套关联
- 如果你的森林有多个子域,可以把域列表整理成数组,循环遍历每个域的域本地组进行批量检查
备注:内容来源于stack exchange,提问作者David Trevor




