HomeNewsletterCommunityMVP FeedToolsArchiveBlogToday's NewsAboutServicesQuick Links★ Pro Subscribe free
← Back to Blog
Security SecurityWindows 11Windows ServerCode IntegrityApp ControlDriversPowerShell26H2

Windows Driver Policy: Cross-Signed Kernel Drivers Are No Longer Trusted — Find Yours Before Enforcement Turns On

IA
Imran Awan
30 September 2026
Start here — what this actually is

Windows only lets a kernel driver load if it carries a signature Windows trusts. For about twenty years, one of the signatures it trusted came from something called the cross-signed root program — a scheme where commercial certificate authorities, not Microsoft, issued the driver-signing certificates. Microsoft retired that program in 2021 and every certificate in it has since expired, but the Windows kernel carried on trusting drivers already signed with them.

That trust is now being withdrawn. A feature called the Windows Driver Policy watches each device for a while, and if it looks safe, switches on permanently and stops loading those drivers. Nothing you configure triggers it and nothing in Intune reports it. This post shows you how to find out which of your drivers are affected — using read-only commands — before any of them stop working.

Microsoft's IT pro guide to Windows 11, version 26H2 mentions this in a single sentence: default trust for cross-signed drivers is removed, WHCP-signed drivers and an allow list of trusted legacy drivers remain. That sentence is doing an enormous amount of work. It is describing a change to the rules about what can run in the Windows kernel — the first one of this scale in years — and if you read it as a 26H2 feature you will draw exactly the wrong conclusion about your timeline. The policy did not arrive with 26H2. It has been running on your Windows 11 24H2, 25H2 and 26H1 devices, and on Windows Server 2025, since the April 2026 update.

The short version

The Windows kernel no longer trusts drivers signed by the expired cross-signed root program. Only drivers signed through the Windows Hardware Compatibility Program (WHCP), plus an explicit Microsoft allow list of widely-used legacy drivers, are permitted. The policy shipped in the April 2026 update to 24H2, 25H2, 26H1 and Windows Server 2025, and 26H2 and later ship with it built in rather than receiving it through servicing. Either way it does not start blocking on day one: on every device it begins in evaluation (audit) mode, where offending drivers are logged but still load. After 250 hours of uptime and 3 restarts (2 on Server) with no violations, the device flips to enforcement permanently and those drivers stop loading. Because the clock is per-device and resets on every violation, two identical machines will switch over weeks apart. Find your affected drivers now with CodeIntegrity Event ID 3076 — it is a read-only query and it works today.

Who needs to do something about this

If you are…What this means for you this month
Service desk / 1st lineWhen a printer, GPU, capture card, VPN adapter or dongle stops being recognised and "nothing changed", check CodeIntegrity Event ID 3077 before you rebuild the machine. A blocked kernel driver looks exactly like failed hardware.
Desktop / endpoint engineerRun the Event ID 3076 audit query across the estate now. It is read-only and it gives you the list of drivers that will break, weeks or months before they do.
Packaging / app ownerAny product you package that installs a kernel-mode driver — backup agents, USB dongles, virtualisation, security tooling, legacy point-of-sale — needs a WHCP-signed version from the vendor. Add it to your vendor questions now.
Server teamWindows Server 2025 is in scope, with the same 250 hours but only 2 restarts. Do not assume servers get longer — a 24/7 server burns 250 hours of uptime in about 10 days, roughly four times faster than an office laptop, so the only thing holding it in evaluation is the restart count. Two monthly patch cycles and it enforces.
Security / architectureThis shrinks the kernel attack surface meaningfully, and the cross-signed program was a documented credential-theft target. Resist requests to switch it off; the supported answer is WHCP-signed drivers.
Anyone writing in-house driversYou need either WHCP certification through Hardware Dev Center, or App Control custom kernel signers — and custom kernel signers can only be enabled during initial device setup, so plan it before you build.

The problem: a driver that worked for months stops loading, on a day nothing was installed

The symptom does not look like a policy change. It looks like a hardware fault.

A device that has been working for months suddenly behaves as though a piece of hardware has been unplugged. Microsoft lists three shapes it takes: a hardware device stops functioning correctly; a peripheral or component such as a printer, network adapter or GPU is no longer recognised; or an application that depends on a kernel driver refuses to start.

