Read-only health validation for Active Directory — forest, DNS, SYSVOL, DHCP, FSMO, replication, backup age, clock skew, and Microsoft’s own dcdiag diagnostics — distilled to a clear PASS / WARN / FAIL report. It never changes a thing.
AD Health Check inspects an Active Directory domain end to end and tells you, in plain language, whether it’s healthy — without touching a thing. Every check is a read-only query or a run of Microsoft’s own diagnostics — it writes nothing to Active Directory, DNS, DHCP or any server — and it’s especially valuable before and after a domain-controller rebuild or a recovery. This guide explains how to run it, every check it performs, and how to read every line it produces.
AD Health Check is a read-only Active Directory recovery health validator. It connects to your domain, runs sixteen families of checks — forest and domain configuration, domain controllers, FSMO roles, RID pool, AD services, replication, AD backup age, sites & subnets, SYSVOL, SYSVOL/DFSR backlog, GPO consistency, DNS, time source, actual time skew, DHCP authorization, and a full pass of Microsoft’s dcdiag — and renders the findings as a color-graded PASS / WARN / FAIL report you can read on screen or export.
ActiveDirectory PowerShell module plus repadmin and dcdiag (see Installing the AD tools below). The app self-elevates via UAC — approve the prompt, because several checks need administrator rights.dcdiag’s privileged tests need elevation.ActiveDirectory module, repadmin, and dcdiag — used by the AD, replication, backup, and dcdiag checks — all ship on every DC. On a member workstation they come from a single RSAT feature (below). If they’re missing, the tool says so and shows you the exact install command.You don’t have to run AD Health Check on a domain controller. It runs equally well from a domain-joined Windows 10/11 admin workstation — often the preferred choice, since it keeps tools off the DCs. The one requirement is Microsoft’s Remote Server Administration Tools (RSAT), which supply the ActiveDirectory PowerShell module along with repadmin and dcdiag. All three arrive from a single RSAT feature.
Open Windows PowerShell as Administrator and run:
Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0
That one command installs the AD module, repadmin, and dcdiag together — everything the checks need. If you also want the optional DHCP authorization check to enumerate servers from your workstation, add:
Add-WindowsCapability -Online -Name Rsat.DHCP.Tools~~~~0.0.1.0
The install pulls from Windows Update / Features on Demand, so the workstation needs internet access (or a configured WSUS). It takes a minute or two and doesn’t require a reboot. Confirm what’s present with:
Get-WindowsCapability -Online -Name Rsat.ActiveDirectory* | Select-Object Name, State
Then launch AD-HealthCheck.exe and approve the UAC prompt. On Windows Server, install these instead with Install-WindowsFeature RSAT-AD-Tools; on a domain controller they’re already present.
RSAT supplies the tools, but querying Active Directory still needs domain credentials. A workstation signed in with a local account (for example PC-NAME\you) cannot authenticate to AD — you’ll get an “SSPI failed” or “could not find a forest identified by ‘PC-NAME’” error, even though the domain is reachable. Two ways to give it a domain identity:
runas /netonly:runas /netonly /user:YOURDOMAIN\adminuser "C:\Tools\AD-HealthCheck.exe"
/netonly keeps your local desktop but hands the tool — and the repadmin and dcdiag it runs — network credentials for the domain, so every check can authenticate. On a domain controller none of this applies: it already runs in a domain context.
AD Health Check makes no changes — but it does read deeply: replication metadata via repadmin, backup timestamps via repadmin /showbackup, the full dcdiag suite, and remote service and time state on every DC. Those reads need the RSAT feature present and an elevated, Domain-Admin-class context. Installing RSAT is a one-time setup step you run yourself with the command above; the tool itself never installs or changes anything on your systems.
The download is a portable folder — no installer required:
AD-HealthCheck.exe — the application (published by KW Tech Solutions LLC).EULA.txt, LICENSE.txt, and README.txt.Copy the folder onto a domain controller (or an RSAT-equipped admin box), extract it, and run AD-HealthCheck.exe. Approve the UAC prompt so it runs elevated. On first launch you’re shown the license agreement; the tool won’t proceed until you accept it.
AD Health Check is licensed to run — a valid license key is required before the checks will start. There is no limited free-run mode. You enter your key once and it’s remembered on that host.
On launch, the license state is shown on the right of the toolbar. Until you activate, it reads Not activated — enter your license key to run, and the Run Checks and Save Report buttons are disabled. Click Activate… and paste the license key from your purchase confirmation.
On success you’re confirmed activated, the status turns to a green Licensed, and Run / Save unlock.
Activation is a one-time online step — after it succeeds, the tool runs offline and doesn’t phone home again. Each license includes 2 activations (up to two machines). If you need to move your license to a new machine, or you’ve used both activations, email [email protected] and we’ll reset it for you. You can buy AD Health Check from its page at kingwerx.com.
The whole tool is one screen. Across the top is the Checks to run panel; below it the action buttons and license status; then the results grid; and at the bottom a live activity log.
Because every check is read-only, you can run it as often as you like, on a live production domain, without risk. A run typically takes well under a minute, plus up to a few minutes for the comprehensive dcdiag pass on a busy domain.
Each check family below validates one part of Active Directory and emits one or more graded rows. Every row carries a Status (PASS / WARN / FAIL / INFO), a Category, the specific Check, and a Detail line with the evidence.
| Check | What it validates | What you see |
|---|---|---|
| Forest / Domain | The forest and domain functional levels, and whether the AD Recycle Bin is enabled. | An INFO line with the levels; PASS if the Recycle Bin is on, or a WARN recommending you enable it. |
| Domain Controllers | Every DC in the domain — that it’s reachable, plus its site, IP, Global-Catalog role, and OS. | A PASS per reachable DC (site / IPv4 / GC / OS shown); a FAIL for any DC that doesn’t respond. |
| FSMO Roles | The five operations-master roles (Schema, Domain Naming, PDC, RID, Infrastructure) and that the holder responds. | An INFO line per role naming its holder, and a PASS that the holder is reachable. |
| RID Pool | How much of the domain’s RID space is left — the pool of IDs every DC draws on to create new users, groups, and computers. | A PASS with the headroom shown; a WARN if it’s running low; a FAIL if the pool looks corrupt (a bad DC restore can inflate it). |
| AD Services | The critical AD services on each DC: ADWS, DFSR, DNS, KDC, Netlogon, NTDS, and W32Time. | A PASS per DC when all are running; a FAIL naming any service that isn’t. |
| Replication | Inbound replication for every partition — Domain, Configuration, Schema, DomainDnsZones, ForestDnsZones — from each partner, graded by how recently it last succeeded. | A PASS per partner/partition with the last-success time; a WARN if it’s stale; a FAIL for a failing link, or when a partner’s last success predates the tombstone lifetime (a lingering-object risk). |
| AD Backup Age | When each DC’s directory partitions were last backed up, read from repadmin /showbackup. The oldest partition sets the DC’s effective recovery point. | A PASS when the oldest partition’s backup is within a week; a WARN if it’s older, or if a partition has never been backed up. Backup age is advisory — it never fails the run. |
| Sites & Subnets | The Sites & Services topology — subnets not mapped to any site, and sites with no domain controller. | A WARN for any unmapped subnet (clients on it authenticate to a random DC across the WAN); an INFO for a site that has no DC. |
| SYSVOL | That each DC is sharing both SYSVOL and NETLOGON — the group-policy / logon-script shares clients depend on. | A PASS per DC sharing both; a FAIL if either is missing. |
| DFSR Backlog | Whether SYSVOL is actually replicating — the DFSR backlog (files still queued) between DCs, not just whether the share exists. | A PASS at zero backlog; a WARN if files are queued (replicating, or DFSR stuck). Needs the DFSR tools; otherwise an INFO note. |
| GPO Consistency | Cross-checks each Group Policy object’s AD half against its SYSVOL folder — orphans either way, and GPT.ini version mismatches. | A PASS when every GPO matches; a WARN for a missing folder or a version mismatch (a SYSVOL-replication smell). |
| DNS | DC host (A) records, the _ldap DC service (SRV) records, orphaned/ghost DC records, and that each configured NIC DNS server answers. | A PASS / WARN / FAIL per item, with the record or server in the detail. |
| Time | The PDC emulator’s time source and each DC’s configured source — the backbone of Kerberos. | A PASS with the source shown; a WARN if a source can’t be read or looks wrong. |
| Time Skew | The actual clock offset of every DC against the reference, via w32tm /monitor — the real drift, not just the configured source. | A PASS under 30 seconds; a WARN past that; a FAIL beyond five minutes, where Kerberos authentication breaks. |
| DHCP | The DHCP servers authorized in Active Directory (when run where the DHCP module is available). | An INFO line listing them — or an INFO note that the DHCP module isn’t present on this host. |
| dcdiag diagnostics | Runs Microsoft’s dcdiag in comprehensive mode on every DC (/c /v /e /skip:DNS), then the DNS suite separately with only its read-only subtests named. | One graded row per dcdiag test, labelled with the DC it ran on. Covered in detail in The dcdiag diagnostics. |
repadmin /showbackup) and reports the oldest. It is deliberately advisory — WARN at most, never FAIL: a missing or old backup is a strong prompt to act, not a sign that AD itself is broken.w32tm /monitor). Kerberos tolerates about five minutes of skew before authentication fails, so the check passes under 30 seconds, warns as drift grows, and fails past five minutes. If w32tm can’t reach the DCs (for instance when run un-elevated), it reports a single advisory WARN rather than guessing.Every row is graded with one of four statuses. The banner at the top of the grid rolls them into a single verdict.
Above the grid, a running verdict summarizes the whole run and updates live as rows arrive:
The verdict is followed by the tally — PASS=… WARN=… FAIL=… — the same counts that head the exported report.
On screen, findings fill the colour-graded grid in the main window shown earlier — one row per finding (Status, Category, Check, Detail) with the running verdict above it. When you save the run, those same rows are written to a file: the HTML report under Saving the report below shows exactly what the saved report looks like.
The last check runs Microsoft’s own dcdiag across every domain controller in the enterprise, in two passes. First the comprehensive set with the DNS suite held back (/c /v /e /skip:DNS) — every applicable test, per DC, with the forest-wide tests running once. Then the DNS suite on its own, with its read-only subtests named explicitly (/test:DNS /DnsBasic /DnsForwarders /DnsDelegation /DnsRecordRegistration).
Splitting it that way is deliberate, and it is the reason this tool can call itself read-only — see Dynamic update — deliberately not run below. Together the two passes can take up to about fifteen minutes on a large or busy domain. Each dcdiag test becomes its own graded row — per-server tests are labelled with the DC they ran on (e.g. AD-DC1 / Connectivity) — so you get the depth of dcdiag without reading its raw console output.
If a domain controller is unreachable, an enterprise-wide dcdiag would otherwise stall for minutes — several comprehensive tests (CheckSecurityError, CutoffServers, the DNS suite…) probe every DC in the topology and hang on the dead one. The tool detects the outage and instead runs an essential set of DC-local tests per reachable DC, marking each unreachable DC as a skipped FAIL (it’s already flagged under Domain Controllers). So a run stays fast and useful even mid-outage — which is exactly when you need it — and the DCs and Replication checks give the authoritative picture of what’s down.
Typical tests you’ll see include Connectivity, Advertising, FrsEvent / DFSREvent, SysVolCheck, KccEvent, KnowsOfRoleHolders, MachineAccount, NCSecDesc, NetLogons, ObjectsReplicated, Replications, RidManager, Services, SystemLog, VerifyReferences, and the DNS suite (Authentication, Basic, Forwarders/Root hints, Delegations, Dynamic update, Records registration) plus CrossRefValidation per partition.
A few dcdiag results commonly show as WARN on a perfectly healthy domain. The tool labels each so you don’t chase them:
dcdiag’s Dynamic update subtest is the one part of its DNS suite that is not read-only: it writes a temporary record named dcdiag-test-record into your live forward zone to prove dynamic registration works, then tries to delete it — and it very commonly cannot delete it again (secure-update permissions, or replication timing across DCs), leaving a stray record behind in production DNS.
AD Health Check never runs it. Rather than ship a read-only tool that writes to your zone, the DNS suite is invoked with its read-only subtests named explicitly — Basic, Forwarders/Root hints, Delegations and Records registration — and naming them is what excludes Dynamic update. That is a real difference between this and running dcdiag /c yourself: /c runs Dynamic update, this does not. You will not see a Dynamic update row, and nothing is left behind in your zone.
If you have run dcdiag by hand before and find a leftover dcdiag-test-record in a forward zone, it came from that run, and you can delete it in DNS Manager.
Four dcdiag tests simply scrape a Windows event log for recent errors: SystemLog, DFSREvent, KccEvent, and FrsEvent. They flag on any recent warning or error in that log — frequently something unrelated to Active Directory (a driver, a disk hiccup) — so the tool caps all four at WARN, never FAIL, and points you to review that DC’s log. When testing every DC (/e), they also commonly warn simply because the running DC couldn’t read another DC’s event log remotely (“the RPC server is unavailable”) — an access/firewall matter (enable Remote Event Log Management on that DC), not an AD fault. Each row’s detail says which case it is. The structural tests (Connectivity, Replications, Services, SysVolCheck…) are what actually gauge AD health.
dcdiag’s Forwarders/Root hints, External, and umbrella DNS tests check whether a DC can resolve names it isn’t authoritative for — through its forwarders or the internet root hints. That’s not Active Directory’s internal health (the tool’s own DNS check covers the AD-critical records), and it’s notoriously flaky: dead or blocked forwarders in a disconnected or lab domain, and IPv6 root-hints timeouts anywhere without IPv6 internet. So the tool caps these at WARN, never FAIL, and says so in the detail. If external lookups matter on that DC, check Get-DnsServerForwarder and point it at forwarders that answer.
Both notes above are dcdiag’s own output — the tool reports them faithfully rather than hiding them. A genuinely broken DNS or event-log condition still shows through; the labels just keep the two well-known benign cases from looking like alarms.
Click Save Report… to export the current results. Three formats are offered:
PASS=/WARN=/FAIL= tally, then every row. Ideal for a change ticket or an email.Status, Category, Check, Detail columns for a spreadsheet.report-example.html — open that if the preview above doesn’t display in your viewer.The file is named with a timestamp by default (ADHealthCheck_YYYYMMDD_HHMMSS). Run the check before a change and again after it, save both, and you have a clean before/after — the HTML pair makes an especially clean recovery record — that proves the domain returned to health.
Save a report before a DC rebuild, seizure, or metadata cleanup, and another after. Side by side they document exactly what changed — and give you (or your client) confidence the recovery landed.
| Symptom | Cause & fix |
|---|---|
| “ActiveDirectory module NOT found” | You’re on a machine without the RSAT AD tools. Run on a domain controller, or install them on this box (see Installing the AD tools): Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0. |
| “could not find a forest…” / “SSPI failed” | You’re signed in with a local account, which can’t authenticate to AD. Sign in as a domain user with AD rights, or launch with runas /netonly /user:DOMAIN\admin (see Run it as a domain user). On a DC this never happens. |
| Several FAILs on the first run, or “Access is denied” | The app wasn’t elevated. It self-elevates — approve the UAC prompt. Run un-elevated, dcdiag’s NetLogons/Services tests and the time check can’t read what they need and report false failures. |
| WARN on AD Recycle Bin | Not a fault — a recommendation. Enabling it adds object-level recovery, but it’s a one-way change, so the tool only suggests it. |
| No Dynamic update row appears | Expected. That dcdiag subtest writes a temporary record into your live DNS zone, so this tool does not run it (see The dcdiag diagnostics). |
| WARN on dcdiag SystemLog | dcdiag caught a recent System-log error, often unrelated to AD. Review the System log on that DC. |
| DHCP says “module not present” | Informational only. Run on a server with the DHCP Server tools, or install the RSAT DHCP tools (Add-WindowsCapability -Online -Name Rsat.DHCP.Tools~~~~0.0.1.0), to enumerate authorized servers. |
| “Not activated” — Run is greyed out | A license key is required to run. Click Activate… and paste your key (see Licensing & activation). |
Saving a report is a choice. The session log is not — AD Health Check writes one every time it runs, whether you ask or not. Every line that appears in the on-screen activity log is also appended, as it happens, to:
%ProgramData%\KWTechSolutions\ADHealthCheck\logs\session-<timestamp>.log
Each file is headed with the product version, the machine it ran on, and the user who ran it. Because it is written line by line rather than flushed at exit, the record survives closing the window or a crash mid-run — which is exactly when you want it. It is a plain text file; open it with anything.
Nothing is transmitted anywhere. The log stays on the machine that produced it, and removing old ones is up to you.
You are responsible for maintaining a current, tested FULL SYSTEM BACKUP of every domain controller in your environment. AD Health Check reads and reports. It does not create a backup, does not verify one, and is not a substitute for one.
It is worth being blunt about this, because the check’s name invites the wrong conclusion. AD Backup Age reads the last backup timestamp Active Directory itself recorded, per partition, via repadmin /showbackup. A recent date means something wrote a backup marker recently. It does not mean the backup completed, that it captured what you would need, that the media is readable, or that it can be restored.
The only thing that proves a backup is a restore you have actually performed. A PASS on this row is a prompt to keep going, not a result.
This matters most in exactly the situation this tool is built for: a rebuild or a recovery. A clean report tells you the domain looks healthy right now. It tells you nothing about your ability to get back to this state if the next thing goes wrong.
Your use of the software is governed by the End User License Agreement (EULA.txt, shown on first run). In short: AD Health Check is read-only and its findings are advisory; it is provided “AS IS,” without warranty, and does not guarantee the health, security, or recoverability of any system. KW Tech Solutions LLC is not liable for data loss, service disruption, or any decision or action taken on the basis of its findings. You are responsible for maintaining a current, tested FULL SYSTEM BACKUP of every domain controller in your environment — this software does not create, verify, or substitute for one.
Support covers this program only — its installation, activation and operation. It does not extend to Active Directory, DNS, DHCP, your domain controllers, or anything else the program inspects, nor to acting on its findings.
The About dialog, reachable from the title bar, carries the short version of everything on this page: the version and publisher, what read-only does and does not cover (including the DnsDynamicUpdate exclusion), that full system backups are yours, where the session log is written, the AS-IS terms, the support scope, and the Microsoft trademark notice.
dcdiag subtest deliberately excluded to keep the claim exact, and whose job the backup is. Nothing here is new; it is the same position taken by the license, the README and this guide, put where someone will actually see it.Microsoft, Windows, Windows Server, and Active Directory are trademarks of Microsoft Corporation. AD Health Check is an independent product of KW Tech Solutions LLC and is not affiliated with, authorized, sponsored, or endorsed by Microsoft.