Windows: 12 commands to troubleshoot a GPO that is not applying

Analyze gpresult, Group Policy logs, DNS, SYSVOL, OUs, and security filters with 12 explained diagnostic checks before a controlled pilot correction.

01

Start with the missing setting, not gpupdate /force

A missing GPO, a denied GPO, and an applied GPO without the expected effect are different problems. These 12 checks group useful commands for tracing the affected endpoint through AD scope, networking, and filters. Start with one user, computer, setting, and processing time.

Commands are diagnostic; the HTML report writes a local file and DNS/TCP generate traffic. No GPO, ACL, or network configuration is modified. This guide does not replace a complete AD environment assessment.

02

Prepare access and choose the correct context

This guide covers Active Directory GPOs on domain-joined machines, including Windows 11 and Windows Server 2019, 2022, and 2025. Entra-only devices do not receive domain GPOs merely by joining Entra ID. Windows edition, ADMX templates, client version, and setting support must match.

Run native tools from an appropriate Windows shell. AD/GroupPolicy reads require RSAT and the ActiveDirectory/GroupPolicy modules on an approved management workstation; Windows PowerShell 5.1 is a practical baseline for those modules. Installation is a separate setup step, not a GPO fix. No additional Intune subscription is required for these AD checks; normal Windows licensing still applies.

  • All names, domains, and GUIDs below are fictional. Replace them; do not target third-party domains.
  • Examples use PowerShell syntax; retain quotes and UNC paths. Check $LASTEXITCODE after native tools when automating collection.
  • Access denial or missing RSAT commands is a collection limitation, not evidence of a healthy GPO.
LocationPermissions and precautions
Affected user sessionwhoami and user results: preserve the actual affected identity.
Affected endpoint, elevated shellComputer results and logs according to ACLs. Event Log Readers may suffice for some reads; verify locally.
RSAT workstationRead access to relevant AD objects, OUs, GPOs, and SYSVOL. Domain Admin is unnecessary for collection when read access is delegated.
ExportsApproved restricted directory; reports and messages may reveal accounts, groups, and paths.
03

1. Confirm identity and session token

Run in the affected user’s session. Check SID and active groups; a shell running as a different administrator observes a different token. AD group changes after sign-in may not appear here.

Diagnostic collection
whoami /all
04

2. Read user policy results

Find the expected GPO among applied and denied objects. This reflects completed processing, not a simulation of recent AD changes. No RSoP data does not prove the domain has no GPO.

Diagnostic collection
gpresult /r /scope user
05

3. Read computer policy results

Local elevation is normally required. Computer scope follows the computer object, not the user’s OU. Do not search only user results for a Computer Configuration setting.

Diagnostic collection
# Elevated shell on the affected computer
gpresult /r /scope computer
06

4. Save an HTML RSoP report

Use the report to inspect denial reasons and winning settings. Confirm the represented user, especially after elevation as another account. Rights may limit data. On ARM64, Microsoft documents an /h limitation involving the SysWOW64 gpresult executable.

Diagnostic collection
# Local file output; no policy refresh
$report = Join-Path $env:TEMP ('gpo-result-' + [guid]::NewGuid().ToString() + '.html')
gpresult /h "$report"
if ($LASTEXITCODE -ne 0) { throw "gpresult failed: $LASTEXITCODE" }
$report
07

5. Find one processing instance in the logs

Record the ActivityID matching the symptom: users and processing cycles can overlap. The 100-event cap is not a full history. Distinguish inaccessible logs, no matching entries, and genuinely absent processing.

Diagnostic collection
Get-WinEvent -FilterHashtable @{
  LogName='Microsoft-Windows-GroupPolicy/Operational'
  StartTime=(Get-Date).AddHours(-2)
} -MaxEvents 100 -ErrorAction Stop |
  Select-Object TimeCreated,Id,LevelDisplayName,
    @{Name='ActivityID';Expression={([xml]$_.ToXml()).Event.System.Correlation.ActivityID}},
    Message
08

6. Isolate processing by ActivityID

Correlate start, completion, and extension failures within the same cycle. New processing receives a new ID. A listed applied GPO may still have a failed extension or an overridden setting.

Diagnostic collection
# Replace this fictional ID with one from check 5
$activityId = [guid]'11111111-1111-1111-1111-111111111111'
$xpath = "*[System/Correlation/@ActivityID='{$($activityId.ToString())}']"
Get-WinEvent -LogName 'Microsoft-Windows-GroupPolicy/Operational' -FilterXPath $xpath -MaxEvents 200 -ErrorAction Stop |
  Select-Object TimeCreated,Id,LevelDisplayName,Message
09

7. Check AD discovery DNS records

An AD domain uses its internal resolvers, not a public troubleshooting resolver. Valid SRV answers prove neither DC reachability nor replication health. Compare with a working device on the same network.

Diagnostic collection
# Fictional AD DNS domain; query your approved internal resolver
Resolve-DnsName -Name '_ldap._tcp.dc._msdcs.contoso.example' -Type SRV -DnsOnly -ErrorAction Stop |
  Select-Object Name,NameTarget,Port,Priority,Weight
10

8. Inspect DC Locator and SMB access

DC Locator alone does not identify the DC used in earlier processing: use reports or logs. The port 445 probe generates traffic and validates neither all AD flows nor SMB authentication. No /force or secure-channel repair is performed.

Diagnostic collection
nltest /dsgetdc:contoso.example
# Substitute the DC identified in the affected client's logs
Test-NetConnection -ComputerName 'dc01.contoso.example' -Port 445 -InformationLevel Detailed
11

