PowerShell无法直接统计受限组启用状态,因其配置仅存于GPO的GptTmpl.inf文件中;需结合Get-GPO与解析该文件提取组名及成员。
powershell 本身无法直接“统计受限制组”(restricted groups)的启用状态或成员明细,因为受限组策略(restricted groups)是组策略对象(gpo)中的一项配置项,不以活动目录对象形式存在,也不存储在域控制器的ad数据库中。它只存在于 gpo 的 group policy template(gpt)中,具体在 gpttmpl.inf 文件的 [group membership] 节里。
一、受限组策略的本质与存储位置
受限组是通过组策略实现的强制性成员管理机制,用于确保特定安全组(如 Administrators、Backup Operators)只包含指定用户/组,且自动移除非授权成员。其配置:
- 不写入 Active Directory,不生成 LDAP 对象,无法用
Get-ADGroup或Get-ADObject查询 - 保存在每个启用该策略的 GPO 的 SYSVOL 共享路径下:
\SYSVOL Policies{GUID}MachineMicrosoftWindows NTSecEditGptTmpl.inf - 需结合
Get-GPO+ 解析GptTmpl.inf才能提取
二、获取所有启用受限组的GPO及其组明细
以下脚本可枚举当前域中所有已链接、已启用、且实际配置了受限组的 GPO,并解析出组名和声明的成员:
# 必须在域控制器或安装了 GroupPolicy 模块的域成员机上运行(Windows Server / RSAT)
Import-Module GroupPolicy -ErrorAction SilentlyContinue
<h1>获取所有已启用、且链接到某OU/站点/域的GPO(排除未链接或已禁用的)</h1><p>$EnabledLinkedGPOs = Get-GPO -All | Where-Object {
$<em>.GpoStatus -ne 'AllSettingsDisabled' -and
(Get-GPOReport -Guid $</em>.Id -ReportType XML | Select-String -Pattern '<linksto>').Length -gt 0
}</linksto></p><p>$results = foreach ($gpo in $EnabledLinkedGPOs) {
$gptPath = "$env:USERDNSDOMAINSYSVOL$env:USERDNSDOMAINPolicies$($gpo.Id)MachineMicrosoftWindows NTSecEditGptTmpl.inf"</p><pre class="brush:php;toolbar:false;">if (Test-Path $gptPath) {
try {
$content = Get-Content $gptPath -ErrorAction Stop
$inSection = $false
$groupName = $null
foreach ($line in $content) {
# 匹配 [Group Membership] 节开始
if ($line.Trim() -eq '[Group Membership]') {
$inSection = $true
continue
}
if ($line.Trim() -match '^[.*]$') { # 遇到下一个节,退出
$inSection = $false
continue
}
if ($inSection -and $line.Trim() -match '^S-d-d+-(d+-){1,14}d$') {
# 跳过SID行(旧格式可能有,新版通常无)
continue
}
if ($inSection -and $line.Trim() -match '^([^=]+)=(.*)$') {
$groupName = $matches[1].Trim()
$members = $matches[2].Trim() -split ','
foreach ($member in $members) {
$member = $member.Trim()
if (-not [string]::IsNullOrWhiteSpace($member)) {
[PSCustomObject]@{
GPODisplayName = $gpo.DisplayName
GPOId = $gpo.Id
GroupName = $groupName
Member = $member
GptTmplPath = $gptPath
}
}
}
}
}
} catch {
# 忽略无 GptTmpl.inf 或权限不足的GPO(如空策略、仅用户配置)
}
}}
$results | Sort-Object GPODisplayName, GroupName, Member | Format-Table -AutoSize
三、注意事项与常见问题
- 需域管理员权限:读取 SYSVOL 和 GPO 元数据需要对域和 SYSVOL 共享有读取权限
- 不是所有GPO都有 GptTmpl.inf:仅配置了计算机端安全设置(如受限组、密码策略)的 GPO 才生成该文件
-
组名可能是SAM名称或DN:受限组中填写的组名通常是
DOMAINGroupName或完整 DN;脚本未自动解析为友好名,如需可追加Get-ADGroup -Identity查询(注意处理异常) -
不反映实时生效状态:该结果仅表示“策略中配置了”,不代表客户端已应用或当前实际成员——真实成员需在目标计算机上运行
gpresult /h report.html或检查secedit /export结果
四、替代验证方式:检查某台计算机的实际受限组效果
若想确认某台机器是否受某受限组策略影响,可在该机运行:
# 导出当前应用的安全模板(含受限组生效后的结果) secedit /export /cfg C: empsecurity.cfg /areas GROUP_MGMT <h1>查看导出文件中的 [Group Membership] 节(若有)</h1><p>Select-String -Path C: empsecurity.cfg -Pattern '^[Group Membership]|^.*='</p>
此方法显示的是策略应用后系统实际强制写入的组成员关系,比解析 GPO 更贴近真实环境。










