Version History

Release notes and what's new in each version of MDE Toolkit.

Version 3.4.0 — Latest

The headline is supply chain: release artifacts are now digitally signed, so you can verify what you downloaded before you deploy it to a fleet. Alongside that, a Smart App Control reporting bug is fixed that had been wrong in the dangerous direction, EDR onboarding moves onto the Overview page, and the application icon changes.

🔏 Signed releases

Every release artifact is signed with Azure Artifact Signing and RFC‑3161 timestamped. Until now the toolkit shipped as an unsigned MSI — an installer that requests elevation and reads your Defender configuration, with no way for you to confirm it was the file that left the build.

Timestamping matters more than usual here. Azure Artifact Signing issues short‑lived certificates by design; the RFC‑3161 countersignature is what keeps the signature valid after that certificate expires, rather than the download turning untrusted a few days later.

Verify before you deploy:

PowerShell
Get-AuthenticodeSignature .\MDE-Toolkit-3.4.0.msi |
    Format-List Status, SignerCertificate, TimeStamperCertificate

Status should read Valid. A signed package also means SmartScreen has something to build reputation against, and that you can write WDAC or AppLocker publisher rules for the toolkit instead of hash rules that break on every update.

🐛 Smart App Control was reported incorrectly — in the dangerous direction

Two independent defects, both fixed. The second is the one worth reading.

Both the WMI and registry paths now produce the same normalised values, so the compliance check and the Security Score can no longer disagree about the same device. Thanks to Eric Lawrence for identifying the registry mapping error.

📡 EDR onboarding on the Overview page

The Intune / Entra Management card gains three rows: EDR Onboarding, Sense Service and MDE Org ID. Previously this required opening a support bundle.

They are deliberately grouped separately from the enrollment rows above them, because MDM management and EDR onboarding are independent. A device can be fully Intune‑enrolled, compliant, and syncing happily while sending Microsoft Defender for Endpoint no telemetry whatsoever. Reading “Enrolled” and concluding “monitored” is exactly the mistake this is meant to prevent.

Works against remote targets on the same terms as the rest of the Overview page.

🎨 New application icon

The previous icon was Microsoft Defender’s own product icon. MDE Toolkit is an independent open‑source project and is not a Microsoft product, so shipping Microsoft’s product iconography was not appropriate regardless of how recognisable it was.

The replacement is a telemetry trace. The choice is deliberate: a shield claims protection, and the toolkit does not protect anything — it measures, reports, and tells you what to fix. The icon is supplied at every size from 16 to 256 pixels, each rendered natively rather than scaled down, so it stays legible in the taskbar.

📦 Dependencies and project hygiene

👤 For Administrators

Verify the signature before wide deployment. Run Get-AuthenticodeSignature on the downloaded MSI and confirm Status is Valid and a timestamp is present. This is worth doing on the first signed release specifically, because it is the release that establishes what a genuine artifact looks like.

Download 3.4.0 from GitHub Enterprise deployment

Version 3.3.4

A sign-in correctness release. The MDE Toolkit Upload scheduled task could open a Microsoft Edge window and ask an unattended machine to authenticate. The failure was counterintuitive enough to be worth writing down: the machines that prompted were the ones joined to the tenant that owns the Function App, and the machines that stayed silent were the ones joined somewhere else entirely.

🐛 Why the joined machines were the ones that prompted

The uploader authenticated with DefaultAzureCredential. That credential knows nothing about Entra device join and cannot use the machine’s primary refresh token — it simply walks a fixed chain of providers and returns the first token it gets. The chain ends at an interactive browser.

So device join was not just unhelpful here, it was invisible to the credential. The quieter machine was the misconfigured one.

🔒 The broker now does the sign-in

Scheduled uploads acquire tokens through the Windows broker (WAM), which is the only provider that can redeem the machine’s Entra PRT. On a joined or registered device this is silent and uses the correct identity. The interactive browser is now excluded outright from every code path the background collector uses, and automatic authentication is disabled on the broker itself, so a machine that cannot sign in silently fails and logs a reason instead of rendering a window nobody will ever see.

The previous PreferredAuthMethod = WAM setting never actually used WAM — it constructed a plain interactive browser credential with no broker attached, so it could not do silent SSO either. It now does what its name says.