What makes it genuinely difficult to diagnose is the absence of a trigger. No update was installed that day. Nobody changed a setting. The driver file is still on disk, still has a valid-looking signature, and Device Manager may simply show the device as having a problem. The user's account of events — "it just stopped working" — is completely accurate, which is unusual and, in this case, unhelpful.

⚠ Gotcha: the trigger is a per-device counter reaching a threshold, not a date, a patch or a policy. There is no fleet-wide event to correlate against, no KB number to blame, and the devices affected on any given day are simply the ones whose counters happened to mature. If you look for the change that caused it, you will not find one, because on that device nothing changed except the passage of time.

The second thing that makes it hard: the policy deliberately goes quiet on the machines that need it most. A device that loads an affected driver every day never reaches enforcement at all — it sits in audit mode indefinitely, working perfectly, reporting nothing. It only becomes a problem once that driver stops being loaded often enough, at which point the counter finally runs to completion and enforcement arrives on a machine you had every reason to believe was fine.

What this looks like as an actual ticket

A worked example, because the shape of this is the part that is hard to recognise the first time.

Ticket — how it arrives

"Finance can't use the cheque scanner. It worked on Friday. Device has been rebuilt once already and it still doesn't work. Scanner works fine on the machine next to it."

What normally happens next

Reinstall the scanner software. Try a different USB port. Try a different cable. Swap the scanner. Escalate to the vendor, who confirms the hardware is fine. Rebuild the machine — which appears to fix it, because a rebuild resets the evaluation counters and the driver starts loading again. Three weeks later the same ticket comes back, and now nobody trusts the diagnosis.

What identifies it in about two minutes

Open Event Viewer on the device, go to the CodeIntegrity Operational log, and filter for Event ID 3077. If there is an entry naming the scanner's driver, with the policy GUID {8F9CB695-…}, the hardware is fine and the software is fine — Windows is refusing to load the driver. The machine next to it still works because it has not finished its 250 hours yet.

Three tells to recognise, none of which require you to understand code signing:

  1. "It worked on Friday" with no change on Monday. No update, no install, no policy edit — and genuinely so, because the trigger was a counter, not a change.
  2. An identical machine is unaffected. Same model, same image, same software, different outcome. That rules out most of what you would normally suspect, and it is exactly what a per-device clock produces.
  3. A rebuild fixes it, temporarily. This is the most misleading tell of all, because it looks like proof the problem was local corruption. It is not — reimaging resets the evaluation period, so the fault is guaranteed to return.
⚠ Gotcha for first line: if a rebuild fixes a hardware fault and the fault returns weeks later on the same device, stop rebuilding and check Event ID 3077. Every rebuild buys roughly 250 hours of uptime and hides the real cause, which is why this class of ticket can bounce between teams for months before anyone names it.

Why it happens: an expired signing programme, and a countdown that runs per device

The idea in one paragraph, before the detail

A kernel driver needs a signature Windows trusts, and there have always been two ways to get one. Think of them as two ways to get a pass for a secure building.

The old way (cross-signed) was like buying a pass from an approved print shop on the high street. The shop confirmed your payment details and printed you a pass the building's door staff recognised. Nobody inspected what you were carrying, and — the important part — you took the pass printer home with you. Thousands of companies each held their own printer. Some of those printers got stolen, and the stolen ones printed passes that still worked.

The new way (WHCP) is like applying to the building's own security office. They verify who you are, x-ray what you want to bring in, run it through their tests, and only then issue the pass — and the printer never leaves their office. You cannot make your own pass.

The print shops shut down in 2021 and every pass they issued has expired. But the door staff kept accepting them anyway, because refusing would have turned away people who genuinely work there. The Windows Driver Policy is the door staff finally being told to stop accepting the old passes — with a published list of specific old passes that still work, and a settling-in period on each door before the new rule is enforced.

What the cross-signed root program was

To load a driver into the Windows kernel, the driver has to be signed by an authority the kernel trusts. Windows has had two routes to that signature.

The cross-signed root program was the old route, introduced in the early 2000s. Commercial certificate authorities issued code-signing certificates that chained up to a Microsoft-trusted root, and the driver author held the private key and signed their own driver. Microsoft's role was limited: the vetting varied by CA, and crucially the program made no assessment whatsoever of whether the driver code was safe or even compatible. A signature proved someone had bought a certificate. It did not prove anyone had looked at the driver.