9. Read the GPO’s gpt.ini on the relevant DC

This uses the current session’s network credentials, not automatically the computer account. Successful user access does not establish machine read access. Verify the GUID and compare with AD/other DCs when evidence suggests inconsistency; do not manually edit SYSVOL.

Diagnostic collection
# Fictional domain, DC and GPO GUID
$gpoGuid = '22222222-2222-2222-2222-222222222222'
$gpt = "\\dc01.contoso.example\SYSVOL\contoso.example\Policies\{$gpoGuid}\gpt.ini"
Get-Content -LiteralPath $gpt -ErrorAction Stop
12

10. Locate the user and computer objects in AD

Objects can reside in different OUs. MemberOf shows direct memberships, not the complete effective token or primary group. Fresh AD reads do not prove refreshed user or machine tokens.

Diagnostic collection
# On an approved RSAT workstation; fictional identities
Import-Module ActiveDirectory
Get-ADComputer -Identity 'PC-DEMO-01' -Server 'dc01.contoso.example' -Properties MemberOf |
  Select-Object Name,DistinguishedName,MemberOf
Get-ADUser -Identity 'user.demo' -Server 'dc01.contoso.example' -Properties MemberOf |
  Select-Object SamAccountName,DistinguishedName,MemberOf
13

11. Inspect target OU links and inheritance

Check enabled links, order, blocked inheritance, and Enforced links. This scope view does not prove the effective outcome after security filters, WMI, and extensions. Also review relevant site links in GPMC; do not resolve conflicts by enforcing every link.

Diagnostic collection
Import-Module GroupPolicy
# Repeat for the relevant USER or COMPUTER OU from check 10
Get-GPInheritance -Target 'OU=Workstations,DC=contoso,DC=example' -Domain 'contoso.example' -Server 'dc01.contoso.example' -ErrorAction Stop |
  Select-Object Path,GpoInheritanceBlocked,GpoLinks,InheritedGpoLinks |
  ConvertTo-Json -Depth 6
14

12. Read GPO status, content, and permissions

Check whether user/computer halves are enabled, WMI filtering, and AD/SYSVOL versions. This report describes configuration rather than client application. Summarized permissions do not replace group, explicit-deny, and effective-ACL analysis in GPMC.

Diagnostic collection
# RSAT GroupPolicy; fictional GUID, read permissions required
$gpoId = [guid]'22222222-2222-2222-2222-222222222222'
Get-GPO -Guid $gpoId -Domain 'contoso.example' -Server 'dc01.contoso.example' |
  Select-Object DisplayName,Id,GpoStatus,UserVersion,ComputerVersion,WmiFilter
Get-GPPermission -Guid $gpoId -All -DomainName 'contoso.example' -Server 'dc01.contoso.example'
Get-GPOReport -Guid $gpoId -Domain 'contoso.example' -Server 'dc01.contoso.example' -ReportType Xml
15

Security, WMI, and loopback: three common traps

Read and Apply Group Policy are distinct permissions for the target. Since the MS16-072 change, retrieving user GPOs uses computer context: removing Authenticated Users without preserving computer read access can break user settings. Targeted read access is not the same as granting Apply to everyone; do not blindly broaden filtering.

WMI filters are evaluated on the target machine. Check query, namespace, properties, and version compatibility; do not remove the filter in production merely to obtain a result. For preferences, also inspect item-level targeting and options such as apply once.

With loopback, user settings may follow the computer’s location. Merge adds that list after the user’s list; Replace substitutes it for the normal list. Confirm effective endpoint mode before concluding that the GPO follows the wrong OU.

16

Interpret the findings

Fictional example: a user GPO is linked to the correct OU and the user group has Apply, but logs show retrieval failure. If computers lack Read, validate and correct that delegation on a pilot instead of moving the user or granting Apply domain-wide.

ObservationNext check
GPO missing from resultsTarget object, OU, links, enabled user/computer half, and collection time.
Security denialToken, Read/Apply, memberships, explicit denies, and computer read permission.
WMI denialFilter on endpoint, compatibility, and processing errors.
Applied GPO, missing settingWinning GPO, setting support, client extension, loopback, or preference targeting.
SYSVOL/network errorActual DC, DNS, access, AD/SYSVOL consistency, and targeted replication investigation.
Works after a new sessionInvestigate token renewal or foreground processing; not proof of a defective GPO.
17

Correct and validate without forcing the entire domain

  • Preserve reports, events, GPO configuration, permissions, and links. A GPO backup alone does not capture the full link topology: document links separately.
  • Define one correction, pilot target, owner, expected outcome, and rollback for the changed setting, ACL, or link.
  • After approval, gpupdate /target:user or gpupdate /target:computer triggers processing: it is no longer read-only. /force reapplies all settings and does not repair DNS, ACLs, or replication.
  • Some extensions require foreground sign-in or boot. Schedule these with users; do not automatically invoke /logoff or /boot. A /wait timeout does not mean processing stopped.
  • Reread results after the new cycle using its new ActivityID and test intended behavior. Also test a user who must not receive the policy.
  • If behavior regresses, reverse the precise approved change. Removing a GPO does not always restore prior preference or script state: plan that recovery.
  • Do not delete GroupPolicy folders, policy registry files, or SYSVOL to start over. Do not clear logs or disable protections to conceal an error.
18

Turn diagnosis into a lasting correction

Keep a short record: expected setting, user/device, GPO and GUID, observed DC, time/ActivityID, evidence, pilot correction, and validation. Recurring conflicts may benefit more from delegation and policy architecture review than repeated refreshes. Infrastructure and Active Directory consulting can scope that work beyond these commands.