The fallback path is still available for machines that genuinely rely on a signed-in Azure CLI or Azure PowerShell session, but it is now pinned to the configured TenantId, so a stale sign-in to an unrelated tenant can no longer quietly become the upload identity.

⚙️ New optional setting: AuthClientId

Broker sign-in needs a client application to request the token as. In most deployments the toolkit can work this out on its own, so no configuration change is required to upgrade. It tries, in order:

Set AuthClientId (REG_SZ, under HKLM\SOFTWARE\Policies\MDE-Toolkit) when your client and API are separate registrations, or to pin the choice and skip the probe. Whichever registration ends up being used needs public client flows enabled, redirect URI ms-appx-web://microsoft.aad.brokerplugin/<client-id>, and access to the scope named in FunctionAppAudience. When the probe succeeds on a fallback candidate, the log names the client ID that worked so you can pin it.

Recommended for production: set it explicitly. Optional is not the same as advisable — if the probe lands on the built-in Azure CLI client, your Function App is being accessed through Microsoft's app registration. That works, but it means anyone with the Azure CLI installed can request tokens for your API, and Conditional Access cannot be scoped to an application you control. Note that a registration used for blob upload also needs a delegated user_impersonation permission on Azure Storage; the Azure CLI client has that by default, a fresh registration of your own does not.

🔑 Machines outside the tenant: --auth-login

A device that is not Entra joined to the tenant that owns the Function App has no primary refresh token for it, so the broker cannot sign in silently there no matter how AuthClientId is set. Until now such machines worked only because a leftover az login session was quietly supplying every token — an unchosen dependency on a developer tool that would break the moment it expired.

Run once, as the user the upload task runs as:

Command Line
"C:\Program Files\MDE-Toolkit\MDE Monitoring App.exe" --auth-login

This prompts once, acquires consent for every configured upload target, and saves an authentication record to %LOCALAPPDATA%\MDE-Toolkit\auth-record.json. Scheduled uploads then refresh that account silently. It is the only mode in the toolkit that will ever display a sign-in window. Devices joined to the correct tenant do not need it.

👤 For Administrators

If uploads start failing after the upgrade, check service.log in the cache folder (default C:\ProgramData\MDE-Toolkit\cache\service.log). A silent-auth failure now names the account Windows is signed in as, the tenant a token was requested for, and the client IDs tried, rather than dumping the raw credential chain. If the signed-in account belongs to a different tenant than the Function App, that is the cause — run --auth-login once on that machine.
Nothing else changed. No changes to the JSON schema, the collected fields, the OData entity keys, the CLI, or any policy value. The interactive application signs in exactly as it did before.

Download 3.3.4 from GitHub Enterprise deployment

Version 3.3.3

A telemetry honesty release. Building the fleet dashboards surfaced four fields that the enterprise collector had been reporting without ever measuring. Each was uploaded at its default value on every device, so a report reading them saw false or 0 and had no way to tell that apart from a real result — which is worse than not collecting them at all.

📋 Fields that were never actually collected

🐛 Scan timestamps were dropped for the freshest devices

Quick and full scan times are derived from Defender’s scan age in days, and the code only recorded a timestamp when that age was greater than zero. A scan that ran today has an age of exactly zero, so the machines that had just scanned — the ones in the best shape — uploaded no scan time at all and were indistinguishable from machines that had never scanned. The test is now >= 0.

👤 For Administrators

Existing rows are not backfilled. Azure Table Storage keeps whatever each row was written with, so reports covering history will still show the old defaults for devices that have not yet uploaded on 3.3.3. Slice on ServiceVersion to see how far the rollout has reached, and consider deleting pre-3.3.3 rows if the false zeros would skew a fleet percentage.
Nothing else changed. No changes to the JSON schema, the OData entity keys, the collect/upload scheduled tasks, the CLI, or any policy value. The interactive application is unaffected — these fields are only used by the background collector.

Download 3.3.3 from GitHub Fleet dashboards

Version 3.3.2

A policy-surface cleanup. An audit of every value under HKLM\SOFTWARE\Policies\MDE-Toolkit found nine settings that were read into the configuration object and then never used, so setting them did nothing at all. Two were worth building; seven were removed.