It also put the private keys in thousands of separate hands. Those keys leaked and were stolen, and signed-but-malicious kernel drivers became a reliable attack technique — a signature stolen from a legitimate vendor grants ring-0 access on every Windows machine that trusts it.

The Windows Hardware Compatibility Program is the modern route, and the difference is what happens before the signature exists. Submissions are scanned for malware. The publisher's identity is vetted. Hardware Lab Kit test results have to be supplied and pass. Only then does Microsoft sign the driver, with a certificate Microsoft itself owns and controls — the driver author never holds a key that can mint kernel trust.

Microsoft deprecated the cross-signed program in 2021 and every certificate issued under it has since expired. But expiry is not the same as distrust: the kernel carried on honouring drivers that had already been signed, because withdrawing that trust would have broken working hardware. That is the gap the Windows Driver Policy closes.

📋 Note: an expired certificate is normal and expected here, not the problem. Kernel driver signatures are evaluated against the moment of signing, which is why these drivers kept loading for five years after the program shut down. The change is not that the certificates expired — it is that Windows has stopped treating that whole category of signature as trustworthy.

Why Microsoft says it is safe to do this now

The obvious risk in removing trust from an entire signing programme is breaking hardware that people depend on. Microsoft's mitigation has two parts.

First, an explicit allow list. Microsoft maintains a curated list of reputable, widely-used cross-signed drivers that continue to be trusted even though they are not WHCP-certified. The list was built from driver load telemetry gathered across Windows 11 and Windows Server 2025 over the preceding two years, so the drivers most likely to be in use are the most likely to be on it.

Second, and more important operationally, the two-phase rollout — which is where the per-device timing comes from.

Evaluation mode, and the counter that resets

When the policy activates on a device it starts in evaluation mode, which is an audit mode. Drivers that would be blocked are logged, and then allowed to load anyway. The device keeps working. Meanwhile Windows counts.

CriterionWindows 11Windows Server 2025Behaviour
System uptime250 hours250 hoursAccumulated hours of active use, not wall-clock time since the update
Boot sessions3 restarts2 restartsCounted from the start of evaluation
Policy violationsZeroIf a driver that would be blocked loads, both counters reset to zero

Only when all three hold does the device transition to enforcement mode, at which point untrusted cross-signed drivers stop loading, block events are written to the event log, and diagnostic data goes back to Microsoft. Enforcement persists across reboots. There is no drift back to audit.

How long is 250 hours, really?

This is worth doing as actual arithmetic, because "250 hours" sounds like a long time and for some of your devices it is about a week and a half. It counts hours the device is switched on and running, not days on the calendar — so the same threshold produces wildly different wall-clock dates across an estate.

Device patternHours per week250 hours reached inWhich criterion actually holds it back
Server or kiosk, on 24/7168~10 daysThe restarts. Uptime is met almost immediately, so enforcement waits for the 2nd reboot — about two monthly patch cycles.
Office laptop, 8h a day, 5 days40~6 weeksThe uptime. 3 restarts happen within days, then it is just waiting for hours to accumulate.
Hybrid laptop, 8h a day, 3 days24~10 weeksThe uptime, and it is the slowest group in a typical estate.
Light or occasional use, 2h a day14~18 weeksThe uptime. These devices look fine for months, then break.

Two practical conclusions from that table. First, your servers are not the safe group — they are among the first to enforce, because being on all the time is what the counter rewards. Second, the devices that enforce last are the ones you will have stopped worrying about: the occasionally-used laptop in a drawer, the spare, the part-time user's machine. Those produce incidents in month four, long after the project felt finished.

📋 Note: these figures are the arithmetic of the published thresholds, not a Microsoft-published timetable. Microsoft documents the criteria (250 hours, 3 restarts, no violations); the wall-clock estimates above are simply what those criteria work out to for common usage patterns, and your real numbers depend on how your devices are actually used. Use them to reason about ordering and risk, not as dates to put in a plan.

