KINGWERX™

AD Health Check

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.

User Guide Revision 2.1.28 KW Tech Solutions LLC [email protected]

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.

OverviewWhat the tool does

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.

SetupBefore you begin

Requirements

Where it runs
On a domain controller, or on a domain-joined server/workstation that has the RSAT Active Directory tools installed — the 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.
Privileges
A Domain Administrator (or equivalent) account. Some checks read the other DCs remotely (services, replication, backup times, time), and dcdiag’s privileged tests need elevation.
AD tools
The 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.
Network
Reachability to the domain’s other DCs (LDAP, RPC) so cross-DC checks can query them.
Windows & .NET
Windows Server 2016, 2019, 2022, or 2025 — or a Windows 10 (1809+) / 11 admin workstation with RSAT. Nothing to install: .NET Framework 4.8 and Windows PowerShell 5.1 both ship in-box on those. (Server 2012 / 2012 R2 are end-of-life and not recommended; they run only after adding .NET 4.8 and WMF 5.1 by hand.)

Installing the AD tools (RSAT) on a workstation

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.

Run it as a domain user

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 /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.

Why RSAT, and why the tool never installs it for you

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.

What’s in the box

The download is a portable folder — no installer required:

Install & first run

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.

License agreement shown on first run
First run. The End User License Agreement is shown once. Accept is disabled until you tick the box — the agreement is a deliberate act, not a click-through. It sets out that the tool is read-only and provided as-is, that full system backups are yours, and that support covers this program only. Declining exits without changing anything. Acceptance is remembered per Windows user.

ActivationLicensing & activation

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.

Activation dialog with a field to paste the license key
Activate. Paste your Lemon Squeezy license key and click Activate. The tool contacts the licensing service once to register this host.

On success you’re confirmed activated, the status turns to a green Licensed, and Run / Save unlock.

License activated confirmation dialog
Activated. Report export and the checks are unlocked on this host. Activation is remembered — you won’t be asked again on this machine.
Good to know

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.

WorkflowRunning a health check

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.

The main window, licensed and ready to run checks
Main window. All sixteen check families are selected by default. The header shows the run-from host; results stream into the grid as each check completes, and the activity log narrates progress.
Checks to run
Sixteen checkboxes, all on by default. Untick any you want to skip — for a quick look you might run just Replication and dcdiag, for example.
Run Checks
Connects to the domain and runs the selected checks. Rows appear live, one at a time, as each finishes; the verdict at the top updates as it goes.
Save Report…
Exports everything currently in the grid to a text or CSV file (see Saving the report).
Clear
Empties the grid and the activity log so you can run again cleanly.
Run from
The host line under the title shows which machine the checks run from — it’s recorded in the saved report too.

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.

ReferenceThe checks, explained

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.

CheckWhat it validatesWhat you see
Forest / DomainThe 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 ControllersEvery 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 RolesThe 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 PoolHow 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 ServicesThe 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.
ReplicationInbound 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 AgeWhen 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 & SubnetsThe 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.
SYSVOLThat 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 BacklogWhether 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 ConsistencyCross-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).
DNSDC 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.
TimeThe 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 SkewThe 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.
DHCPThe 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 diagnosticsRuns 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.

Notes on individual checks

OutputReading the results

Every row is graded with one of four statuses. The banner at the top of the grid rolls them into a single verdict.

PASSHealthy. The check passed — no action needed.
WARNAdvisory. Worth a look, but not necessarily broken — e.g. the Recycle Bin is off, or a benign dcdiag note.
FAILA real problem that needs attention — an unreachable DC, a stopped service, a failing replication link.
INFOContext, not a grade — functional levels, FSMO holders, the DHCP note. Neither good nor bad.

The verdict line

Above the grid, a running verdict summarizes the whole run and updates live as rows arrive:

HEALTHY
No FAILs and no WARNs. Everything the tool checked is in good shape.
HEALTHY WITH WARNINGS
No FAILs, but one or more advisories to review (often just the Recycle-Bin recommendation and dcdiag’s benign notes).
NOT HEALTHY
One or more FAILs — something needs attention before you rely on the domain.

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.

ReferenceThe dcdiag diagnostics

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.

Warnings that are expected

A few dcdiag results commonly show as WARN on a perfectly healthy domain. The tool labels each so you don’t chase them:

Dynamic update — deliberately not run

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.

The event-log tests (SystemLog, DFSREvent, KccEvent, FrsEvent) — advisory

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.

Forwarders / Root hints / the DNS test — external resolution, not 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.

These are dcdiag’s findings, surfaced honestly

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.

Wrap-upSaving the report

Click Save Report… to export the current results. Three formats are offered:

HTML report (.html)
default
A polished, self-contained report — a verdict banner, colored PASS/WARN/FAIL/INFO badges, and every row grouped by category, in the KingWerx theme. Nothing to attach or host; it opens in any browser and doubles as a client hand-off document. The tool offers to open it the moment it’s saved.
Text report (.txt)
A readable, aligned plain-text report — run-from host, timestamp, the PASS=/WARN=/FAIL= tally, then every row. Ideal for a change ticket or an email.
CSV (.csv)
The same rows as Status, Category, Check, Detail columns for a spreadsheet.
Example — the HTML report (scroll within the frame)
The HTML report. A real exported report — here from a three-DC domain with one controller down, so the full range shows: the NOT HEALTHY verdict banner, color-graded PASS / WARN / FAIL / INFO badges, and rows grouped by category, all self-contained in a single file you can hand a client. A copy ships alongside this guide as 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.

Before-and-after

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.

ReferenceTroubleshooting

SymptomCause & 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 BinNot 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 appearsExpected. 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 SystemLogdcdiag 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 outA license key is required to run. Click Activate… and paste your key (see Licensing & activation).

The session log — written for you, every run

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.

ResponsibilityBackups are yours

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.

The AD Backup Age check is not a backup check

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.

LegalLicensing & notices

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.

The About dialog, showing the read-only scope and backup responsibility
About. The two things worth reading twice have their own panels — what read-only covers, including the one 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.