🔒 Two flags now actually work

Both were documented on this site and in the in-app KB while doing nothing — the same failure mode as ForceReadOnlyMode in 3.3.1. An administrator who set DisableRemoteTarget=1 reasonably believed remote access was off.

🧹 Seven dead settings removed

CollectFirewallRules, CollectWfpFilters, CollectDeviceControl, CollectNetworkInfo, CollectSecurityScore, DisableAiFeatures and DisableAdvancedNetworking are no longer read, no longer seeded by the installer, and are ignored if present. The five Collect* flags promised scope control over data the background collector never gathered. The two Disable* flags duplicated VisibilityAiAnalysisPage and VisibilityNetworkingPage, which are enforced — use those instead.

The six remaining Collect* flags — DefenderStatus, DefenderPolicies, FirewallStatus, AppControl, IntuneEnrollment and DeviceGuard — are genuinely honoured by the collector and are unchanged.

👤 For Administrators

Check your policy before deploying. If you previously set DisableExportButtons=1 or DisableRemoteTarget=1 expecting them to work, they will now take effect for the first time. If you set them speculatively and still want export or remote targeting, set them back to 0 before rolling out 3.3.2.
Backwards compatible. No changes to the JSON schema, the OData entity keys, the collect/upload scheduled tasks, the CLI, or any Visibility*Page value.

Download 3.3.2 from GitHub All download options

Version 3.3.1

Attack Surface Reduction release. The ASR page becomes a two-page workspace β€” an overview that finally tells you what mode every rule is in and where that configuration came from, and a new Events page for investigating blocks and tuning them. Admins can create audited, expiring exclusions directly from an event.

πŸ›‘οΈ ASR Overview β€” one grid, real answers

The overview used to read rule state from a single registry key, which meant it could not see rules configured locally. Two consequences, both fixed:

πŸ“‹ ASR Rules > Events β€” a new sub-page

πŸ” Audited ASR exclusions (Admin Mode)

πŸ› Fixes

πŸ”’ Enterprise guardrails for ASR exclusions

New optional policy values under HKLM\SOFTWARE\Policies\MDE-Toolkit restrict what admins may create. A device with none of them set behaves exactly as before.

Enforcement happens in the apply path, not just the dropdown, so the policy is not merely cosmetic. Temporary-only with a four-hour cap is two values: AsrAllowPermanentExclusions=0 and AsrExclusionMaxHours=4.

πŸ‘€ For Administrators

Exclusions survive uninstall by design.
Backwards compatible. No breaking changes to the JSON schema, the OData entity keys, the collect/upload scheduled tasks, or the CLI. Existing Visibility*Page policy values are unaffected.

Download 3.3.1 from GitHub All download options

Version 3.2.1

Enterprise telemetry + in-app guide release. Fixes the fields that were empty or wrong in the Azure Table row, adds richer columns for Power BI, and turns the Knowledge Base into a full offline guide for both MDE and the toolkit itself. No breaking changes β€” drop-in over 3.2.0.

πŸ“‘ Telemetry β€” rows now populate correctly

The following columns used to arrive empty, Unknown, or wrong in the storage table. All now populate with real values on every uploaded snapshot:

πŸ”’ App Control status β€” smarter derivation

AppControlStatus used to say NotConfigured on machines with 28 audit-mode .cip policies deployed. Now:

🏷️ Enterprise tags promoted to columns

The DeviceTag, OrgUnit, and Environment values from HKLM\SOFTWARE\Policies\MDE-Toolkit were already inside every uploaded JSON but the Function App wasn't writing them as table columns. The ingestion function now promotes all three to top-level, sliceable columns β€” Power BI slicers on DeviceTag / OrgUnit / Environment start returning values on newly upserted rows.

☁️ Function App

πŸ“– Knowledge Base β€” the in-app guide

The Knowledge Base page (left-nav β†’ book icon) has been refreshed to serve as the primary in-app guide for both learning MDE and learning the toolkit. Everything is available offline β€” no external calls required.

