
Pwsh tool for AD Group Enumeration Auditing
Detect Active Directory reconnaissance before it becomes a breach.
QuietPhase is a PowerShell tool that checks whether your domain is configured to detect group enumeration, the quiet reconnaissance phase where an attacker maps out who holds privileged access. It verifies domain controller audit policy, reports which privileged and custom groups are audited for membership reads, and proposes (or, if you choose, applies) the fixes.
Most organizations alert when someone changes a privileged group. Very few notice when someone reads one. QuietPhase helps close that gap, and makes it easy to set up honeypot groups that turn enumeration into a high-confidence alert.
Background reading: The Quiet Phase: Why Active Directory Group Enumeration Deserves Your Attention
adminCount=1) are reset by SDProp, so AdminSDHolder is checked and remediated too.Out-ConsoleGridView). Use it for honeypot groups or anything else you want to watch.-Apply, and each one is confirmed. -WhatIf is supported.-FixScriptPath writes all proposed changes to a reviewable .ps1 file, suitable for change control.A domain controller logs a group enumeration event only when both of these are in place:
member attribute by Everyone or Authenticated Users.When both are true, each membership read produces Event 4662 on the DC that answered the query. Key fields:
| Field | Value | Meaning |
|---|---|---|
ObjectName | %{<objectGUID of the group>} | Which group was read |
Properties | {bf9679c0-0de6-11d0-a285-00aa003049e2} | The member attribute |
Properties | {bc0ac240-79a9-11d0-9020-00c04fc2d4cf} | Membership property set (often alongside) |
AccessMask | 0x10 | Read Property |
SubjectUserName / SubjectUserSid | Account | Who performed the read |
SubjectLogonId | e.g. 0x3A7F21 | Join to Event 4624 (TargetLogonId) for source IP and workstation |
Note: SAMR-based tools such as
net group /domaindo not trigger this 4662 signal. Cover that path with process creation logging (Event 4688 / Sysmon / EDR) or network detections such as Microsoft Defender for Identity.
Out-ConsoleGridView, a part of the Microsoft.PowerShell.ConsoleHost module, which is a dependency of Microsoft.PowerShell.ConsoleGuiTools. Installed in the CurrentUser scope.# Report only (default): check the discovered DC, privileged groups, then pick custom groups
.\QuietPhase.ps1
# Check audit policy on every DC in the domain
.\QuietPhase.ps1 -AllDomainControllers
# Export proposed fixes for review or change approval
.\QuietPhase.ps1 -AllDomainControllers -FixScriptPath .\QuietPhase-Fix.ps1
# Preview changes, then apply them (each change is confirmed)
.\QuietPhase.ps1 -Apply -WhatIf
.\QuietPhase.ps1 -Apply
# Propose rules for Authenticated Users instead of Everyone
.\QuietPhase.ps1 -Apply -AuditPrincipal AuthenticatedUsers
| Parameter | Default | Description |
|---|---|---|
-Server | Discovered DC | DC or domain to target |
-AllDomainControllers | Off | Check audit policy on every DC, not just the target |
-AuditPrincipal | Everyone | Principal used for proposed rules: Everyone or AuthenticatedUsers. Either counts as configured when checking. |
-Apply | Off | Apply proposed changes, with a confirmation prompt for each |
-SkipCustomGroups | Off | Skip Phase 3 (custom group selection) |
-FixScriptPath | None | Export all proposed remediation to a .ps1 file |
-WhatIf / -Confirm | Standard | Preview changes or control prompts when used with -Apply |
auditpol commands to fix it, then stops. Group SACLs are useless until this is in place.When anything needs changes, the run ends with a NEXT STEPS block of ready-to-paste commands for -Apply, -WhatIf, -FixScriptPath, or manual ADUC steps.
==============================================================================
PHASE 1 - Domain controller audit policy
==============================================================================
Domain: contoso.com Target DC: DC01.contoso.com DCs checked: 1
DC01.contoso.com
Audit Directory Service Access: Success
Audit Security Group Management: Success
Force audit policy subcategory settings: enabled (or default)
PHASE 1 PASSED: Directory Service Access auditing is enabled.
==============================================================================
PHASE 2 - Well-known privileged groups
==============================================================================
Group Status Protected Detail
----- ------ --------- ------
Domain Admins NeedsChange Yes No audit rule for reads of 'member' (2 other audit rule(s))
Enterprise Admins NeedsChange Yes No audit rule for reads of 'member' (2 other audit rule(s))
Schema Admins Configured Yes Everyone: Success ReadProperty on member (direct)
Administrators (Builtin) NeedsChange Yes No audit rule for reads of 'member' (1 other audit rule(s))
DnsAdmins NeedsChange No No audit rule for reads of 'member' (0 other audit rule(s))
AdminSDHolder (DC=contoso,DC=com) NeedsChange (template) No audit rule for reads of 'member' (2 other audit rule(s))