Read that reset rule carefully, because it inverts the intuition. The device most at risk of a surprise is not the one with a non-compliant driver — that one is pinned in audit mode and stays working. The risk lands when the blocking driver goes away: someone retires the old scanner, uninstalls the legacy agent, or the vendor ships a WHCP-signed update. The counter starts cleanly, runs for 250 hours, and enforcement engages on whatever other cross-signed drivers are still present but load rarely enough that they were never the thing resetting the clock.

📋 Note on a number you will see disagree: Microsoft's what's new in Windows 11, version 26H2 page states the audit period as "at least 100 hours and three restarts." That figure is out of date. The original March 2026 announcement also said 100 hours, but it carries an editor's note recording a change to 250 hours effective with the June 9 (6B) release, and the current support documentation states 250 hours. Plan on 250. Two Microsoft pages genuinely contradict each other here; the support page and the updated announcement are the ones that have been revised.

How to verify: which mode this device is in, and which drivers are on the list

Everything in this section is read-only. None of it changes the policy state, and all of it works today on any in-scope device.

Step 1: is the policy present, and which mode is it in?

The Windows Driver Policy is implemented as a pair of Code Integrity policies, identified by fixed GUIDs — one for audit, one for enforcement. CiTool lists the Code Integrity policies active on the device, so asking which of the two GUIDs is present tells you the mode. Run this in an elevated PowerShell session.

Get-DriverPolicyMode.ps1
$p = (citool -lp -json | ConvertFrom-Json).Policies
$audit   = $p | Where-Object { $_.PolicyID -eq '784c4414-79f4-4c32-a6a5-f0fb42a51d0d' }
$enforce = $p | Where-Object { $_.PolicyID -eq '8f9cb695-5d48-48d6-a329-7202b44607e3' }

if     ($enforce.IsEnforced -and $enforce.IsAuthorized) { 'ENFORCEMENT mode' }
elseif ($audit.IsEnforced   -and $audit.IsAuthorized)   { 'EVALUATION (audit) mode' }
else                                                    { 'Not present on this system' }

# ---------------- output ----------------
EVALUATION (audit) mode

Three outcomes, and each one means something different for your planning:

ResultWhat to do
Evaluation (audit) modeYou have time, but you do not know how much. Go to Step 2 and get the affected-driver list.
Enforcement modeAlready live. Untrusted cross-signed drivers are being blocked now — query Event ID 3077 for what has already been refused.
Not presentThe device has not reached the April 2026 update, or is on a Windows version outside scope. Patch level is the thing to check.

Step 2: which drivers would be blocked?

This is the query that matters, and the reason to act while you are still in audit mode. Every driver that would be blocked is already being written to the event log, with its filename and the process that tried to load it. Two event IDs, in the CodeIntegrity operational log:

Event Viewer › Applications and Services Logs › Microsoft › Windows › CodeIntegrity › Operational
Event IDMeaningPolicy GUID in the event's Policy ID field
3076Driver audited — would have been blocked, was allowed because the device is in audit mode{784C4414-79F4-4C32-A6A5-F0FB42A51D0D}
3077Driver blocked — refused because the device is in enforcement mode{8F9CB695-5D48-48D6-A329-7202B44607E3}
⚠ Gotcha: filter on the Policy GUID, not just the event ID. Events 3076 and 3077 are general Code Integrity audit and block events — App Control for Business policies, the vulnerable driver blocklist and Smart App Control all write the same IDs. Query 3076 on its own and you will get results that have nothing to do with the Windows Driver Policy, then spend an afternoon chasing a driver that is not actually at risk.

The script below collects the audit events, extracts the driver name, product name and loading process from each event's XML, and de-duplicates. Point it at 3077 instead of 3076 on a device already in enforcement. It reads the event log and writes a CSV; it changes nothing.

Get-UntrustedKernelDrivers.ps1 — read-only
# Pick ONE of the two lines below. The event ID and the policy GUID are a
# matched pair - 3076 only ever carries the audit GUID, 3077 only ever carries
# the enforce GUID. Changing one without the other returns zero rows, which
# looks exactly like "no problems found". That false all-clear is the mistake
# to avoid here.

$EventId = 3076; $PolicyId = '784C4414-79F4-4C32-A6A5-F0FB42A51D0D'   # audited (audit mode)
# $EventId = 3077; $PolicyId = '8F9CB695-5D48-48D6-A329-7202B44607E3' # blocked (enforcement)