Where to find it. Launch MDE Toolkit β†’ click Knowledge Base in the left navigation. The header search box at the top-right does full-text matching across every article, ASR rule, troubleshooting scenario, App Control concept, policy option, and KQL query.

Doubles as the tool's own How to use MDE Toolkit guide. Each Components article calls out which pages in the toolkit surface that pillar and what a "healthy" result looks like β€” for example, the ASR component explains which cards on the Defender Policies and Advanced Hunting pages to check. New operators can open the KB, read a component article, and immediately know which page to open in the app.

πŸ“š Documentation

πŸ‘€ For Administrators

Backwards compatible. No breaking changes to the JSON schema, the OData entity keys, the scheduled tasks, or the CLI. Power BI reports built for 3.2.0 keep working; new columns are additive.

Download 3.2.1 from GitHub All download options

Version 3.2.0

App Control Deep-Dive: six new workflow features and a completely rebuilt ticket-attachment export pipeline. This is the biggest App Control release since 3.1.0.

πŸ” Six new App Control features

πŸ“Ž New "Export Report" dialog (replaces "Save PDF for ticket…")

🌐 HTML export (new)

Single self-contained .html file β€” no frameworks, no external assets, no CDN references. Same "attach it to a ticket, no assets folder" story as the PDF.

πŸ“ Triage Report HTML modernized

The Triage Report's HTML output now uses the same visual language as the Export Report β€” dark-mode, sticky TOC, verdict banner, collapsible sections, sortable tables, in-page search. The Save-File dialog now defaults to HTML with Markdown as the second option. Markdown output is unchanged for pasting into ticket bodies (still renders natively in ServiceNow, Azure DevOps, GitHub, Confluence).

πŸ–₯️ CLI parity with the GUI

The silent-mode App.xaml.cs handlers are now rewired through the same ExportReportAsync pipeline the GUI uses. Everything the dialog offers is exposed as a flag:

Backwards compatible: --export-pdf alone still produces exactly one PDF at the given path. Batch mode (--machines-file / --export-dir) now honours every new flag; per-host filenames get the appropriate extensions when --format both is used.

πŸ”§ Fixes

πŸ‘€ For Administrators

⚠️ Known limitations

Cosmetic: the Overview export toolbar icon changed from DocumentBriefcase to Save to better match the "save as file" intent.

Download 3.2.0 from GitHub All download options

Version 3.1.2

Focus release: the policies the Advanced Hunting page exports now actually compile and enforce. A pile of rule-quality, accuracy, and usability fixes built on top of 3.1.1.

✨ What's New

πŸ”§ Rule generation fixes

πŸ“Š Comparison & UI fixes

πŸ‘€ For Administrators

Heads-up for anyone who tested 3.1.1 exports. Re-export your policies with 3.1.2 — the 3.1.1 files compiled but didn't enforce anything because the SigningScenarios wiring was missing.

Download 3.1.2 from GitHub All download options

Version 3.1.1

New App Control for Business → Advanced Hunting sub-page that pulls live WDAC events from Microsoft Defender for Endpoint, compares them against your local or custom App Control policies, and recommends the right allow rules to author β€” with the same -Level / -Fallback precedence semantics as PowerShell New-CIPolicy.

✨ New: App Control for Business — Advanced Hunting

πŸ”€ Rule precedence (PowerShell -Level / -Fallback)

πŸ” Smarter, safer rule generation

🎨 UI polish

πŸ› οΈ Under the Hood

πŸ‘€ For Administrators

Heads-up for in-place upgrades. No configuration changes are required. The collector, upload task, registry policy keys, and Function App contract are all identical to 3.1.0. The new Advanced Hunting page is opt-in — it only runs when the operator opens it and clicks Sign in.

Download 3.1.1 from GitHub All download options

Version 3.1.0

Focused on scrolling quality of life across every page and grid in the app.

✨ What's New

πŸ› οΈ Under the Hood

πŸ‘€ For Administrators

Heads-up for in-place upgrades. No configuration changes are required. The collector, upload task, registry policy keys, and Function App contract are all identical to 3.0.x.

Download 3.1.0 from GitHub All download options

Previous Releases

Full release notes and downloads for older versions live on the GitHub releases page.

View all releases on GitHub β†’