查询空AD组脚本异常:误返回含成员组问题求助
排查与修复AD空组提取脚本问题
问题根源
Domain Users、Domain Computers这类内置组的成员是动态计算的(比如Domain Users默认包含所有域用户对象),它们的Members属性并不会存储所有成员的DN,而是通过安全标识符(SID)隐式包含成员。你的脚本用-not $_.members判断时,这类组的Members集合可能为空(无显式添加的成员),因此被误判为空组。另外,部分大组可能因AD查询限制,Members属性未完整返回,也会导致误判。
修复后的脚本
方法1:通过实际查询成员验证(准确性高)
Get-ADGroup -Filter * | ForEach-Object { $memberCount = (Get-ADGroupMember -Identity $_ -ErrorAction SilentlyContinue).Count if ($memberCount -eq 0) { $_ } }
该方法会实际查询每个组的成员,能精准识别空组,但在组数量较多的场景下,执行速度较慢。
方法2:利用AD内置属性快速判断(效率高)
Get-ADGroup -Filter "memberCount -eq 0" -Properties memberCount
Windows Server 2008及以上的AD默认支持memberCount属性,它会统计组的实际成员数(包括隐式成员),既能避免内置组误判,又能大幅提升查询速度。
补充方案:排除特定内置组(仅临时应急)
如果坚持使用原脚本逻辑,可手动排除已知的特殊内置组,但该方法不通用,仅适用于临时场景:
Get-ADGroup -Filter * -Properties Members | Where-Object { -not $_.members -and $_.Name -notin @("Domain Users", "Domain Computers", "Domain Admins") }
内容的提问来源于stack exchange,提问作者Newbie-PS
相关产品推荐
相关产品推荐