$events = Get-WinEvent -LogName 'Microsoft-Windows-CodeIntegrity/Operational' `
                       -FilterXPath "*[System[EventID=$EventId]]" -ErrorAction SilentlyContinue |
          Where-Object { $_.Message -like "*$PolicyId*" }

$results = $events | ForEach-Object {
    $data = ([xml]$_.ToXml()).Event.EventData.Data
    [PSCustomObject]@{
        TimeCreated   = $_.TimeCreated
        DriverName    = ($data | Where-Object { $_.Name -eq 'File Name'    }).'#text'
        ProductName   = ($data | Where-Object { $_.Name -eq 'ProductName'  }).'#text'
        ParentProcess = ($data | Where-Object { $_.Name -eq 'Process Name' }).'#text'
    }
}

$unique = $results | Select-Object DriverName, ProductName, ParentProcess -Unique |
                     Sort-Object DriverName

$unique | Format-Table -AutoSize -Wrap
$results | Export-Csv "$env:TEMP\untrusted-kernel-drivers.csv" -NoTypeInformation

# Print the number LAST, so a device with nothing wrong says so out loud
# instead of just printing nothing and leaving you unsure it ran.
"Affected drivers on this device: {0}" -f @($unique).Count

A device with something to worry about produces output like this. The ProductName column is usually what identifies the culprit to a human — the driver filename on its own is frequently meaningless.

output — three drivers at risk on this device
DriverName        ProductName                        ParentProcess
----------        -----------                        -------------
dongle-lm.sys     Vendor Licence Manager               \Device\HarddiskVolume3\Windows\System32\services.exe
legacyscan.sys    Vendor Document Capture Suite        \Device\HarddiskVolume3\Program Files\Vendor\scan.exe
oldvirt.sys       Vendor Virtualisation Platform       \Device\HarddiskVolume3\Windows\System32\services.exe

Affected drivers on this device: 3
CSV written to C:\Users\admin\AppData\Local\Temp\untrusted-kernel-drivers.csv
✅ Tip: run this fleet-wide now, as an Intune device script or a proactive remediation detection script, and you convert an unpredictable future incident into a finite list of vendors to chase. It is read-only, needs no reboot, and works identically in audit and enforcement mode. This is the single highest-value thing in this post: the information you need is already sitting in the event log on every device, months before anything breaks.

What a block looks like when it does happen

On a device that has reached enforcement, the refusal is recorded as Event ID 3077 with the enforcement policy's GUID in the Policy ID field, naming both the driver and the process that tried to load it.

⚠ Error — Event ID 3077
Log: Microsoft-Windows-CodeIntegrity/Operational
Message: Code Integrity determined that a process attempted to load a driver that did not meet the security requirements of the Windows Driver policy.
File Name: \Device\HarddiskVolume3\Windows\System32\drivers\legacyscan.sys
Process Name: \Device\HarddiskVolume3\Program Files\Vendor\scan.exe
Policy ID: {8F9CB695-5D48-48D6-A329-7202B44607E3}

The fix: get WHCP-signed drivers, and the two escape hatches

There is one correct answer and two escape hatches, and it is worth being blunt about the order of preference. The correct answer is a WHCP-signed driver. Both escape hatches trade security away, and one of them cannot be applied to a device that is already deployed.

The supported path: replace the driver

  1. Identify the driver from the Event 3076 or 3077 output above. You need the ProductName, not just the .sys filename, to work out which vendor to approach.
  2. Check Windows Update for a driver update. Many vendors have already WHCP-certified newer versions and shipped them through Windows Update, where they sit as optional driver updates rather than installing automatically.
  3. Check the vendor's own support page. A newer release is substantially more likely to be WHCP-signed, and this is often faster than the support-ticket route.
  4. Ask the vendor directly whether a WHCP-certified build exists and where to get it. Most vendors do certify; the problem is usually that your estate is pinned to an old version, not that no signed version exists.
  5. Deploy it through your normal driver channel and re-run the 3076 query to confirm the driver has dropped off the list.

The manual route to the optional driver updates, for a one-off check on a single device:

Settings › Windows Update › Advanced options › Optional updates › Driver updates
⚠ Warning — there is no per-driver exception. Microsoft is explicit that no mechanism exists to exempt an individual driver from the Windows Driver Policy. The choice is the whole feature on, or the whole feature off. If someone proposes "just allow that one driver", the honest answer is that the option does not exist — and turning the policy off to accommodate one legacy driver removes the kernel protection for every other driver on the machine at the same time.

Escape hatch 1: turn the policy off (and what you give up)

Microsoft documents this and simultaneously recommends against it, which is the right framing: it lowers the security posture of the device, and the supported fix is a signed driver. If you do need it as a temporary measure while a vendor catches up, the procedure depends on patch level.

Devices with the July 2026 update or later — an administrator can remove the enforcement policy without touching Secure Boot. The current session stays protected; the change takes effect after a restart.

Terminal (Admin) — July 2026 update or later
CiTool.exe --remove-policy {8F9CB695-5D48-48D6-A329-7202B44607E3}

# then restart the device to complete the change

Devices without the July 2026 update carry extra startup protection on the policy, and removal is considerably more invasive: you have to disable Secure Boot in UEFI, mount the EFI System Partition, delete the policy file from both the EFI partition and the Windows Code Integrity store, unmount, restart, and then go back into UEFI to re-enable Secure Boot.

Terminal (Admin) — pre-July 2026, Secure Boot already disabled in UEFI
mountvol S: /s

Remove-Item "S:\EFI\Microsoft\Boot\CiPolicies\Active\{8F9CB695-5D48-48D6-A329-7202B44607E3}.cip" -Force
Remove-Item "$env:windir\System32\CodeIntegrity\CiPolicies\Active\{8F9CB695-5D48-48D6-A329-7202B44607E3}.cip" -Force

mountvol S: /d

# restart, then re-enable Secure Boot in UEFI

If either Remove-Item reports that the file does not exist, that is expected on some devices — carry on with the remaining steps. Use a different drive letter if S: is already taken, and substitute it throughout.

⚠ Warning: the pre-July 2026 procedure leaves the device running with Secure Boot disabled between two reboots, and re-enabling it is a manual step at the end that is extremely easy to forget. A fleet left in that state has lost far more protection than the Windows Driver Policy ever provided. If you are considering this route at any scale, install the July 2026 update first and use the single CiTool command instead — and if a device must stay on an older build, track the Secure Boot state explicitly rather than trusting that someone went back into the firmware.

Escape hatch 2: App Control custom kernel signers, for drivers that cannot be certified

📋 Does this section apply to you? Almost certainly not, and it is fine to skip it. This is only for organisations that write their own kernel drivers and cannot send them to Microsoft — defence, classified or air-gapped environments, or in-house drivers built for internal use only. If every driver in your estate comes from a vendor, your answer is always "ask the vendor for a WHCP-signed build", and this section is not a route you need. It is included because for the small number of teams it does apply to, it is the only supported option and it has to be designed in before devices are built.

There is a legitimate case the WHCP route does not serve: organisations running classified, sensitive or air-gapped environments that cannot submit driver binaries to Microsoft, and organisations writing drivers purely for internal use that have no reason to certify for the public Windows ecosystem.

For these, Windows supports custom kernel signers — an App Control for Business policy, signed by an authority in the device's Secure Boot hierarchy, that extends kernel trust to your own PKI without WHCP signatures. The trust chain runs in layers:

LayerRole
Secure Boot PK or KEKRoot of trust, owned by you or the OEM. Cannot be changed without physical firmware access.
App Control policy signerSigns the policy binary. Must chain to an authority already in the Secure Boot PK or KEK database.
App Control policyLists the trusted kernel signers — your PKI, Windows, and optionally the WHCP signers. Deployed to the EFI System Partition.
Kernel Code IntegrityValidates every kernel driver at load time against that policy.

Availability and prerequisites, which are restrictive by design — the friction exists to keep the feature away from consumer devices:

⚠ Gotcha — this one is a deployment blocker, not a detail: custom kernel signers must be enabled during initial device setup, on a clean install. The feature will not enable on an already-running system. If you have in-house or confidential kernel drivers, this has to be designed into your build and imaging process before the devices are deployed — you cannot retrofit it onto an estate that is already out in the field, and discovering that after enforcement has started leaves you with no good options.
⚠ Warning — you can make a device unbootable. Once a signed App Control policy is deployed, it can only be updated by a new policy signed by the same authority. Removing the policy without a valid replacement causes Windows to fail to boot, and recovery requires physically entering UEFI to disable Secure Boot or alter firmware variables. On a remote or air-gapped fleet that means a site visit per device. Plan key management, key rotation and recovery procedures in full before the first policy is signed, and never let a single signing key become a single point of failure.

Where Intune and Group Policy fit — and where they do not

This is worth stating plainly, because it is the first question most endpoint engineers ask and the answer is unusual.

📋 Note — there is no CSP and no Group Policy setting for this. The Windows Driver Policy is not a manageable policy surface. There is no OMA-URI, no Settings Catalog entry, no administrative template, and no Intune report that tells you which mode a device is in or which drivers it has audited. It is a kernel Code Integrity behaviour that ships with the OS and manages its own state machine. The only supported controls are the local CiTool removal above and App Control custom kernel signers — and App Control policies themselves are deployable through Intune under Endpoint Security, but the custom kernel signers variant specifically requires the clean-install and Secure Boot key prerequisites, so Intune cannot enable it retroactively.

Practically, that means your visibility into this has to be built rather than configured: the Event ID 3076 query as a fleet-wide script, with the results collected somewhere you can read them. That is the gap this post exists to fill.

Proof it worked: what a clean device looks like

Two checks confirm a device is in good shape, and you want both — they answer different questions.

Check one: no drivers being audited or blocked. Re-run the query from Step 2. On a device with nothing at risk it returns nothing at all, which is the result you want and initially looks like the script failed.

after replacing the affected drivers
.\Get-UntrustedKernelDrivers.ps1

# ---------------- output ----------------
Affected drivers on this device: 0

# No 3076 events carrying the Windows Driver Policy audit GUID.
# Nothing on this device would be blocked by enforcement.

Check two: the device has reached enforcement. An empty audit list on a device still in evaluation mode is good but provisional — it tells you nothing is at risk right now. A device in enforcement mode with an empty block list is the finished state: the policy is live, and nothing on the machine is affected by it.

the finished state
# mode check from Step 1
ENFORCEMENT mode

# count of 3077 block events carrying {8F9CB695-...}
0

# Policy enforced, zero drivers blocked. Nothing further to do on this device.
✅ Tip: those two facts — current mode, and count of audited or blocked drivers — are the whole of what you need to report on this. A detection script returning just those two values, collected across the estate, gives you a single number for "devices with at-risk drivers" that you can actually take to a change board, and it shrinks to zero as vendors ship signed builds.

Quick reference: every GUID, event ID and path in one place

ItemValue
Audit policy GUID{784C4414-79F4-4C32-A6A5-F0FB42A51D0D}
Enforcement policy GUID{8F9CB695-5D48-48D6-A329-7202B44607E3}
Event logMicrosoft-Windows-CodeIntegrity/Operational
Event Viewer pathApplications and Services Logs › Microsoft › Windows › CodeIntegrity › Operational
Event ID 3076Driver audited — would be blocked, allowed because in audit mode
Event ID 3077Driver blocked under enforcement
Mode checkcitool -lp -json, then match PolicyID against the two GUIDs
Policy file (EFI partition)S:\EFI\Microsoft\Boot\CiPolicies\Active\{GUID}.cip after mountvol S: /s
Policy file (Windows)%windir%\System32\CodeIntegrity\CiPolicies\Active\{GUID}.cip
Remove enforcement (July 2026+)CiTool.exe --remove-policy {8F9CB695-5D48-48D6-A329-7202B44607E3}
In scopeWindows 11 24H2, 25H2, 26H1, 26H2 and later; Windows Server 2025 and later
Arrived inApril 2026 Windows update (evaluation mode), for 24H2, 25H2, 26H1 and Server 2025
Evaluation thresholds250 hours uptime + 3 restarts (2 on Server), zero violations; any violation resets both counters to zero
Per-driver exceptionNone. Not available.
Scope of effectKernel-mode drivers only. User-mode applications are unaffected.
After a reset or reinstallEvaluation starts over from zero

Glossary: the seven terms this topic depends on

TermWhat it means here
Kernel-mode driverCode that runs inside the Windows kernel with full access to memory and hardware. A fault or a malicious driver here compromises the entire machine, which is why signing matters so much more than it does for ordinary applications.
Code Integrity (CI)The Windows component that checks a driver's signature at load time and decides whether to allow it. The Windows Driver Policy is implemented as a CI policy.
Cross-signed root programThe retired scheme where third-party certificate authorities issued kernel driver signing certificates, with the private key held by the driver author. Deprecated 2021, all certificates expired, default trust now removed.
WHCPWindows Hardware Compatibility Program. Microsoft scans the submission for malware, vets the publisher, requires passing Hardware Lab Kit tests, and then signs the driver with a certificate Microsoft controls.
HLKHardware Lab Kit. The Microsoft test suite a driver must pass, per device category, before WHCP signing.
App Control for BusinessFormerly WDAC. The policy engine for controlling what code can run. Always able to be more restrictive than the default kernel policy; with a Secure Boot-signed policy it can also extend kernel trust to your own PKI.
Secure Boot PK / KEKPlatform Key and Key Exchange Key — the firmware-level keys that define who may authorise boot-time code. Whoever holds these controls the root of trust, and changing them needs physical firmware access.

Frequently asked questions

Is this a Windows 11 26H2 change?

No, and this is the most consequential misunderstanding available here. The policy shipped in the April 2026 update to Windows 11 24H2, 25H2, 26H1 and Windows Server 2025. 26H2 is simply the first release that has it built in rather than receiving it through servicing, and every release after 26H2 includes it too. If you are waiting for 26H2 to plan for this, it has already been running on your estate for months.

One thing that does not follow: a 26H2 device is not born enforcing. Because the policy is built in, it is switched on from first boot — but it switches on in evaluation mode, exactly like a 24H2 device that received it via servicing, and it has to earn its way to enforcement through the same 250-hour clock. A freshly-imaged 26H2 machine therefore starts with a full grace period, not with blocking enabled.

Why did a driver work for months and then suddenly get blocked?

Because the device finished its evaluation period. The policy logged that driver without blocking it for as long as the device was in audit mode, then transitioned to enforcement once it had accumulated 250 hours of uptime and 3 restarts with no violations. Nothing about the driver changed — the device's state did.

Can I allow one specific driver without disabling the feature?

No. Microsoft states there is currently no way to bypass the policy for an individual driver. Your options are the whole feature off, a WHCP-signed replacement driver, or — for confidential and internal-only drivers on devices built for it — App Control custom kernel signers.

Does this affect our applications, or only drivers?

Kernel-mode drivers only. User-mode applications are not in scope. The catch is that plenty of ordinary-looking applications install a kernel driver as part of their function — backup agents, USB licence dongles, virtualisation, disk and network tooling, some security products — and those applications will fail to start when their driver is refused.

Does it apply to Windows Server?

Yes — Windows Server 2025 and later. The uptime requirement is the same 250 hours, but only 2 restarts rather than 3.

It is tempting to assume servers get a longer grace period because they reboot rarely. The opposite is true. A server running 24/7 accumulates 250 hours of uptime in about 10 days, so uptime is never the constraint — the restart count is, and monthly patching satisfies 2 restarts inside two months. Audit your servers explicitly rather than assuming the client estate covers them.

What happens if we reimage or reset a device?

Evaluation starts again from zero — both counters reset and the device re-enters audit mode. A freshly-imaged machine therefore has roughly 250 hours of grace, which also means a reimage temporarily hides the problem rather than fixing it.

Is 100 hours or 250 hours correct?

250. The figure was originally announced as 100 hours in March 2026 and changed to 250 with the June 9 (6B) release; the announcement carries an editor's note recording the change and the current support documentation states 250. Microsoft's what's new in 26H2 page still says 100 hours and has not been updated.

References

Related reading on EndpointWeekly

Was this post helpful?
React below — no account needed
Share this post
LinkedIn X / Twitter Reddit Bluesky

More from EndpointWeekly

Security
ShieldCrash: What Admins Need to Know About the Microsoft…
ShieldBreak (CVE-2026-69414) is patched in September 2026. ShieldCrash is a new…
Security
CVE-2026-81963: The September 2026 Windows Update Stack…
CVE-2026-81963 is a Windows Update Stack elevation of privilege flaw rated 7.8 CVSS and…
Security
September 2026 Patch Tuesday — Complete CVE Reference
All 633 CVEs from September 2026 Patch Tuesday — searchable, filterable, with…