AdGUARD
About this guide
This document describes how to use AdGUARD end to end, from installation through to producing an audit report you can hand over to a client. It covers installation, license activation, how the application name and reports work, connecting to the audited directory, control selection, baselines and compliance frameworks, running audits, reading attack paths, interpreting results and exporting reports.
Who this guide is for
- Auditors and consultants running Active Directory audits for their clients.
- Internal security teams (CISO, IAM, SecOps) tracking the posture of their own directory over time.
- MSPs and resellers operating the application under their own brand across a portfolio of clients.
- Administrators of the audited directory, for the connection and permissions part only (chapter 6).
Documented version
| Item | Value |
|---|---|
| Application | AdGUARD 0.1.0 |
| Platform | Windows x64 — WPF, .NET 10 |
| Control catalog | 176 controls across 8 built-in packs, all automated |
| Directory access | LDAP or LDAPS, read-only |
| Baseline templates | 10, computed dynamically from the catalog |
| Maturity model | ANSSI scale 1 to 5, with a computed level attained |
| Product-specific outputs | Attack path graph, trust graph, situation report, dsacls remediation script |
| Interface languages | French and English, switchable on the fly |
1. Introduction
1.1 What AdGUARD is
AdGUARD is a Windows desktop application that audits the security configuration of an Active Directory domain. It queries the directory read-only over LDAP, compares the actual configuration against a catalog of 176 control points drawn from recognised public frameworks, and produces a compliance score, a control-by-control breakdown, an attack path map and exportable reports.
The principle is simple: where a manual audit means walking through dozens of management console screens, reading security descriptors by hand and noting gaps in a spreadsheet, AdGUARD covers the same ground in a handful of seconds, reproducibly, and keeps the history so progress can be measured.
The dashboard: overall compliance, detailed breakdown and trend over time.
1.2 Design principles
| Principle | What it means in practice |
|---|---|
| Read-only | No write is requested or performed on the audited directory. The application fixes nothing: it observes and recommends. |
| Local execution | The application runs on the auditor's machine. Results, credentials and history stay there. No intermediate service, no telemetry. |
| Multi-client | One record per audited domain, with its own connector, its own history database and its own report logo. Two clients' data never mix. |
| White label | The application name is the license holder's name, carried by the license (chapter 4). It is no longer configured locally. |
| Offline | The license is verified locally through a cryptographic signature. No activation server to reach. |
| Traceability | Every control carries a stable identifier, a level, its framework mappings and a documentation link. These appear identically in the interface and in every export. |
1.3 What AdGUARD does not do
- It does not fix. No automatic remediation. The PowerShell and
dsaclscommands are provided for guidance, and those that modify the directory ship commented out. - It does not monitor continuously. An audit is a point-in-time run, started manually. It is a snapshot of the configuration, not a SIEM.
- It does not audit Entra ID. That scope is covered by EntraGUARD, built on the same foundation.
- It does not analyse content. The application reads directory attributes and security descriptors, never the content of shares or mailboxes.
- It does not replace a human audit. It industrialises the mechanical part, freeing time for analysis and recommendations.
1.4 Functional architecture
The application is built on five parts:
- The connector establishes read access to the directory: domain controller, search base, read account, LDAP or LDAPS.
- The control catalog describes what to check: 176 points grouped into 8 packs, each tied to a category, a criticality level and a set of framework mappings.
- Baselines define the scope retained for an engagement: which controls are in scope, which are excluded, and at what level.
- The audit engine runs the selected controls in parallel, assigns a verdict to each and computes a weighted score.
- Reports present the result from six editorial angles and in five file formats.
The About screen: version, technical stack and covered frameworks.
1.5 Terminology
| Term | Definition |
|---|---|
| Domain (record) | The audited directory. In the application, each client has a domain record holding its connector, its history and its report logo. |
| Connector | The technical link to the directory. It only becomes active after a successful connection test. |
| Control | A single check, for example 'Disallow unconstrained delegation on accounts'. Carries a stable identifier, a description, a remediation and its framework mappings. |
| Control pack | A group of controls shipped as a unit. The 8 built-in packs are embedded in the application; additional packs can be imported as JSON. |
| Level (L1 / L2) | The control's criticality. L1 = fundamental, expected everywhere. L2 = hardening, to be weighed against context. |
| Category | The control's functional domain: Tier Zero, ACL delegation, Kerberos, AD CS, Trusts… The catalog has 32 of them. |
| ANSSI tier | The control's rank on the 1 to 5 maturity scale: 1 = Tier 0 and privilege foundations, 5 = governance. See chapter 9. |
| Attack path | A right held by a non-privileged principal over a critical object, allowing them to take control of it. See chapter 14. |
| Baseline | The audit scope retained: a subset of the catalog, with optional level adjustments. Global scope or client-specific. |
| Audit (run) | A dated run, kept in the history with its score, its scope and the full detail of its results. |
| Verdict | A control's outcome: compliant, non-compliant, warning, or not assessed. |
2. Installation and first run
2.1 Requirements
| Item | Requirement |
|---|---|
| System | Windows 10 (1809 or later) or Windows 11, x64. |
| .NET runtime | .NET 10 Desktop runtime, unless the application was delivered as a self-contained build. |
| Rights | Local administrator rights for installation only. The audit itself requires none. |
| Network | Access to the domain controller on port 389 (LDAP) or 636 (LDAPS). |
| Account | A directory read account — a plain domain user is enough for most controls. |
| Display | 1280 × 800 minimum; 1600 × 900 recommended for the dashboard and the graphs. |
| License | A valid license key (chapter 3). |
2.2 Installation
The application ships as a standard Windows installer. It installs into C:\Program Files\AdGUARD for all users of the machine, creates a Start menu shortcut, and creates its data area on first run.
An update installs over the previous one: the installed version is detected and replaced. Data — client records, history, connectors, license — is never touched by a reinstall, because it lives outside the program folder.
2.3 Where the data lives
All data lives under a single root, shared by every Windows account on the machine. This is deliberate: on a shared audit workstation, two consultants must find the same clients and the same history.
C:\ProgramData\AdGUARD\
├── license.key clé de licence installée (commune au poste)
├── control-packs\ packs de contrôles importés (JSON)
└── clients\
├── <client-1>\
│ ├── settings.json connecteur, export, branding, performances
│ └── audit.db base SQLite : historique et résultats détaillés
└── <client-2>\The active client is remembered per Windows user: two sessions open on the same machine can work on two different clients while sharing the same set of records.
2.4 First run
Getting started takes six steps:
- Activate the license — Settings › License, paste the key you were given.
- Create the first domain — AD domains › Add a domain, filling in at least the name (§ 5.2). The application name itself comes from your license (§ 4).
- Create the first domain — Domains › Add a domain.
- Connect the directory — Settings › Connectors, fill in the domain and the read account, then test.
- Choose the scope — Baselines › Templates to start from a framework, or Security controls to pick manually.
- Run the first audit — Security audit › Run, then export the report.
On first run, the dashboard is waiting for the first audit.
Allow around fifteen minutes for steps 1 to 4. Connecting a directory is far quicker than connecting a cloud tenant: there is no application to register and no administrator consent to obtain.
2.5 The interface
The application has three areas: a collapsible side menu on the left, the active view in the middle, and at the top right the theme (light / dark) and language (FR / EN) selectors. The name shown at the top of the menu is the license holder's name, carried by the license (§ 4).
| Section | Content |
|---|---|
| Domains | Portfolio of audited directories, then the active domain's record. |
| Dashboard | Summary of the active domain's posture. |
| Security audit | Running an audit and the history of past audits. |
| Security controls | The catalog, grouped by category, with scope selection. |
| Baselines | Baseline editor, framework templates, then the list of saved baselines. |
| Settings | Connectors, Export, Performance, New control, License. |
| About | Version, technical stack, covered frameworks, framework mapping method. |
3. License and activation
3.1 How it works
The license is verified entirely offline, using an asymmetric ECDSA signature on the P-256 curve (SHA-256 digest). The vendor signs the license content with a private key that never leaves their machine; the application embeds the matching public key, which can only verify a signature, never produce one. Decompiling the application therefore does not allow anyone to forge a license, and there is no activation server to reach.
The license file is a block of text wrapped in a readable armor, in the manner of a PEM key:
-----BEGIN GUARD LICENCE-----
...signed content, base64url-encoded...
-----END GUARD LICENCE-----
The signed content carries the following fields:
| Field | Purpose |
|---|---|
| Holder | Name of the license holder. Shown at activation and becomes the application name (chapter 4). |
| Expiry | Expiry date (UTC). Beyond it, the license moves to the Expired state. |
| Max domains | Maximum number of domain records allowed. A very high value (for example 9999) is effectively unlimited. |
| Issued | Issue date (UTC). |
| Identifier | Unique license identifier, useful for support to trace a key. |
| Product | Target product. The license is accepted only if the product is AdGUARD: a license issued for EntraGUARD is refused. |
3.2 Where licenses come from: the GuardLicence application
Licenses are no longer produced by a generator built into the application, as was the case in earlier versions. They are issued by a dedicated application, GuardLicence, held by the vendor and, where applicable, by authorized partners.
GuardLicence holds the signing authority and works as a three-level chain:
- a root (the vendor's private key) signs certificates;
- each certificate authorizes the issuance of bounded licenses: allowed products (EntraGUARD, AdGUARD), domain cap, expiry date;
- from a certificate, individual licenses are issued for each client.
This model lets the vendor delegate issuance to a partner without handing over the root: the partner can only issue within the limits written into their certificate. The AdGUARD application itself knows only the root public key and merely verifies the license it receives.
license.key file (or a text string wrapped in the armor above), delivered over a secure channel. That file, or that text, is what you activate in AdGUARD. You do not need GuardLicence to use the application: GuardLicence is the issuer's tool, not the end user's.3.3 Activating a license
Open Settings › License. Two options, depending on how the license was delivered:
- Paste the key: paste the full license text, armor included, into the field, then confirm.
- Load a file: select the supplied
license.keyfile; its content is read and installed.
On activation, the application checks in turn the signature, the product (it is indeed an AdGUARD license), the expiry and the domain cap. It then shows the license state, the holder's name, the expiry date and the number of domains allowed.
3.4 The four states
| State | Meaning | Consequence |
|---|---|---|
| No license | No license registered on the machine. | Creating domains and running audits unavailable. |
| Invalid | Wrong signature, wrong product, or non-conforming format. | Rejected; the application stays limited, as with no license. |
| Expired | Valid signature, but the expiry date has passed. | Browsing the history is possible, but running audits is unavailable. |
| Valid | Signed license, correct product, not expired. | Fully operational, within the domain quota. |
The state is determined when the license is loaded, then re-evaluated against the date: a valid license switches automatically to Expired on its expiry day.
3.5 The domain quota
The license sets a maximum number of domain records. When that cap is reached, adding a new domain is refused, with a message stating the current limit and the number of records already created. To audit more domains, activate a license with a higher cap. Deleting an existing record frees a slot in the quota.
3.6 Renewal and deployment
Renewing simply means activating a new license with a later expiry: it replaces the previous one, with no other steps. To deploy the same license on several machines, distribute the same license.key file and activate it on each; the license is not tied to a particular machine. On a shared machine, the installed license applies to all Windows accounts.
4. Application name and reports
4.1 The name comes from the license
The Settings › Branding menu from previous versions, which let you set an application name, tagline and logo along with an issuer identity, has been removed. The name the application displays — on the splash screen, in the title bar and at the top of the sidebar — is now the license holder's name, as written in the license.
This name is no longer editable by hand: it applies as soon as a license is activated. Until a license is loaded, the application is called "AdGUARD".
4.2 Identity in reports
Exported reports (HTML, PDF) carry the license holder's name — that is, the application name — together with the generation date, in the header and footer. The detailed issuer customization that existed before (company, website, contact address, header logo, all set in Settings › Branding) is no longer offered: the issuer's identity in reports is limited to the name carried by the license.
4.3 The audited domain's logo
The audited domain's logo, by contrast, is still fully supported — this is a notion distinct from the issuer's identity. From a domain record (§ 5.2) you can attach a logo: it appears on the cover page of that domain's executive report. This is the audited client's logo, on their own report.
Aim for a crisp image, around 180 px tall, on a transparent or white background, in PNG or JPG. This logo is specific to each record: two domains can each have their own.
4.4 Theme and language
The application offers a light and a dark theme, as well as a switch between French and English. These settings are available in the preferences and apply immediately across the whole interface, with no restart. They are independent of the license and specific to each machine.
5. Managing audited domains
5.1 The portfolio
The Domains screen lists every directory you follow, with four headline figures: number of domains, number of audits run, number never audited, and the date of the most recent audit across all clients. A search box filters the list, and Add a domain creates a new record.
The portfolio: headline figures, search and the list of domains.
5.2 The domain record
The record holds the client's details — name, domain, contact, industry, country, engagement reference, notes — the Activity block summarising its posture, and the logo used on report covers.
A domain record: client details, audit activity and the logo for reports.
5.3 The active domain and data separation
At any time, exactly one domain is active. It governs everything else in the application: the connector shown, the baselines available, the history browsed, the dashboard and the reports produced. Switching happens on the fly, with no restart.
Each domain has its own folder on disk, with its own settings and its own history database. A client's directory credentials are therefore never reachable from another client's context.
Always check the active domain before running an audit or an export. It is the number one mistake in multi-client use.
6. The Active Directory connector
6.1 How it works
The connector is the technical entry point of the audit. It opens read-only access to the directory over LDAP. Until it is configured and tested, the controls stay locked and do not enter the score.
The Connectors screen: domain, domain controller, search base and read account.
6.2 The fields
| Field | What it expects |
|---|---|
| Domain | The DNS name of the audited domain, for example corp.example.com. |
| Domain controller | The server queried. Left empty, automatic domain locator applies. |
| Search base | The starting point for queries, in DN form — DC=corp,DC=example,DC=com. Derived from the domain if left empty. |
| Integrated authentication | Ticked, the bind uses the current Windows account. Unticked, the credentials entered are used. |
| Account and password | A directory read account, as DOMAIN\user or a UPN. Ignored when integrated authentication is on. |
| LDAPS | Ticked, the bind uses port 636 with TLS. Prefer it whenever the domain controller presents a usable certificate. |
6.3 The rights required
A plain domain user is enough for the vast majority of controls: reading objects, their attributes and their security descriptors is open by default in Active Directory. This is what makes AdGUARD usable from the very first meeting, with no administrative process.
A few controls target objects with restricted read access, notably the certificate services container and some configuration partitions. Without rights on those objects, these controls report not assessed, with the reason — never 'compliant'.
A control that was not assessed is not a compliant control. It is excluded from the score, from both numerator and denominator, and the report states how many controls are in that case. A percentage is always read against that number.
6.4 Testing and removing
The Test connection button checks actual access: an LDAP bind, then a real read of a directory object. A failed test leaves the connector disabled and locked. The application never enables a connector whose access has not been proven — an audit resting on an unreachable source would produce a falsely reassuring score.
Removing the configuration erases the connector's local settings. Nothing changes in the directory: AdGUARD never wrote to it.
6.5 Security of stored credentials
The read account's password is encrypted with DPAPI at machine scope. A configuration file copied to another machine is unreadable. On the other hand, every Windows account on the machine can decrypt it: this is deliberate, since they share the same audit workstation.
Prefer integrated authentication where possible: no password is stored, and directory-side traceability carries the auditor's name.
7. Controls and categories
7.1 The catalog
Version 0.1.0 embeds 176 controls across 8 built-in packs, compiled into the application itself: no JSON file ships alongside the executable, and the catalog is available from the very first run.
| Pack | Controls |
|---|---|
| Official — AD | 58 |
| Active Directory attack paths (Tier 0 · Tradecraft · ACL) | 36 |
| AD privileged accounts | 30 |
| AD CS / ESC | 18 |
| Official — AD hardening & legacy protocols | 16 |
| Official — Trusts & LAPS | 9 |
| Official — ADIDNS (directory-integrated DNS) | 6 |
| Official — GPO hygiene | 3 |
| Total | 176 |
7.2 Anatomy of a control
| Field | Detail |
|---|---|
| Identifier | Stable over time and prefixed by pack. This is the key to quote in an action plan or a remediation tracker. |
| Category | One of the 32 functional domains: Tier Zero, ACL delegation, Kerberos, AD CS · ESC, Trusts… |
| Title | Phrased as an expected action. |
| Description | What the control checks and why it matters. |
| Level | L1 or L2. |
| Remediation | The path to fix it, expressed as administration steps. |
| PowerShell command | Provided for all 176 controls, for guidance. |
| Reference | A link to the matching documentation, on all 176 controls. |
| Framework mappings | For example: NIST AC-6 · ISO 27001 A.8.2 · ANSSI R44 · DORA Art. 9 · NIS2 21.2(i) · MITRE T1557. |
7.3 Levels L1 and L2
| Level | Meaning and weight |
|---|---|
| L1 | Fundamental, applicable with no notable functional impact, expected in every directory. 96 controls. Weight ×3 in the score. |
| L2 | Hardening, to be weighed against context and usage. 80 controls. Weight ×1. |
This weighting matters: failing an L1 control weighs three times more than an L2. It prevents a directory that neglected delegation but enabled many cosmetic hardening settings from showing a flattering score.
7.4 Selecting controls
The Security controls screen presents the catalog grouped by category, with a toggle per control, All / None actions per category, and a running counter 'X / Y controls selected'.
The catalog: controls grouped by category, with their level and an explanation of the check.
Manual selection suits a one-off adjustment. For a structured, reusable and above all defensible scope, use baselines (chapter 10).
7.5 Adding your own controls
Settings › New control extends the catalog without reinstalling, by importing JSON packs from a URL or a file. Imported packs are merged into the built-in catalog; a restart is needed to load them. Built-in packs cannot be deleted.
The New control screen: pack import and the list of installed packs.
Adding a single control, with its framework mappings.
This is the mechanism to carry an organisation's own requirements: an in-house policy, a recurring contractual clause, or a control demanded by an external auditor.
8. Compliance frameworks
8.1 The framework mapping principle
Every control is cross-referenced with the frameworks it satisfies. This mapping is not decorative: it is what allows an 'ANSSI' or 'CIS level 1' baseline to be produced without retyping anything, and a compliance-by-framework report to be issued.
8.2 Coverage
| Framework | Controls mapped |
|---|---|
| ANSSI | 176 / 176 — recommendations and control points from the French agency, the backbone of this catalog. |
| ISO/IEC 27001:2022 | 176 / 176 — Annex A clauses, A.5 organizational and A.8 technological. |
| NIST SP 800-53 | 176 / 176 — control families, chiefly AC, IA, SC, SI, AU, CM. |
| NIS2 | 176 / 176 — risk-management measures under article 21. |
| DORA | 176 / 176 — articles covering ICT risk management. |
| Microsoft Cloud Security Benchmark | 143 / 176 — MCSB domains, notably PA (privileged access) and IM (identity management). |
| MITRE ATT&CK | 81 / 176 — 18 distinct techniques, including Kerberoasting, AS-REP roasting, delegation and DCSync. |
| CIS Benchmarks | 56 / 176 — CIS Microsoft Windows Server and Active Directory hardening. |
ANSSI, ISO, NIST, NIS2 and DORA cover the entire catalog. A baseline built on any of them taken as a whole would filter nothing: that is why the matching templates work at control-family level, which genuinely divides the scope.
8.3 MITRE ATT&CK
Where the other frameworks answer 'which requirement does this control satisfy', ATT&CK answers 'what does an attacker lose when this is fixed'. That framing carries far better in a steering committee than a clause number.
9. The ANSSI maturity model
9.1 The principle
Every control is tied to a tier from 1 to 5. The level attained is the highest tier N such that no non-compliant control remains at levels 1 through N. You therefore cannot claim a higher tier while a gap at a lower tier persists — that is what sets this reading apart from a plain percentage.
9.2 The five tiers
| Tier | Scope and count |
|---|---|
| 1 | Tier 0 and privilege foundations: attack paths, ACL delegation, AD CS · ESC, privileged accounts and groups. 89 controls. |
| 2 | Kerberos, legacy protocols and secrets: encryption, service accounts, trusts, LAPS. 33 controls. |
| 3 | Policies and configuration: passwords, lockout, domain configuration, directory DNS, domain controller hardening, group policies. 35 controls. |
| 4 | Estate and directory hygiene, detection. 17 controls. |
| 5 | Governance and advanced hardening. 2 controls. |
The catalog's concentration on tier 1 — 89 controls out of 176 — is not an imbalance: it reflects the reality of directory security, where most of the risk sits in Tier 0 and delegations.
10. Baselines
10.1 What a baseline is
A baseline is the agreed audit scope: the list of controls retained, those excluded, and any level adjustments. It is what makes an audit reproducible and defensible — without a baseline, the question 'why was this control not assessed?' has no documented answer.
10.2 The templates provided
Ten templates are provided. Each selects the controls matching a framework criterion and excludes the rest. The counts shown are computed from the actual catalog, never hard-coded: they follow automatically when controls are added.
| Template | Controls kept |
|---|---|
| ANSSI | 176 |
| NIS2 | 176 |
| DORA | 176 |
| ISO 27001 — technological controls (A.8) | 148 |
| NIST — access control (AC) | 106 |
| Level 1 only | 96 |
| CIS Benchmarks | 56 |
| CIS — level 1 | 30 |
| ISO 27001 — organizational controls (A.5) | 28 |
| NIST — identification and authentication (IA) | 28 |
The Templates screen: each card states how many controls it keeps and how many are actually runnable.
10.3 The baseline editor
The editor holds the baseline's name, its scope — global for every domain, or specific to the active client — a free-text description to record exclusion rationales, and the full list of controls with their inclusion and level. The Active, Excluded and Re-levelled counters update live.
The category filter and the label search let you work one domain at a time: show only ACL delegation, or only AD CS controls, without scrolling through 176 rows.
The editor: baseline identity, counters, filters, then the full list of controls.
10.4 Good practice
- Start from a template rather than the full selection: a template carries a framework rationale the client understands.
- Exclude controls outside the technical scope, and document every exclusion in the description: at debrief time, that is what separates a deliberate scope from an oversight.
- Keep a frozen reference baseline, to measure progress over time on a constant basis.
- Do not change a baseline mid-engagement: an audit run on a different scope is no longer comparable to the previous one.
11. Running an audit
11.1 Preparation
- The active domain is the one you expect.
- The connector is configured and tested.
- The scope is settled: baseline applied, or manual selection confirmed.
11.2 Start and follow
The Security audit › Run screen shows the retained scope at the top as 'X / 176 controls enabled', then the start button. During the run, a dial shows overall progress and the stream of evaluated controls scrolls past, with the detailed finding for each warning or non-compliance: the objects actually concerned, named.
11.3 The verdicts
| Verdict | Effect on the score |
|---|---|
| Compliant | Earns the control's full weight. Includes the 'not applicable' case: no object of the targeted kind exists in the directory. |
| Non-compliant | Earns zero. The offending objects are listed in the finding. |
| Warning | Earns half the weight. Undetermined situation, an architecture choice, or partial compliance calling for human judgment. |
| Not assessed | Excluded from the calculation, from neither numerator nor denominator: missing read right, absent object, or missing prerequisite. |
11.4 How the score is calculated
poids d'un contrôle : L1 → 3 L2 → 1
points obtenus : conforme → 100 % du poids
avertissement → 50 % du poids
non conforme → 0
score = points obtenus / points possibles × 100A plain 'compliant controls / assessed controls' ratio would treat a dangerous delegation on the administrators container the same as a minor logging setting. The weighting corrects that: the score reflects risk, not headcount.
12. Results, history and comparison
12.1 The results screen
Six headline figures give the immediate reading: controls assessed, compliance percentage, compliant, non-compliant, warnings and not assessed. Three tools refine the display: a search on the label, a filter by control category, and a filter by level. A counter always shows how many controls are displayed out of the total.
Clicking a row expands it to reveal the actual finding with the objects observed, the description, the remediation, the framework mappings, the PowerShell verification command and the documentation link.
An audit's detail: headline figures, filters, export buttons and one control expanded.
12.2 The history
Each row shows the date, the number of controls assessed, the score, the verdict breakdown and the change in points against the previous audit. A filter bar — search, period, applied baseline, and an 'X / Y' counter — makes it possible to find a specific audit in a growing history.
The history: one audit per row, with its filter bar and display counter.
This filtering is purely visual: the changes between audits are still computed over the complete sequence. Hiding a row does not rewrite the progression.
12.3 Comparing two audits
The comparison screen shows the score before and after, the change, the controls that became compliant and left non-compliance, the regressed controls — those that were compliant and no longer are, to handle first because a regression almost always signals an uncontrolled configuration change — and the improved controls, which are the substance of the debrief.
Comparing two audits with different scopes produces misleading changes. For a meaningful follow-up, re-run the same baseline.
13. The dashboard
13.1 Overall and per-category compliance
Since Active Directory is the only audited referential, a per-referential breakdown would have a single row. The dashboard therefore reasons by control category: the tiles show the eight weakest categories, and the stacked block lists them all, from least to most compliant. That list is what points to where the effort belongs.
Compliance by control category, weighted breakdown, weakest first.
13.2 Trend
The trend chart traces the compliance percentage over time. This is the curve to show in a steering committee: it makes the effect of remediation visible and, just as much, silent drift.
The compliance trend over time.
13.3 How to read the dashboard
- A low overall score is not a failure in itself: a first audit on a directory that was never hardened commonly lands between 40% and 60%. What matters is the trajectory.
- Look at level 1 non-compliances before the percentage: ten failing L1 controls weigh more, in real risk, than thirty L2.
- A sharp drop between two audits calls for a comparison before any conclusion: it comes more often from a scope change than from a real regression.
14. Attack paths and trusts
14.1 What an attack path is
An attack path is a right held by a non-privileged principal over a critical object, allowing them to take control of it. It is not a software vulnerability: it is a legitimate delegation gone dangerous, often granted years earlier for a reason that no longer exists.
AdGUARD extracts these paths from the controls' findings and draws them as a graph: on the left the principal holding the right, on the right the targeted object, and between them an edge coloured by the severity of the right.
The attack path graph: who can compromise what in the directory.
14.2 Reading a path
| Right | What it allows |
|---|---|
| GenericAll | Full control over the object: can change anything, including resetting the password and adding itself to the group. |
| WriteDACL | Can rewrite the object's permissions, and therefore grant itself full control. |
| WriteOwner | Can take ownership of the object, which then allows granting itself full control. |
| DCSync | Can request directory replication, and therefore extract the password hashes of every account in the domain, krbtgt included. |
| ForceChangePassword | Can reset the account's password without knowing the current one. |
The figure to watch is not the total number of paths, but the number of paths starting from a principal every domain user belongs to. Those are within reach of any account, including one compromised by phishing.
14.3 Trusts
A poorly filtered inbound trust extends every attack path beyond the audited domain. The trust graph shows the partners, the direction of the relationship and the weaknesses found: SID filtering off, TGT delegation, no selective authentication, RC4 encryption, stale trust password.
The trust graph: partners, direction and weaknesses found.
14.4 The remediation plan
The attack path report includes a dsacls remediation script. The removal commands are deliberately commented out: AdGUARD is a read-only tool and must never modify a directory by accident. The verification commands are active and have no side effect.
15. Reports and exports
15.1 How it works
Exporting combines two independent dimensions: a report type, which sets the editorial angle and the content, and one or more file formats, which set the medium. The chosen type applies to every format exported from an audit's detail.
Settings › Export: choosing the report type and enabling formats.
15.2 The six report types
| Type | Content and recipient |
|---|---|
| Executive report | Cover page with the client's logo, score, key figures and main findings. Deliberately concise and jargon-free. For executive management and the CISO. |
| Detailed technical report | Every control assessed with, for each, the verdict, the finding, the description, the remediation and the framework mappings. For the team running the directory. |
| Prioritized remediation plan | Non-compliances only, ordered by criticality, with the expected corrective action. A working document, not a findings document. |
| Compliance by framework | Results broken down by framework, to answer a formal compliance requirement. For an external auditor or a compliance function. |
| Situation report | The exportable counterpart of the dashboard: score and change, trend curve, posture by category, ANSSI maturity, what moved since the previous point, the five priorities. For a steering committee. |
| Attack paths | Who can compromise what: the graph, the reading by target and by principal, the plain-language glossary of rights, the trusts and the remediation plan. For a technical debrief or a privilege review. |
An exported report, with its branded header and headline figures.
15.3 The five formats
| Format | Typical use |
|---|---|
| Formal deliverable, archiving, contractual attachment. | |
| HTML | Standalone formatted report, read in a browser and printed as is. |
| Excel (.xlsx) | Analysis, remediation tracking, in-house dashboards. |
| CSV | Import into a third-party tool, reprocessing, ticketing. |
| JSON | Automation, SIEM ingestion, timestamped evidence format. |
JSON is the most useful evidence format: it holds every finding, the stable control identifiers and the issuer's identity. Kept alongside the delivered PDF, it allows an audit to be replayed or verified months later. For the attack path report it also embeds the graph in Graphviz and GraphML formats, which can be reopened in yEd or Gephi.
15.4 Which report for which purpose
| Situation | Type and format |
|---|---|
| Executive committee debrief | Executive, as PDF |
| Quarterly review | Situation, as PDF |
| Handover to the technical team | Remediation plan, as Excel or PDF |
| Privilege and delegation review | Attack paths, as HTML then JSON |
| Answering a compliance questionnaire | Compliance by framework, as PDF or Excel |
| Archived evidence of a dated audit | Detailed technical, as JSON and PDF |
16. Performance
Settings › Performance sets the number of controls analysed simultaneously, from 1 to 16, with a default of 8. Raising it speeds up the audit but puts more load on the domain controller being queried.
The built-in benchmark measures the duration of a simulated audit at different parallelism levels and points at the optimal setting for this machine. Beyond a certain point, contention costs more than it gains.
The parallelism setting and the built-in benchmark.
On a very large directory, an audit that slows down mid-run is a sign that the domain controller is throttling LDAP queries. This is normal and protective behaviour: working around it by raising parallelism would have the opposite effect.
17. Appendices
Appendix A — File layout
C:\Program Files\AdGUARD\ programme (remplacé à chaque mise à jour)
C:\ProgramData\AdGUARD\ données (jamais touchées par une réinstallation)
├── license.key
├── control-packs\
└── clients\<client>\
├── settings.json
└── audit.dbAppendix B — Troubleshooting
| Symptom | Likely cause and action |
|---|---|
| The application starts on the activation screen | License missing or invalid. Paste a valid key, or drop license.key into C:\ProgramData\AdGUARD\. |
| Cannot create a domain | Record quota reached. Delete an unused record or request a higher-quota license. |
| The connection test fails | Check the domain controller is reachable, the port (389 or 636), the account format and the search base. The error message names the step that failed. |
| The Security controls section is empty | The connector is not configured. Fill it in and test it. |
| Many controls not assessed | Missing read right on some containers, or a feature absent from the directory. These controls are excluded from the score; check the read account's rights. |
| Score dropped sharply with no known change | Different scope between the two audits. Compare the two audits and check the number of controls assessed on each side. |
| Newly imported controls do not appear | Restart not done: imported packs are loaded at startup. |
Appendix C — A typical engagement
| Phase | Actions |
|---|---|
| Framing | Create the domain record, fill in the engagement reference and known constraints. Agree the scope with the client. |
| Connection | Configure the connector and test it. Document any unreachable containers. |
| Scope | Create a baseline from the relevant framework template. Justify every exclusion in the description. |
| Initial audit | Run the audit and export the detailed report as JSON for timestamped evidence. |
| Debrief | Executive report as PDF for management, attack paths for the technical review, remediation plan for the team. |
| Follow-up audit | Re-run the same baseline, compare with the initial audit and produce the situation report. |
| Ongoing | Re-audit periodically. The trend curve is the natural support for the steering committee. |
Appendix D — Security and confidentiality
- No write on the audited directory: every operation is a read.
- No data leaves the machine: no intermediate service, no telemetry, no reporting back to the vendor.
- Offline license verification: no activation server is contacted.
- Secrets encrypted with DPAPI at machine scope: a configuration file copied elsewhere is unreadable.
- The audit workstation is a sensitive asset: it concentrates read access to several clients' directories. Disk encryption, session locking and restricted physical access are prerequisites, not options.
- Reports contain detailed configuration data. They must be transmitted over a secure channel and retained according to the policy agreed in the contract.
Appendix E — Glossary
| Term | Definition |
|---|---|
| AD CS | Active Directory Certificate Services, the directory-integrated certificate authority. Misconfigured templates (ESC1 to ESC8) allow privilege escalation. |
| ADIDNS | Directory-integrated DNS. Its zones grant broad creation rights by default, exploitable to intercept traffic. |
| ANSSI | The French national cybersecurity agency, whose Active Directory recommendations form the backbone of this catalog. |
| DCSync | A directory replication request, allowing the password hashes of every account to be extracted. |
| Unconstrained delegation | An account allowed to reuse the Kerberos ticket of any user authenticating to it. One of the most dangerous configurations in a directory. |
| DPAPI | The Windows Data Protection API, used here to encrypt secrets stored on the machine. |
| Kerberoasting | Offline extraction of a service account's password from a legitimately requested Kerberos ticket. |
| LAPS | Local Administrator Password Solution: unique local administrator passwords managed by the directory. |
| LDAPS | LDAP over TLS, port 636. Protects the directory bind against eavesdropping and interception. |
| Tier 0 | The set of objects whose compromise entails that of the domain: domain controllers, administration accounts and groups, AD CS. |
| SID filtering | The filtering that prevents a trusted domain from injecting privileged security identifiers of the trusting domain. |