Microsoft is steadily moving a whole family of AI experiences over to usage-based billing, metered in a common currency called Copilot Credits. Cowork, advanced work in SharePoint and OneDrive, the Work IQ API, apps running on the Copilot Managed Runtime, Teams Phone Agent and Copilot Code all draw from the same credit pool. That is great for flexibility, because you pay for what you actually use instead of buying another per-user SKU. However, it also means your tenant now has a variable AI bill. Without a Copilot Credits spending policy in place, one enthusiastic department can quietly consume the budget for the entire organization.
The guardrail Microsoft gives you is the Copilot Credits spending policy, which you configure in the Cost Management dashboard in the Microsoft 365 admin center. In this post I will walk through how spending policies work and what actually happens when someone hits a limit. After that, I will describe a real-world case where a pilot rollout would have ended in a very awkward finance meeting without them.
The Cost management dashboard under Copilot in the Microsoft 365 admin center.
What consumes Copilot Credits?
Copilot Credits are the metering unit for eligible AI experiences enabled by usage-based billing. As of late October 2026, the services managed through the Microsoft 365 admin center include:
Cowork (Copilot license required)
Advanced work in SharePoint and OneDrive (Copilot license required)
Work IQ API for custom apps and agents
Copilot Managed Runtime (building apps consumes credits in the product where you build; running apps is governed separately in the admin center)
Teams Phone Agent
Copilot Code (Copilot license required)
Microsoft keeps adding services to this list, which is exactly why one specific policy setting matters more than any other – more on that below.
Note the boundaries, though. You manage Copilot Chat, SharePoint agents and the Copilot Retrieval API through the separate Copilot pay-as-you-go billing policies. Meanwhile, Copilot Studio agents have their own pay-as-you-go model, which you govern in the Power Platform admin center. So depending on your agent landscape you may be managing consumption in three different places. The Cost Management dashboard covers the Copilot Credits family, and that is what spending policies apply to.
How you pay: prepaid first, then pay-as-you-go
You can fund Copilot Credits in several ways and combine them:
Copilot Credit Pre-purchase Plan (P3) – buy credits up front
Prepaid capacity packs
Pay-as-you-go against a connected Azure subscription
The consumption order never changes: the system always burns prepaid credits first, whether they come from capacity packs or a pre-purchase plan. Only then does billing move to pay-as-you-go. This matters for forecasting, because your Azure invoice stays at zero until the prepaid pool is empty. Then it starts climbing. If nobody is watching the prepaid balance, the switch to pay-as-you-go is where the surprises live.
Anatomy of a Copilot Credits spending policy
Spending policies live under Microsoft 365 admin center > Copilot > Cost Management > Configuration. You activate a default spending policy during initial setup, and you can then create any number of additional policies. In short, each Copilot Credits spending policy is built from six parts:
The Configuration tab lists your spending policies and is where you add new ones.
1. Scope
A policy targets all users or specific groups. You can only target individual users and resource accounts through security groups, so plan your group design before you plan your policies.
Access scope: all users or specific security groups. Note the warning that the most permissive policy wins.
2. Agents and services
You pick which of the supported services the scoped users can access and bill against this policy. Here sits the single most important toggle in the whole feature: Auto-apply new services, which is on by default. When Microsoft adds a newly supported service or agent, it automatically joins every policy that has the toggle on. It is the same pattern we saw with Microsoft-managed Conditional Access policies: the default is on, and the review is on you. If you want to review new AI services before your users can burn credits on them, turn this off and accept the operational duty of reviewing new services manually.
Agents and services: the auto-apply toggle at the top is on by default.
3. Limits and alerts
You set a monthly spending limit for the policy as a whole (limited or unlimited), and optionally a monthly budget limit per user so a single person cannot drain the pool. In addition, the product enforces minimums. A per-user limit must be at least 2,000 credits per month, and the in-product guidance currently recommends 7,000 or higher based on industry usage trends. The wizard also calculates a policy-level minimum from the number of eligible users in scope. When users hit their limit, they lose access to the covered agents and services for the rest of the month, and credits reset on the first of the month. On top of the limits you configure threshold alerts: email notifications to admins and stakeholders at a chosen utilization percentage. Users also get separate notifications as they approach their own cap.
Policy-level limit: the wizard states the enforcement behavior and calculates a minimum and a recommendation from the number of users in scope.Per-user limits (minimum 2,000 credits, 7,000+ recommended) and the Define alerts toggle.
4. Model profiles
Currently these exist only for Cowork. They are reusable sets of model providers and models that control which models the experience may use. You must pick at least two models. You also decide whether Microsoft may substitute a comparable model during a model-specific outage.
5. Billing method
Global and Billing administrators can override the default billing method per policy – point one policy at capacity packs and another at a different Azure subscription. This is how you do departmental chargeback: marketing’s credits land on marketing’s subscription.
6. Review and create
The policy applies to scoped users immediately on creation.
Spending policy fine print that bites
Three behaviors are worth knowing before you design your first Copilot Credits spending policy:
Users in multiple policies do not get combined settings. If several policies cover a user for the same service, exactly one wins. First, the highest per-user limit decides. After that, the largest overall policy limit breaks the tie, and finally the most recently created policy wins. A user who hits their limit stays on their assigned policy – they do not fall through to the next one.
Moving groups does not reset consumption. If a user moves between Entra ID groups mid-month and lands under a different policy, their consumption history travels with them and counts against the new policy’s limit. Nobody gets a fresh allocation by hopping departments.
Deleting a policy does not delete limits elsewhere. A deleted policy simply stops limiting its users. If another policy covers them through group membership, that policy takes over. Prior consumption still counts for the current billing period.
There is also a Cost Management API in Microsoft Graph. With it, you can read spending policies and tenant and user-level credit consumption programmatically. That is useful for feeding a FinOps dashboard, though the API reports credits, not currency.
A case: the Cowork pilot that stayed on budget
A Danish organization I worked with – around 600 users, Microsoft 365 E3 with a few hundred Copilot licenses – wanted to pilot Cowork with 40 users across IT and one business unit. Finance had one condition after reading about usage-based billing: a hard monthly ceiling, in writing, before anything was enabled.
The spending policy design
Here is the design we landed on, and it maps one-to-one to the policy anatomy above:
Two security groups: one for the pilot users, one empty holding group documented as the way into the pilot. No direct user assignments anywhere.
Default spending policy locked down: the default policy that activates with usage-based billing was scoped so that users outside the pilot had no credit-consuming services enabled. The pilot policy was the only road to consumption.
Pilot policy: a Copilot Credits spending policy scoped to the pilot group, Cowork only, with Auto-apply new services turned off. The whole point of a pilot is a known scope; we did not want a newly supported service silently joining the policy mid-pilot.
Limits: a limited monthly budget for the policy sized to the finance-approved ceiling, plus a per-user monthly limit of 3,000 credits so no single user could consume the pilot’s entire pool.
Alerts: admin notifications at 50% and 80% of policy utilization to the IT operations mailbox and the finance controller, and user notifications at 80% of their personal cap.
Billing method: a dedicated Azure subscription for the pilot, so the invoice line was unambiguous and finance could see the exact cost without untangling it from other Azure spend.
What the pilot taught us
Three weeks in, the alerting proved its worth. One pilot user had discovered that Cowork was rather good at churning through a backlog of document comparisons. As a result, they single-handedly reached 80% of their personal cap. They got the user notification, the admins got nothing – because the policy as a whole was only at 40%. That is the system working as designed. The per-user limit contained the enthusiasm, the policy limit protected the budget, and nobody had to play AI police.
The second lesson came from the fine print. A pilot user transferred from the business unit to IT mid-month, which moved them between Entra groups. Their consumption carried over seamlessly, with no reset and no double allocation. That is exactly what you want. However, it is also something to explain up front, so nobody expects a fresh budget after a reorganization.
The pilot finished within the approved ceiling. When the organization later expanded Cowork, they kept the same pattern: one policy per department, departmental Azure subscriptions as billing methods, and Auto-apply new services off everywhere. The only exception is a sandbox policy scoped to IT, which deliberately keeps the toggle on so IT sees new services first.
My recommendations
Activate usage-based billing deliberately, not reactively. Design groups and policies before users ask for the features.
Decide on Auto-apply new services per policy. On for an IT sandbox policy, off for everything else, and put the review of newly supported services on a recurring operations task, the same way you track Message Center changes like the SMS and voice MFA retirement.
Always set per-user limits. The policy-level limit protects the budget; the per-user limit protects the user experience for everyone else.
Alert early and alert finance. 50% and 80% thresholds, and include the people who own the money, not just the admins.
Use billing methods for chargeback. One Azure subscription per department turns a governance argument into a line on an invoice.
Watch the prepaid-to-PAYG transition. Prepaid credits burn first and silently; the pay-as-you-go phase is where unmonitored cost lives.
A Copilot Credits spending policy will not make AI cheap, but it makes the cost predictable – and predictable is what gets AI projects approved.
On October 21, 2026, the PHP project shipped emergency security releases for two critical vulnerabilities in the PHP engine itself: CVE-2026-109618 and CVE-2026-109619, now widely known as PHP2Shell. Both can lead to unauthenticated remote code execution on a web server running PHP. Not in a plugin, not in a framework. In PHP.
The release was planned for later in the week, but details started leaking on October 20, so the PHP security team pulled it forward to October 21 at 14:00 UTC. The same day, Cloudflare said it was already seeing early attacks.
If you run WordPress, Drupal, Moodle, Nextcloud, a self-hosted portal or anything else on PHP, this one is not “next patch window” material. This post is the practical version: what the two flaws are, which setups are most exposed, how to find out whether your PHP is actually fixed (the version number can lie to you), how to patch and restart properly, and what to do if you can’t patch today.
I patched my own hosting server this evening, and I’ve included what that looked like, including the one thing that tripped me up.
Everything below is based on the PHP security advisories and vendor information as of October 21, 2026.
PHP2Shell at a glance
CVEs
CVE-2026-109618 (RCE via OOM corruption), CVE-2026-109619 (RCE via stale global state)
Severity
Critical. CVSS v4.0 9.2 for both (PHP security team). Vendors score differently, Red Hat rates it Important (CVSS v3.1 8.1)
Attack
Over the network, no authentication, no user interaction
Affected
PHP before 8.2.35, 8.3.36, 8.4.27 and 8.5.12. Older branches are affected too
8.1 and older get no official release. Source backport branches for 7.4, 8.0 and 8.1 exist, and some distros/LTS vendors backport
Most exposed
Apache with mod_php (full RCE validated). FrankenPHP likely exposed to CVE-2026-109618 by source analysis. PHP-FPM is exposed under specific conditions
Exploitation
Early attacks reported by Cloudflare on October 21
Restart needed
Yes. Patching the files on disk is not enough
What the two vulnerabilities actually are
You don’t need to understand the internals to patch, but it helps to understand why the advice is “update and restart”, and why configuration tricks only go so far.
CVE-2026-109618 – RCE via OOM corruption. When PHP runs out of memory, it aborts the current request by jumping straight out of whatever it was doing. In some places that happens while request memory is only partly initialized. Request shutdown can then read that half-initialized memory as if it were valid. The advisory describes several multipart form parsing paths that can push a request into out-of-memory while staying inside what look like normal PHP limits. The fix replaces that “jump out” on out-of-memory with a two-step approach: a soft limit that aborts gracefully at the next safe point, and a hard limit that simply exits the worker.
CVE-2026-109619 – RCE via stale global state. PHP keeps some global state (error, session, object and extension state) that can point into memory owned by a request. If a fatal error such as out-of-memory skips the reset, that state survives after the request memory is freed, and a later request on the same worker can use it. That is a use-after-free, and the advisory confirms it can lead to memory disclosure and full RCE.
The important part: an attacker can trigger this with crafted requests, unauthenticated and before your application code runs (the advisory notes it may take several attempts on a busy prefork server). So it does not matter how well your WordPress plugins are maintained.
Which setups are most exposed
The advisories are refreshingly specific about this. Short version:
Setup
Exposure according to the advisories
Apache + mod_php
Highest. Full RCE validated over HTTP with default memory and input limits on a normal prefork setup. CVE-2026-109619 also confirmed on mod_php
FrankenPHP
Likely susceptible to the application-independent attack (CVE-2026-109618), based on source analysis
PHP-FPM (Nginx or Apache in front)
Lower, but not safe. No complete FPM exploit demonstrated for CVE-2026-109618, but source analysis supports susceptibility. CVE-2026-109619 is confirmed on FPM through session upload progress, which is enabled by default
LiteSpeed (LSAPI)
Behaves like FPM. Application-specific exploits likely but not validated
php-cgi
Listed as affected in public reporting. Treat as exposed
So yes, FPM is “better” here. No, that is not a reason to wait. Patch everything that serves web requests.
The timeline
Date (2026)
What happened
October 20
CVE IDs start circulating. The PHP security team publishes a pre-announcement for a release on October 21
October 21, ~14:00 UTC
The two GitHub advisories go public (13:34 UTC), followed by PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35
October 21
Cloudflare reports early attacks and deploys WAF rules for known exploit vectors, available on all plans including free
October 21
Ubuntu publishes USN-8948-1 and USN-8948-2. Debian has fixed packages for bookworm and trixie. Check your own vendor for the rest
According to watchTowr, the original embargo date was October 22. It didn’t hold.
Step 1: Find every place you run PHP
The servers you know about are easy. The ones that bite you are the forgotten ones: the old intranet box, the marketing site an agency set up, the monitoring tool with a PHP web UI, the container image nobody has rebuilt since spring.
On a Linux host:
# Is PHP installed, and which version is the CLI?
php -v
# Which PHP packages are installed (Debian/Ubuntu)
dpkg -l 'php*' | grep '^ii'
# Which PHP packages are installed (RHEL/Alma/Rocky)
rpm -qa 'php*'
# How is PHP served? mod_php shows up as an Apache module
apache2ctl -M 2>/dev/null | grep -i php # Debian/Ubuntu
httpd -M 2>/dev/null | grep -i php # RHEL family
# FPM, LiteSpeed or FrankenPHP running?
systemctl list-units --type=service | grep -Ei 'php|fpm|lsws|litespeed|frankenphp'
If you have a vulnerability scanner, use it as a second opinion, not as your inventory. And don’t forget containers: a patched host does nothing for a container image with its own PHP inside.
Step 2: Check whether your PHP is actually fixed
This is where people get it wrong. If you use distribution packages, php -v does not tell you whether you are patched.
Distributions backport the fix into the PHP version they shipped, and the upstream version number stays the same. On Ubuntu 24.04, for example, the fixed package is 8.3.6-0ubuntu0.24.04.13. php -v still says PHP 8.3.6 before and after the update. If you compare that against “fixed in 8.3.36”, you’ll conclude you are vulnerable forever, or worse, that you can’t do anything until you upgrade PHP.
What to check instead is the package version against your vendor’s advisory:
Distribution
Package
Fixed version
Ubuntu 24.04 LTS
php8.3
8.3.6-0ubuntu0.24.04.13
Ubuntu 22.04 LTS
php8.1
8.1.2-1ubuntu2.28
Ubuntu 20.04 LTS
php7.4
7.4.3-4ubuntu2.29+esm5 (Ubuntu Pro)
Ubuntu 26.04 LTS
php8.5
8.5.4-0ubuntu1.5
Debian 13 (trixie)
php8.4
8.4.27-1~deb13u1 (DSA-6574-1)
Debian 12 (bookworm)
php8.2
8.2.35-1~deb12u1 (DLA-4848-1)
For RHEL and its rebuilds, check the Red Hat CVE page for your PHP module stream. At the time of writing it did not list a fixed package yet.
The quickest proof is the package changelog. If the CVE numbers are in it, the fix is in it:
# Debian/Ubuntu - is an update available, and from where?
sudo apt-get update
apt-cache policy php8.3-fpm php8.3-common # adjust to your PHP version
# Debian/Ubuntu - does the CANDIDATE package mention the CVEs? (may 404 right after a release)
apt-get changelog php8.3-common | grep -m3 -E 'CVE-2026-10961[89]'
# Fallback that always works: pull the .deb and read its changelog without installing
cd /tmp && apt-get download php8.3-common
dpkg-deb --fsys-tarfile php8.3-common_*.deb | tar -xO ./usr/share/doc/php8.3-common/changelog.Debian.gz | zcat | head -20
# After installing: the local changelog
zgrep -m3 -E 'CVE-2026-10961[89]' /usr/share/doc/php8.3-common/changelog.Debian.gz
# RHEL family - after updating
# If nothing matches, compare the package version against the RHSA for your module stream instead
rpm -q --changelog php-common | grep -m3 -E 'CVE-2026-10961[89]'
If you install PHP from a third-party repository, check that repository specifically. At the time of the release, the popular Remi repository for RHEL had no updated packages yet, and the advice was to switch to distribution packages or build from source.
If you build PHP yourself or use the official builds, it is simple: you need 8.5.12, 8.4.27, 8.3.36 or 8.2.35 or newer.
Step 3: Patch
On Debian or Ubuntu, update only the PHP packages that are actually installed:
The *php8.3* pattern also catches libapache2-mod-php8.3 (mod_php) and libphp8.3-embed, which php8.3-* would miss.
That ii filter is not decoration. When I patched my own server, my first attempt simply passed every package name matching the pattern to apt. That list included php8.3-json, which is known to dpkg but not installed and has no candidate on Ubuntu 24.04. apt refused the whole transaction with E: Package 'php8.3-json' has no installation candidate, and nothing was upgraded. If I hadn’t checked the package versions afterwards, I would have walked away thinking I was patched.
On the RHEL family:
sudo dnf update 'php*'
On Windows with IIS, stop the application pools (or IIS) first, because running php-cgi.exe processes lock the DLLs, then replace the PHP folder with the fixed build for your branch from windows.php.net and start the pools again.
For WordPress on managed hosting: you can’t patch PHP yourself. Check your host’s status page or ask them directly whether the PHP version your site uses has the fix. “We use PHP 8.3” is not an answer.
Step 4: Restart every PHP process
Updated files on disk do nothing for PHP processes that are already running. They keep the old, vulnerable code in memory until they are restarted.
# PHP-FPM (adjust the version)
sudo systemctl restart php8.3-fpm # Debian/Ubuntu; "php-fpm" on the RHEL family
# Apache with mod_php: PHP lives inside Apache, so restart Apache
sudo systemctl restart apache2 # or httpd on RHEL
# Apache in front of FPM: Apache itself did not change, a reload is optional
sudo systemctl reload apache2
Don’t forget the long-running PHP processes that aren’t web servers: queue workers, Laravel Horizon or Octane, Supervisor-managed workers, Swoole/RoadRunner/FrankenPHP worker mode. And containers need a rebuilt image and a redeploy, not just a restart.
Step 5: Verify
“I ran the update” is not verification. Check these three things:
# 1. Every installed PHP package is on the fixed version
dpkg-query -W -f='${db:Status-Abbrev} ${Package} ${Version}\n' '*php8.3*' | awk '$1=="ii"'
# 2. No PHP process is older than the patch
ps -eo pid,lstart,cmd | grep -E 'php|apache2|httpd' | grep -v grep
# 3. FPM started cleanly
sudo journalctl -u php8.3-fpm --since -15min --no-pager | tail # php-fpm on RHEL
Then test the sites from the outside. A 200 on the front page and a working login is the minimum.
One note: extension packages that come from a different source package than PHP itself (for example php8.3-imagick on Ubuntu) keep their own version number. That’s expected. The fix is in the PHP engine packages (common, cli, fpm, opcache and so on).
Step 6: If you can’t patch today
Be honest about this part: updating is the only complete fix. PHP’s own developers have said so publicly, and both advisories say it explicitly. The settings below reduce risk while you get the update in. They don’t replace it.
Put a WAF in front. If the site is behind Cloudflare, the WAF rules for known exploit vectors are available on all plans, including free. It is a stopgap and only covers traffic that actually goes through Cloudflare, so make sure the origin isn’t reachable directly.
For CVE-2026-109618 (OOM corruption):
– Set memory_limit=-1 administratively, so the application can’t override it. In an FPM pool that is php_admin_value[memory_limit] = -1; with mod_php use php_admin_value in the Apache config. Restart all workers and check that nothing restores a finite limit.
– Because unlimited PHP memory is a denial-of-service risk on its own, keep post_max_size conservative (8M, or 32M if you need uploads), keep upload_max_filesize below it, and enforce request size limits at the web server or proxy. A container or cgroup memory limit is a partial alternative.
– If the application doesn’t use multipart form data, block multipart requests at the frontend.
– Do not use RLIMIT_AS or RLIMIT_DATA. The advisory warns they make the underlying allocation fail, which brings back the vulnerable code path.
For CVE-2026-109619 (stale global state):
– Set session.upload_progress.enabled=0 administratively (php.ini, FPM pool or server config, not ini_set() or .user.ini) and restart every worker. If you don’t use upload progress, the advisory suggests keeping it off even after patching.
– On PHP 8.5, also set fatal_error_backtraces=0 administratively.
– Turning off display_errors, lowering error_reporting or using @ does not help. php.net says so explicitly.
– Consider pm.max_requests=1 in FPM if you can afford the performance hit. It limits what one request can leave behind for the next.
And if none of that is possible: CERT-EU advised isolating internet-facing PHP applications from public networks until they are fixed, and the UK NCSC says to consider taking a system offline if you can neither patch it nor apply the interim mitigations. That’s an uncomfortable conversation, but a shorter one than the incident report.
What it looked like on my own server
My hosting server runs Ubuntu 24.04 with Apache in front of PHP-FPM, behind Cloudflare. No mod_php, so not the worst case, but FPM with session upload progress on by default is still in scope.
Checked what was installed: PHP 8.3.6 from the Ubuntu archive, package 8.3.6-0ubuntu0.24.04.12, and apt-cache policy showed .13 available from noble-security.
Proved the fix before installing: downloaded php8.3-common and read its changelog. The first entry: SECURITY UPDATE: Remote RCE via state corruption issue – CVE-2026-109618_109619.patch.
Patched: the first run did nothing because of the php8.3-json issue above. The second run, with only installed packages, upgraded 13 packages.
Restarted:php-fpm8.3 -t to test the config, restarted FPM, reloaded Apache.
Verified: all engine packages on .13, no PHP process older than the restart, clean FPM log, and every site returned 200 from the outside.
About ten minutes of actual work. The checking took longer than the patching, and that is how it should be.
PHP2Shell checklist
☐ Inventory every host and container that runs PHP, including the forgotten ones
☐ Note how PHP is served: mod_php, FPM, LiteSpeed, FrankenPHP, CGI
☐ Check the installed package version against your vendor’s advisory, not php -v
☐ Confirm the CVEs appear in the package changelog
☐ Patch, and confirm apt/dnf actually upgraded something
☐ Verify: package versions, process start times, logs, sites from the outside
☐ Managed hosting: get a written answer from your host
☐ Can’t patch: WAF, memory_limit and upload progress mitigations, or take it offline
☐ Plan the upgrade off any PHP branch that is end-of-life
Quick answers to the questions everyone asks
php -v says 8.3.6. Am I vulnerable?
Not necessarily. If PHP comes from your distribution, check the package version and changelog. Ubuntu’s fixed package for 24.04 is still PHP 8.3.6.
I run PHP-FPM, not mod_php. Can I wait?
No. FPM is less exposed to CVE-2026-109618, but CVE-2026-109619 is confirmed on FPM through session upload progress, which is on by default.
My WordPress site is fully updated. Am I safe?
No. This is in PHP itself and can be triggered before WordPress code runs. Your plugins don’t matter here.
We’re on PHP 7.4 or 8.1. Is there a fix?
No official PHP release. Ubuntu, Debian and other LTS vendors have backports for the versions they ship, and the PHP security team published minimal source backport branches for 7.4, 8.0 and 8.1. The real answer is to get off end-of-life PHP.
Is a restart really necessary?
Yes. Running PHP processes keep the vulnerable code in memory until they are restarted.
Is there a public exploit?
A working exploit chain has been demonstrated, and code claiming to exploit it is circulating. Don’t run random exploit code from the internet to “test” your servers; unverified exploit code is a well-known way to deliver malware.
Is it in CISA KEV?
Not at the time of writing. Don’t wait for it.
My recommended plan, condensed
Today: Inventory PHP (Step 1). Patch and restart every internet-facing PHP host, starting with anything on mod_php (Steps 3-4). Verify (Step 5).
If something can’t be patched today: WAF plus the mitigations in Step 6, or take it offline.
This week: Internal PHP hosts, containers and managed hosting. Get confirmation in writing from hosting providers.
After: Put memory_limit back to a real value if you set it to -1 as a stopgap (the patched engine now has a soft OOM plus a hard OOM that exits the worker, so a finite limit is the intended state again). Disable session upload progress where you don’t use it, and put a date on moving off end-of-life PHP branches.
PHP2Shell is about as bad as it gets for a web platform: unauthenticated, before your application code runs, in a runtime that powers most of the web, with early attacks seen on release day.
The good news is that the fix is boring. Update the packages, restart the processes, and verify that both actually happened. The traps are the details: a version number that doesn’t change on distro packages, an apt run that silently does nothing, workers that keep running old code, and the server nobody remembered was there.
Spend the hour today. And if you want a second pair of eyes on your hosting setup, from a quick check of this one patch to a full hardening review, you know where to find me.
On October 14, 2026, Microsoft published MC1507808 in the Microsoft 365 Message Center: “Reminder: Microsoft-managed CA policy will be enforced soon – Require risk remediation for high-risk users”. Microsoft has already created a Conditional Access policy and a matching security group in your tenant. The policy has been running in Report-only for 30 days, and if you do nothing, it switches to On the week of October 28, 2026.
That is less than two weeks away. And it lands only four weeks after the legacy user risk and sign-in risk policies in Entra ID Protection were retired on October 1, 2026, so a lot of tenants are going into this with no user risk policy in force at all, without anyone having noticed.
The questions are always the same when Microsoft switches something on in a tenant: What exactly happens, and to whom? Will someone be locked out? Should we let it happen or take control ourselves? This post is the practical version: what the policy actually does, what your users will experience (with examples), how to find out who is affected, and the steps to take before October 28.
Everything below is based on the Message Center post and Microsoft Learn documentation as of October 15, 2026.
MC1507808 at a glance
Message Center ID
MC1507808, published October 14, 2026
Policy name
“Require risk remediation for high-risk users” in MC1507808, listed as “Require remediation for high-risk users” on Microsoft Learn. Check the exact name in your tenant
Current state
Report-only, 30-day evaluation period ending
Enforcement
Week of October 28, 2026. Automatically set to On unless you set it to On or Off yourself
Who is in scope
Tenants with Microsoft Entra ID P2 (included in Microsoft 365 E5 and EMS E5)
A new security group created by Microsoft together with the policy
Not covered
Sign-in risk. Guests and external users are not supported by the control. Your existing CA policies and exclusions are not changed
Why Microsoft is doing this
User risk is Entra ID Protection’s estimate of how likely it is that an account is compromised: leaked credentials found on the dark web, password spray hits, anomalous tokens, threat intelligence matches. A high user risk without a policy attached to it is just a line in a report that nobody reads until after the incident.
For years, the standard answer was a user risk policy with Require password change. That has two problems in 2026:
The legacy risk policies configured inside ID Protection are retired as of October 1, 2026. If you never migrated them to Conditional Access, don’t count on them protecting you anymore.
Require password change does nothing useful for a user who signs in with a passkey or Windows Hello for Business. There is no password to change, and the risk often isn’t about a password in the first place.
The Microsoft-managed policy closes both gaps: it puts a user risk policy into every eligible tenant, and it uses the newer Require risk remediation control, which works for password and passwordless users alike.
The timeline: dates you need in your calendar
Date
What happens
October 1, 2026
Legacy user risk and sign-in risk policies in ID Protection are retired
Start of the 30-day evaluation
Microsoft creates the policy + security group in Report-only (check the creation date in your own tenant, see Step 1)
October 14, 2026
MC1507808 reminder published
Week of October 28, 2026
Policy switches to On if still in Report-only
What actually changes in your tenant
When the policy is On, a user in the scoping group who reaches high user risk is interrupted at sign-in and has to remediate. What “remediate” means depends on how the user signs in and on the threat observed. That is the “adaptive” part:
Scenario
What ID Protection does
Password user with an active risk detection such as leaked credentials, password spray or session history involving a compromised password
User does MFA, then a secure password change. Previous sessions are revoked.
Passwordless user with an active risk detection that doesn’t involve a compromised password, such as anomalous token, impossible travel or unfamiliar sign-in properties
User’s sessions are revoked and the user must sign in again. Risk is remediated after the successful sign-in.
Attacker-added device (flagged by Microsoft threat intelligence)
The Entra device object is disabled, sessions are revoked, and the user must sign in again.
Note for password users: Microsoft documents that token theft related detections (anomalous token, attacker in the middle, verified threat actor IP and similar) require a secure password change plus MFA to clear the risk. Don’t expect a password user to get away with “just sign in again”.
Two controls are added to the policy automatically: Require authentication strength and Sign-in frequency – Every time. That is what forces a strong reauthentication right after the session revocation.
What it does not do:
It remediates user risk, not sign-in risk. Sign-in risk is covered by a different managed policy (Multifactor authentication and reauthentication for risky sign-ins) or your own.
Require risk remediation is not supported for guests and external users, because Entra ID can’t revoke their sessions. Check that the Microsoft-created group contains no guests.
It does not change your existing Conditional Access policies or their exclusions.
Examples: what your users will actually experience
Tables are nice, but helpdesk tickets come from people. Here is how this plays out for five typical accounts once the policy is On.
Example 1: Anna, password user, leaked credentials Anna’s username and password show up in a credential dump. ID Protection raises her user risk to High. Next time she opens Outlook, she gets an MFA prompt, then a “Password change is required” screen. She sets a new password, her old sessions on her phone and laptop are revoked, and she signs in again. Risk state: Remediated. No ticket, if Anna is registered for MFA.
Example 2: Peter, passkey user, anomalous token Peter signs in with a passkey and never uses a password. ID Protection detects an anomalous token for his account. The old Require password change control would have been pointless here. With Require risk remediation, Peter’s sessions are revoked and he is asked to sign in again with a method that meets the authentication strength. He might say “I had to sign in twice”. That is by design: if an at-risk user has just signed in, they are prompted again, and the risk is remediated after the second sign-in.
Example 3: Maria, high risk, no MFA registered Maria is in the scoping group, but has never registered an MFA method. She can’t do MFA, so she can’t do a secure password change. Result: Maria is blocked, and only an admin can get her back in. This is the scenario that creates Monday morning tickets, and it is the main reason to do Step 2 below.
Example 4: svc-scan, a service account that signs in interactively A scanner account with a password in a config file gets flagged as high risk. It can’t do MFA or change its own password. Result: blocked, and the scan-to-mail workflow stops. Exclude it now, and put it on the list of accounts that need a proper fix.
Example 5: Jonas, MSP technician from another tenant Jonas works in your tenant as a guest, and Require risk remediation is not supported for guests. But Microsoft documents the “high risk technician” scenario: if Jonas’s credentials leak and he becomes high risk in his home tenant, he is blocked from signing in to other tenants, and he can only self-remediate if his home tenant has the right risk policies. Otherwise an admin in his home tenant has to remediate. If you are the MSP, make sure your own tenant has self-remediation policies, or your technicians get blocked everywhere they work.
Browse to Entra ID > Conditional Access > Policies.
Look for the policy with remediation for high-risk users in the name. The Created by column says Microsoft, and the name starts with Microsoft-managed:. (MC1507808 calls it “Require risk remediation for high-risk users”, Microsoft Learn calls it “Require remediation for high-risk users”, so search for “remediation”.)
Microsoft-managed policies show MICROSOFT in the Created by column. My own tenant has two of them (MFA for admins and MFA for per-user MFA users), but the MC1507808 risk remediation policy has not arrived here yet.
Or with Microsoft Graph PowerShell, which also shows you every other Microsoft-managed policy in the tenant:
enabledForReportingButNotEnforced means Report-only. enabled means On, disabled means Off.
If the policy isn’t there, your tenant isn’t in scope (yet). Community trackers report that this reminder has so far only been seen in education tenants, which may be licensing or a staged rollout. Check again next week rather than assuming you are skipped.
Step 2: Find out who is actually affected
Option A: The Policy impact tab
Open the policy and select Policy impact. This shows what the policy would have done during the Report-only period, even though it hasn’t enforced anything. It is the fastest way to answer “would this have hit anyone last month?”.
Option B: The Risky users report
Browse to ID Protection > Risky users and filter on Risk level: High and Risk state: At risk. These are the people who will be interrupted the moment the policy turns on.
ID Protection > Risky users. Filter on Risk level High and Risk state At risk to see exactly who the policy will interrupt.
Option C: Microsoft Graph PowerShell, if you want the full picture
This script lists the high-risk users and checks whether they are registered for MFA, which is exactly the difference between Example 1 (self-remediates) and Example 3 (blocked):
Connect-MgGraph -Scopes "IdentityRiskyUser.Read.All", "AuditLog.Read.All"
# Users that are high risk right now
$highRisk = Get-MgRiskyUser -All -Filter "riskLevel eq 'high' and riskState eq 'atRisk'"
# MFA registration status for each of them
$result = foreach ($u in $highRisk) {
$reg = Get-MgReportAuthenticationMethodUserRegistrationDetail -UserRegistrationDetailsId $u.Id -ErrorAction SilentlyContinue
[PSCustomObject]@{
UserPrincipalName = $u.UserPrincipalName
RiskLastUpdated = $u.RiskLastUpdatedDateTime
MfaRegistered = $reg.IsMfaRegistered
Methods = ($reg.MethodsRegistered -join ", ")
}
}
$result | Sort-Object MfaRegistered | Format-Table -AutoSize
Anyone with MfaRegistered = False on that list will be blocked, not remediated. Either get them registered this week, or remediate their risk manually now (see Step 6).
Also look at the members of the security group Microsoft created for the policy. Group membership is what defines the scope, and you are allowed to change it.
Step 3: Check your exclusions
Microsoft states that your existing exclusions are preserved. That is about your existing policies. Open this policy, go to Excluded identities, and verify:
Break-glass / emergency access accounts are excluded. Don’t assume, look.
Service accounts and shared accounts that sign in interactively are excluded (Example 4), and added to your list of accounts to replace with managed identities or workload identities.
So if Microsoft-managed: Block access for high-risk users (or your own block policy) is On for the same users, the block wins and the self-remediation never happens. Microsoft recommends assigning each user to only one of these policies. List every policy that uses user risk:
The Prefer header matters: riskRemediation is a newer enum value, and without the header Graph returns it as unknownFutureValue.
If you already have your own user risk policy with Require password change, this is a good moment to move it to Require risk remediation, especially if you have passwordless users (Example 2).
Step 5: Decide: let it turn on, own it, or turn it off
Option 1: Let it turn on
Fine if you have no user risk policy today and the result of Step 2 is clean. Even then, I would switch it to On yourself, on a day you choose, after telling the helpdesk. That way the change happens on your schedule, not in “the week of October 28”.
Option 2: Duplicate it and own it (my recommendation for most)
If you have a Conditional Access framework with naming standards and persona groups, a Microsoft-named policy scoped to a Microsoft-created group doesn’t belong in it. Use Duplicate, rename the copy to your standard, scope it to your own groups, keep Require risk remediation as the grant control, put it through your change process, and then set the Microsoft-managed original to Off.
You keep the protection, and the policy follows your rules. Microsoft-managed policies can’t be renamed or deleted, so Off is the end state for the original.
Option 3: Set it to Off
Only if you already have an equivalent or stronger user risk policy covering the same users. Document why, and what covers the risk instead. “It was new, so we turned it off” is not a security decision.
Step 6: Clean up current risk and tell the helpdesk
Before enforcement, deal with the users from Step 2 that are high risk today. In ID Protection > Risky users, per user:
Reset password (temporary password) if the risk is real and the user can’t self-remediate.
Confirm user compromised if your investigation says so, then revoke sessions and disable any suspicious devices.
Dismiss user risk if it is a false positive. Note that dismissing doesn’t change the password, so still talk to the user.
Then give the helpdesk three sentences:
A high-risk user will be asked to change their password, or simply to sign in again, sometimes twice. That is expected.
A user who can’t do MFA will be blocked and needs an admin to remediate the risk in ID Protection.
Guests and external users are not supported by this control, so a guest with a risk problem is handled in their home tenant.
Hybrid identities: what to check
For synced users, Microsoft’s documentation notes that eligible hybrid tenants have password hash sync enabled, so users can self-remediate with a secure password change after MFA. Verify that:
Password hash sync is actually running.
Password writeback is enabled. Microsoft’s risk policy guidance requires it for hybrid users, so a password changed in the cloud lands on-premises too.
If users change passwords on-premises (Ctrl-Alt-Delete), consider ID Protection > Settings > Allow on-premises password change to reset user risk. It is opt-in and requires password hash sync.
After enforcement: monitoring
Sign-in logs. In the sign-in log, open a sign-in and select the Conditional Access tab to see whether the policy applied. If you send sign-in logs to Log Analytics or Sentinel, this gives you the trend:
SigninLogs
| where TimeGenerated > ago(30d)
| mv-expand CAP = ConditionalAccessPolicies
| where tostring(CAP.displayName) has "remediation for high-risk"
| summarize Count = count() by Result = tostring(CAP.result), bin(TimeGenerated, 1d)
| order by TimeGenerated asc
During Report-only, look for reportOnlyInterrupted and reportOnlyFailure. After enforcement, failure means someone was stopped.
The remediation flow AppId. During remediation, Entra ID uses a dedicated flow for session revocation that is allowed through regardless of other Conditional Access policies (AppId 93625bc8-bfe2-437a-97e0-3d0060024faa in the public cloud). If you see it in the logs and wonder why your block policy didn’t catch it: that is why. Don’t try to block it.
Changes Microsoft makes to the policy. Microsoft can update managed policies, for example by adding newly eligible users. Those changes are logged with Microsoft Managed Policy Manager as the initiator:
https://graph.microsoft.com/v1.0/auditLogs/directoryAudits?$filter=initiatedBy/app/displayName eq 'Microsoft Managed Policy Manager' and category eq 'Policy'
MC1507808 checklist
☐ Policy found and current state noted (Step 1)
☐ Policy impact reviewed (Step 2, Option A)
☐ High-risk users listed and MFA registration checked (Step 2, Option C)
☐ Members of the Microsoft-created security group reviewed
☐ Break-glass accounts excluded and verified (Step 3)
☐ Interactive service accounts excluded and listed for replacement
☐ No conflicting Block policy on the same users (Step 4)
☐ Decision made: On / Duplicate and own / Off (Step 5)
☐ Current high-risk users remediated or dismissed (Step 6)
☐ Helpdesk informed
☐ Hybrid: password hash sync + writeback verified
Quick answers to the questions everyone asks
Will users be locked out? Only users who can’t complete MFA, and accounts that can’t do interactive sign-in. Everyone else self-remediates. That is why the MFA check in Step 2 matters more than anything else in this post.
Does it affect guests? Require risk remediation is not supported for external and guest users, because Entra ID can’t revoke their sessions. Make sure the Microsoft-created group contains no guests.
Does it change my existing Conditional Access policies? No. Microsoft states that existing CA settings and exclusions, including break-glass exclusions, are not changed.
Can I delete or rename the policy? No. You can change the state and the exclusions. Use Duplicate if you need more control.
We already have a user risk policy with Require password change. Do we need this? Not necessarily, but compare: Require risk remediation handles passwordless users and attacker-added devices; Require password change doesn’t. And watch precedence: if both apply to the same user, Require risk remediation wins.
What about sign-in risk? Not covered by this policy. Use Multifactor authentication and reauthentication for risky sign-ins or your own sign-in risk policy.
We don’t see the policy. Are we safe? You are not in scope yet. Check your licensing (Entra ID P2, for example through Microsoft 365 E5 or EMS E5) and check again. And if you had legacy ID Protection risk policies, remember they were retired on October 1, 2026, so the gap may already be there.
My recommended plan, condensed
Today: Find the policy (Step 1). Run the high-risk + MFA script (Step 2). Verify break-glass exclusions (Step 3).
This week: Check for conflicting block policies (Step 4). Clean up the users that are high risk today (Step 6). Decide: On, Duplicate and own, or Off.
Before October 28: Brief the helpdesk. If you are letting it turn on, switch it to On yourself on a day you choose.
After: Watch the sign-in logs for a couple of weeks and keep an eye on the audit log for changes made by Microsoft Managed Policy Manager.
MC1507808 is a good change. Adaptive risk remediation is the right control for a world where more and more users never type a password, and tenants that never migrated their legacy ID Protection policies may have lost their user risk coverage on October 1 without noticing.
But “Microsoft turns on a policy in your tenant” should never happen without someone having looked at it first. Spend an hour before October 28: find the policy, check who is high risk and whether they can do MFA, verify your exclusions, and then make the decision yourself instead of letting the calendar make it for you.
If you want help reviewing your Conditional Access and ID Protection setup, from a quick check of this one policy to a full CA framework, you know where to find me.
Update, 14 October 2026: Microsoft has not yet listed the KB5127648 802.1X PEAP authentication failure as a known issue on the Windows release health dashboard or in the KB article. Everything below is based on reproducible reports from administrators, Microsoft’s own NTLMv1 documentation and my own customer cases. I will update this post when Microsoft publishes an official statement.
The October 2026 Patch Tuesday update for Windows 11, KB5127648 (OS builds 26100.9711, 26200.9711 and 26300.9711 for 24H2, 25H2 and 26H2), was released on 13 October 2026. Within hours, administrators started reporting that domain-joined clients could no longer authenticate to WPA2-Enterprise Wi-Fi using 802.1X PEAP. Wired 802.1X PEAP is affected too. WPA2-Personal and WPA3-Personal networks keep working, which is why the problem often looks like “the Wi-Fi is broken at the office but fine at home”.
I got the first call from a customer this morning: “Clients suddenly refuse to connect to our Wi-Fi, and there were no problems yesterday.” That is the fingerprint of this issue. Here is what we know, how to confirm it on an affected device, and what you can do about it today.
Symptoms of the KB5127648 802.1X PEAP issue
Clients on Windows 11 24H2, 25H2 or 26H2 with KB5127648 installed fail to connect to WPA2-Enterprise (802.1X) Wi-Fi.
Wired 802.1X PEAP on Ethernet shows “Connected, not authenticated” and loops on a 600 second block timer.
Authentication starts but never completes. The request never reaches the RADIUS/NPS server, so there is nothing to find in the NPS log.
Both machine authentication and user authentication with “Use my Windows user account” fail. Manually typing DOMAIN\username and password in the Wi-Fi prompt has been reported to work.
Intel and Qualcomm Wi-Fi chipsets are both affected, so this is not a driver problem.
Uninstalling KB5127648 and rebooting restores connectivity. Reinstalling it breaks it again.
How to confirm it in Event Viewer
Open Event Viewer and go to Applications and Services Logs > Microsoft > Windows > WLAN-AutoConfig > Operational (or Wired-AutoConfig > Operational for Ethernet). On an affected device you will see this sequence:
Log
Event ID
Message
WLAN-AutoConfig
12011
Wireless 802.1X authentication started successfully (PEAP)
WLAN-AutoConfig
12014
Authentication restarted, reason: OneX Held State timeout
User uses saved credentials (the only EapHost event, no Schannel certificate errors)
If the root cause below is correct, you will also find Event ID 4025 in Microsoft-Windows-NTLM > Operational: “An attempt to use NTLMv1-derived credentials for Single Sign-On was blocked due to policy.” Before the update, the same device would have logged the audit-only Event ID 4024 instead.
The likely root cause: NTLMv1 SSO is now blocked by default
Late August 2025: Audit logging for NTLMv1 usage enabled on Windows 11 24H2 and newer.
November 2025: Rollout of the changes to Windows Server 2025.
October 2026: The default value of the BlockNtlmv1SSO registry key changes from Audit mode (0) to Enforce mode (1). This only takes effect if the key has not been deployed explicitly.
The same article names the exact scenario that breaks: remnants of NTLMv1 cryptography are still used “when using MS-CHAPv2 in a domain-joined environment”, and the examples given are “Wi-Fi, Ethernet, and VPN deployments using MS-CHAPv2 authentication”. PEAP with the MS-CHAPv2 inner method, which is what most password-based enterprise Wi-Fi still runs on, needs the NTLMv1-derived credential for single sign-on with the logged-on user or the machine account. When Enforce mode blocks that request, EAP fails locally with 0x80070285 before a single packet reaches your RADIUS server.
The KB5127648 article does not mention NTLM, 802.1X or PEAP at all, and Microsoft’s release notes said it was not aware of any new issues apart from a USB audio problem. So the causal link is inferred from the timeline and the fact that setting the key back to 0 fixes the problem. Treat it as very likely, not confirmed.
Workaround 1: Pause the update and uninstall it on affected devices
If you manage updates with Windows Autopatch, Intune update rings or WSUS, pause the October quality update now so it does not reach more devices. If you are mid-way through a 26H2 rollout, see my post on getting ready for Windows 11 26H2 with Autopatch for how the rings and pause controls fit together. On devices that are already broken, uninstall the update and reboot:
wusa /uninstall /kb:5127648
Keep in mind that this removes the October security fixes, and that the device needs a working network to receive anything from Intune. A device without Wi-Fi cannot download a remediation script, so plan for a wired connection, a phone hotspot or hands-on work.
Workaround 2: Set BlockNtlmv1SSO back to Audit mode
Several administrators have confirmed that explicitly deploying the registry value restores PEAP authentication while keeping KB5127648 installed. This is the approach Neowin and Windows Report describe:
0 (Audit): The request to generate NTLMv1 credentials for a logged-on user is audited but allowed. Event 4024 is logged.
1 (Enforce): The request is blocked and Event 4025 is logged. This is the new default after KB5127648.
Be honest with yourself about what this does: you are rolling back a security hardening that Microsoft has been announcing for over a year. It buys time, nothing more. One administrator in the Microsoft Q&A thread put it well: setting it to 0 “only bought us time”.
Deploying the value with Intune
There is no Settings Catalog entry or Policy CSP node for this value, so use a Remediation script (Devices > Scripts and remediations) or a PowerShell script. A minimal pair that is safe to run repeatedly:
Run it in the 64-bit PowerShell host, in system context, and target it at the devices that are not yet updated first. Devices that are already off the network will pick it up as soon as they get any connectivity.
The real fix: move from PEAP-MSCHAPv2 to EAP-TLS
Password-based PEAP-MSCHAPv2 has been on borrowed time for years. It depends on NTLM-era cryptography, it is vulnerable to credential relay if clients do not validate the server certificate strictly, and Microsoft is clearly moving toward blocking it. The durable answer is certificate-based EAP-TLS, which does not touch NTLM at all and is unaffected by this change.
Cloud-native tenants: Microsoft Cloud PKI in Intune Suite can issue device and user certificates via SCEP, and your NPS or cloud RADIUS validates them. No on-premises CA required.
Hybrid tenants with AD CS: Use your existing enterprise CA with an Intune Certificate Connector (SCEP or PKCS) and switch the NPS network policy to Microsoft: Smart Card or other certificate.
Either way: Push a new Wi-Fi profile from Intune with EAP-TLS, keep the PEAP SSID running in parallel until every device has a certificate, then retire it.
If you are also deploying Credential Guard (and you should be), note that Microsoft’s NTLMv1 article recommends it strongly. Credential Guard already blocks NTLMv1 and unconstrained delegation on its own, so a device with Credential Guard enabled is likely to have hit this wall earlier in testing.
What to tell your users and your helpdesk
Home Wi-Fi, hotspots and guest networks with a simple passphrase still work. Only the corporate 802.1X network is affected.
Typing the domain username and password manually in the Wi-Fi prompt is a usable emergency workaround for individual users.
Do not let users “reset network settings” or reinstall Wi-Fi drivers. It wastes time and changes nothing.
Windows 11 26H2 is generally available as of September 29, 2026. For most organizations running Windows Autopilot and Microsoft Intune, this is the calmest annual feature update in years: devices on 24H2 or 25H2 get a tiny enablement package and a single restart. But “calm” is not the same as “nothing to do”. There are lifecycle deadlines only weeks away, a new Windows 11 branch (26H1) that cannot take 26H2 at all, features that are now switched on by default for commercial devices, and a reporting stack that simply shows nothing if you have not flipped the right switches.
This post is the practical version: what Windows 11 26H2 actually is, what to do in Intune and Autopilot this week, what to be aware of before you press deploy, and how to report on the rollout so you can prove where every device is. All screenshots are from my own tenant, taken on release day.
If you want the Autopatch ring design and pilot-to-production exit criteria in more depth, I covered that earlier in Windows 11 26H2: Upgrade Paths, Autopatch & Pilot to Production. This post focuses on the GA release itself, Autopilot, Intune policy and reporting.
Windows 11 26H2 at a glance
General availability
September 29, 2026
Build
26300 (10.0.26300.x)
Delivery for 24H2 and 25H2
Enablement package (KB5121794), single restart
Delivery for 23H2 and Windows 10
Full feature update (media-based, several GB)
Windows 11 26H1 devices
Not eligible for 26H2 (different Windows core)
Servicing
36 months for Enterprise and Education, 24 months for Home and Pro
Hardware requirements
Unchanged from Windows 11 (TPM 2.0, UEFI Secure Boot, supported CPU)
Windows 11 24H2, 25H2 and 26H2 share one servicing branch. The code for most 26H2 features has already been delivered to your devices through the monthly cumulative updates, sitting dormant. The enablement package flips the version to 26H2, activates the features that were held back and resets the support clock. That is why Microsoft calls it a “predictable and low-disruption update”, and why app compatibility testing you already did on 24H2 or 25H2 largely carries forward.
Why you should not wait: the lifecycle dates that matter now
The most important reason to act on Windows 11 26H2 this month has nothing to do with new features. It is the support calendar:
Windows 11 24H2 Home and Pro reaches end of servicing on October 13, 2026. That is two weeks after 26H2 GA. Many small and mid-size businesses run Pro, often on Autopilot devices that shipped from the OEM with 24H2.
Windows 11 23H2 Enterprise and Education ends on November 11, 2026. These devices need a full feature update, not the enablement package.
Windows 11 24H2 Enterprise and Education is supported until October 13, 2027, and 25H2 Enterprise and Education until October 11, 2028.
If you have Pro devices on 24H2, 26H2 (or at minimum 25H2) needs to be on them before mid-October. The good news is that the enablement package makes that realistic even on a short timeline.
Step 1: Find out what you actually have
Before you create a single policy, get an honest inventory of Windows versions in the tenant. The quickest view is Devices > Windows > Windows devices with the OS version column visible. Build numbers map to versions like this:
Build
Version
Path to 26H2
10.0.19045
Windows 10 22H2
Full upgrade (hardware permitting)
10.0.22631
Windows 11 23H2
Full feature update
10.0.26100
Windows 11 24H2
Enablement package
10.0.26200
Windows 11 25H2
Enablement package
10.0.26300
Windows 11 26H2
Already there
10.0.28000
Windows 11 26H1
Not eligible, stays on the 26H1 path
My own tenant is a good example of why this matters. It is small, but it already contains three different stories: several 25H2 devices (26200) that will take the enablement package, one 23H2 device (22631) that needs a full upgrade, and one brand-new device on 26H1 (28000) that will never be offered 26H2.
Windows devices in Intune with the OS version column: 25H2 (26200), 23H2 (22631) and a 26H1 device (28000) in the same tenant.
For anything beyond a handful of devices, export the list or pull it with Microsoft Graph PowerShell and group by build:
Pay special attention to edition. A 24H2 device on Enterprise has another year of support; the same build on Pro runs out on October 13.
Step 2: Clean up your update rings before you deploy
Feature update policies and update rings work together, and the combination is where most “why is nothing happening?” tickets come from. Microsoft’s guidance is clear: when you use a feature update policy, set the feature update deferral period in the update ring that targets the same devices to 0 days. The feature update policy then controls which version the device gets and when. A ring that still defers feature updates can block or delay the version you are trying to deliver, and the device will report PolicyConflictDeferral in the failure report.
Update rings in my tenant: several rings still defer feature updates by 5 to 7 days. Set this to 0 days on rings that share devices with a feature update policy.
While you are in the rings, check three more things:
Paused rings. A ring that was paused during an incident and never resumed will stop 26H2 as effectively as a deferral (PolicyConflictPause).
Windows 10 leftovers. Rings and policies named for Windows 10 often still carry old settings. Windows 10 reached end of support on October 14, 2025, and any remaining devices need an upgrade plan or ESU.
Conflicting GPOs. On hybrid or co-managed devices, a WSUS or deferral GPO that still applies will fight the MDM policy. Confirm the Windows Update workload sits with Intune.
Step 3: Create the Windows 11 26H2 feature update policy
Go to Devices > Windows > Windows updates > Feature updates. On release day the tab already shows Autopatch update readiness tiles, and in my tenant a yellow banner that we will come back to in the reporting section. The Create menu now offers both a classic Feature Update Policy and an Autopatch multi-phase release.
The Feature updates tab with Autopatch update readiness and a warning that Windows diagnostic data features are not enabled.
Choose Feature Update Policy. Windows 11, version 26H2 is already the default in the Feature update to deploy list, alongside 25H2, 24H2 and 23H2. Note that 26H1 is not in the list: it is not a feature update target, it is a separate branch for specific new hardware.
Creating a feature update deployment: Windows 11, version 26H2 is available and selected by default on GA day.
Settings I recommend for the first wave:
Name: something that tells the next admin what it is, for example WIN-FU-26H2-Pilot.
Required vs. optional: use Make available to users as a required update for managed rollout. The optional setting is useful for a self-service early adopter group, but you give up control of timing.
Rollout options:As soon as possible for the pilot, Gradually for broad. Gradual rollout spreads offers across groups and days, which protects your network and your service desk.
Assignments: device groups, not user groups. Start with IT, then a pilot of 5 to 10 percent across hardware models and departments, then broad.
Two behaviors to keep in mind. First, a feature update policy is also a “stay here” instruction: devices targeted by an existing 24H2 or 25H2 policy will not move to 26H2 until you change or replace that policy. Search for old feature update policies before you wonder why nothing happens. Second, a device should be in exactly one feature update policy. If it lands in two, the failure report shows DeploymentConflict and only the first assigned deployment is effective. Use exclusions to keep pilot and broad groups mutually exclusive.
If you use Windows Autopatch, create an Autopatch multi-phase release instead and let the Test, First, Fast and Broad rings stagger 26H2 for you. Plan any group changes first: you cannot edit an Autopatch group while a feature update release is in progress for it.
What to do if you use Windows Autopilot
Autopilot does not install a new Windows version. It provisions whatever image the OEM put on the device, whether that is 24H2, 25H2 or eventually 26H2. What happens after enrollment is controlled by your update policies. That leads to a few concrete tasks.
Make sure new devices land in the 26H2 policy on day one
New hardware arriving this quarter will mostly ship with 24H2 or 25H2. If your broad 26H2 policy targets a static group that nobody updates, every new Autopilot device will be one version behind from its first boot, and new Pro devices on 24H2 are two weeks from end of servicing. Target the policy at the same dynamic or device preparation device group your Autopilot devices land in, for example a dynamic group on the Autopilot ZTDID attribute:
For Autopilot device preparation, the device group you configure in the device preparation policy works the same way. Because the eKB is only a restart, new devices move to 26H2 shortly after the user has signed in, without a long upgrade experience.
Know what happens during OOBE
The Enrollment Status Page setting Install Windows quality updates (might restart the device) installs the monthly quality update during OOBE. It does not install the 26H2 feature update, so your ESP timing does not change. The version move happens after provisioning, driven by the feature update policy. If you have customers or users who expect “the latest Windows” out of the box, that is the expectation to set.
Look at device association for Autopilot device preparation
Windows 11 26H2 brings device association for Windows Autopilot device preparation. It lets you identify trusted corporate devices before enrollment, which enables device-targeted policies, automatic corporate enrollment and more customization during OOBE. That closes one of the biggest gaps between device preparation and classic Autopilot profiles. It sits under Devices > Windows > Enrollment, right above the device preparation policies.
Windows enrollment in Intune: Windows Backup and Restore, Device association, Autopilot device preparation and classic Windows Autopilot.
Decide on Windows Backup and Restore
In 26H2, Windows settings backup is enabled by default for eligible commercial devices, and the first sign-in restore experience now also supports Microsoft Entra hybrid joined devices, Cloud PCs and multi-user environments. For device refresh with Autopilot this is genuinely useful: the user signs in on the new device and gets settings and their Microsoft Store app list back. Administrator-configured policies are still honored, so if your organization has decided against it, make that decision explicit with the Windows Backup and Restore enrollment setting and the settings catalog, rather than relying on a default that just changed.
Plan for 26H1 hardware
Windows 11 26H1 ships on specific new devices and runs on a different Windows core. Microsoft states that these devices cannot update to 26H2. For Autopilot this means you will enroll a growing number of devices with build 28000 that are newer than 26H2 by build number but are not “on 26H2”. Check anything that makes decisions based on OS version:
Compliance policies that use Valid operating system builds ranges, for example 10.0.26100 to 10.0.26300. A 28000 device falls outside and becomes noncompliant, which with Conditional Access means blocked.
Dynamic groups and assignment filters on deviceOSVersion or osVersion that use startsWith “10.0.26”.
Reports and dashboards that calculate “on latest version” by comparing strings.
Reset, wipe and reimaging
Autopilot Reset and a local wipe reinstall from the device’s current OS, so a device that has taken 26H2 stays on 26H2. If you still maintain a corporate image for reimaging before Autopilot, update it to 26H2 media so reimaged devices do not start their life on a version that is about to go out of support.
What to be aware of in Windows 11 26H2
Most of these changes are good news. They are listed here because each of them can surprise a user, a script or a service desk if you did not know it was coming.
Features that are now on by default for commercial devices
Some features were delivered earlier through monthly updates but held back on commercial devices by temporary enterprise feature control. 26H2 enables them by default: Windows settings backup, app-specific actions from the taskbar, and a set of File Explorer enhancements. Tell your service desk and update end-user documentation before the pilot, not after. Also resist using the AllowTemporaryEnterpriseFeatureControl policy to force dormant features on across production: it bypasses exactly the controlled validation that the enablement model gives you.
WMIC is gone
The WMI command-line tool (WMIC) is removed and is no longer available as a Feature on Demand on 24H2 and later. Search your Intune remediations, platform scripts, Win32 app install commands and detection scripts for wmic and replace it with Get-CimInstance. A detection script that silently fails will make a Win32 app show as “not installed” and trigger reinstall loops.
# Old
wmic bios get serialnumber
# New
(Get-CimInstance -ClassName Win32_BIOS).SerialNumber
Cross-signed drivers lose default trust
Windows changes how the kernel trusts third-party drivers. Default trust for the old cross-signed driver program is removed. Drivers from the Windows Hardware Compatibility Program and an allow list of trusted legacy drivers are still allowed. Windows audits driver compatibility for at least 100 hours and three restarts before enforcement kicks in, which is exactly the kind of delayed impact that slips past a two-day pilot. Include devices with old scanners, label printers, VPN clients, dongles and specialist lab or production hardware in your pilot, and keep them there long enough.
Hotpatch is on by default for eligible devices
My tenant shows an Hotpatch Enablement banner on the Windows updates page: eligible devices receive hotpatch updates automatically, unless you configured hotpatch yourself in a quality update policy or opt out. That fits well with 26H2, since a feature update restart moves the device to a new baseline and hotpatch keeps restarts down afterwards. Just make sure your change process knows that “patched” no longer always means “restarted”.
New security capabilities are off until you turn them on
Several of the most interesting 26H2 features for Intune admins are available but not enabled. They are worth a proof of concept once the rollout is stable:
Administrator protection: just-in-time elevation with profile separation instead of standing admin rights. Enable with Intune or Group Policy, and test together with Endpoint Privilege Management if you use it.
Built-in Sysmon: System Monitor is now part of Windows, logs to the Windows Event Log and supports your own configuration files. No more packaging Sysmon as a Win32 app.
Smart App Control can be turned on or off without a clean install.
Passkey plugin credential managers and Windows Hello Enhanced Sign-in Security with supported external fingerprint readers.
Post-quantum cryptography APIs (ML-KEM and ML-DSA) in CNG and .NET.
A more secure batch file processing mode that prevents batch files from changing during execution, useful for Application Control for Business policy authors.
Recovery features to configure deliberately
Point-in-time restore can roll a PC back to a recent restore point, including apps, settings and personal files. Quick machine recovery can run a one-time remediation scan, but stays off on domain-joined or enterprise-managed devices unless you enable it. Both are useful for the service desk, and both should be decisions in your baseline rather than something you discover during an incident. The new policy-based removal of preinstalled Microsoft apps also accepts additional MSIX or APPX package family names, which may let you retire a removal script or two.
What users will notice
The redesigned Start menu with a scrollable All section, category and grid views, a taskbar that can move to the top, left or right and a smaller taskbar option, File Explorer and Windows Search improvements, Multi-App Camera, and fewer restarts because Windows Update bundles eligible updates with the monthly security update. None of these need a policy on day one, but a short “what’s new” note to users saves tickets.
Reporting on Windows 11 26H2 in Intune
A rollout you cannot measure is a rollout you cannot finish. Intune has good built-in reporting for feature updates, but it depends on prerequisites that many tenants, including my own, do not have turned on.
Prerequisite: turn on Windows data
Go to Tenant administration > Connectors and tokens > Windows data and enable Enable features that require Windows diagnostic data in processor configuration. For the readiness and compatibility reports, also enable Windows license verification, which confirms you own eligible Windows Enterprise licensing. Devices must send at least Required diagnostic data, and the feature update wizard itself reminds you to enable Windows health monitoring with the Windows Update scope to get detailed device states and errors.
Connectors and tokens > Windows data. Both toggles are off in my tenant, which is why the reports below have nothing to show.
This is a tenant-wide decision with a privacy dimension, so involve whoever owns data processing in your organization. But if it stays off, you are deploying 26H2 blind. This is what the Windows Autopatch feature update report looks like without it:
Reports > Windows Autopatch > Windows feature updates: “Reports are not available” when the tenant prerequisites are missing.
Service-side data from Windows Update usually arrives within an hour. Client-side data is processed in batches and refreshes about every eight hours, and only after you configure data collection. Turn it on at least a few days before the pilot so you have a baseline.
Before the rollout: readiness and compatibility risks
Go to Reports > Windows updates > Reports. Six reports live here:
Reports > Windows updates > Reports: feature update, distribution, expedited, readiness, compatibility risks and driver reports.
Windows Feature Update Device Readiness Report: pick Windows 11 26H2 as target OS and get per-device readiness with system requirement, app, driver and other issues. Run it before you assign the broad policy.
Windows Feature Update Compatibility Risks Report: the same data turned around, grouped by app and driver, so you can see which single driver blocks 40 devices.
Windows Update Distribution Report: how many devices are on each quality update level. Useful because a device far behind on cumulative updates is also a device that tends to struggle with feature updates.
For 24H2 and 25H2 devices the readiness report should be mostly green, as they already run the shared code base. The real value is on 23H2 and Windows 10 devices, which take a full upgrade, and in finding devices that fail Windows 11 hardware requirements.
During the rollout: feature update report and failures
The Windows Feature Update Report (Reports > Windows updates > Reports) shows status per policy. Select your 26H2 policy, generate the report and filter by update status. Each device moves through states such as Offer received, Download start, Install complete, Restart required and finally Update installed. For an enablement package the whole journey is short, so devices stuck in Restart required for days tell you that users are not restarting, not that the update is broken.
The Feature update failures report (Devices > Monitor) is where you troubleshoot. These alerts are the ones I see most in real 26H2-style rollouts:
Alert
What it means
What to do
PolicyConflictDeferral
An update ring defers feature updates
Set feature deferral to 0 days on the ring
PolicyConflictPause
Updates are paused on the device
Resume the ring or remove the pause GPO
DeploymentConflict
Device is in more than one feature update policy
Fix group membership and exclusions
SafeguardHold
Microsoft is holding the update for a known issue
Look up the hold ID on Windows release health
IncompatibleServicingChannel
Device is on an Insider or preview channel
Move it to the retail (GA) channel
DeviceRegistrationInvalidGlobalDeviceId
Device cannot register with Windows Update
Make sure the Microsoft Account Sign-In Assistant service is not disabled
EndOfServiceApproaching
The current version is close to end of servicing
Prioritize these devices, typically 24H2 Pro and 23H2
The MSA service one deserves a special mention: many hardening baselines disable the Microsoft Account Sign-In Assistant to block consumer accounts, and that silently breaks Windows Update deployment service registration. Block consumer accounts with the account policy instead and leave the service running.
Proving the result: version counts over time
Management rarely asks “what is the update substate of device 4711”. They ask “how many are done”. Three ways to answer that:
Windows devices export or the Graph PowerShell snippet from step 1, run weekly and saved. Simple and works without any prerequisites.
Windows Autopatch reports if you deploy with Autopatch: feature update status per Autopatch group and ring.
Windows Update for Business reports in Log Analytics for trend lines and custom dashboards.
With Windows Update for Business reports enabled, a simple KQL query gives you the current version distribution across the fleet:
UCClient
| where TimeGenerated > ago(2d)
| summarize arg_max(TimeGenerated, *) by AzureADDeviceId
| summarize Devices = count() by OSVersion
| order by Devices desc
Pin it to an Azure workbook, add a line per week and you have the burn-down chart for the 26H2 project. Define your exit criteria up front, for example 95 percent of active devices on 26H2 within 30 days of broad deployment, with the remaining devices individually explained (offline, safeguard hold, 26H1 hardware, pending replacement).
A realistic Windows 11 26H2 rollout plan
For a typical Intune and Autopilot tenant, this is the plan I would run:
Week 0 (now): turn on Windows data and license verification. Inventory versions and editions. Fix ring deferrals, pauses and old feature update policies. Search scripts for WMIC.
Week 0 to 1: run the device readiness and compatibility risks reports for 26H2. Deploy 26H2 as soon as possible to IT devices.
Week 1: pilot group across all hardware models, including devices with legacy drivers. Prioritize 24H2 Pro devices because of the October 13 deadline.
Week 2 to 4: broad deployment with gradual rollout. Add the Autopilot device group so new hardware follows automatically. Start the full upgrade for 23H2 Enterprise devices, which end on November 11.
Week 4 onwards: work the failure report, chase the long tail, and start proof of concepts for Administrator protection, built-in Sysmon and point-in-time restore.
Windows 11 26H2 checklist for Intune and Autopilot
Inventory builds and editions; identify 24H2 Pro (Oct 13, 2026) and 23H2 Enterprise (Nov 11, 2026).
Set feature update deferral to 0 days on rings that share devices with feature update policies.
Replace or retarget existing 24H2 and 25H2 feature update policies.
Create a 26H2 feature update policy: IT, pilot, broad, with mutually exclusive groups.
Include your Autopilot or device preparation device group in the broad assignment.
Handle 26H1 (build 28000) devices in compliance ranges, dynamic groups and filters.
Decide explicitly on Windows settings backup and restore.
Remove WMIC from scripts and detection rules.
Keep legacy-driver devices in the pilot for more than 100 hours and three restarts.
Enable Windows data and Windows license verification for reporting.
Run readiness and compatibility risk reports before broad deployment.
Track Feature update failures and version counts weekly until exit criteria are met.
Frequently asked questions
Is Windows 11 26H2 a full upgrade?
Not for devices on Windows 11 24H2 or 25H2. They receive an enablement package (KB5121794) that activates 26H2 with a single restart. Devices on 23H2 or Windows 10 need a full feature update.
Does Windows Autopilot install Windows 11 26H2 during setup?
No. Autopilot provisions the OS version that is on the device. The Enrollment Status Page can install quality updates during OOBE, but the move to 26H2 happens after provisioning through your feature update policy or Autopatch release.
Can Windows 11 26H1 devices upgrade to 26H2?
No. 26H1 runs on a different Windows core and is not on the 24H2, 25H2 and 26H2 servicing branch. Microsoft will offer those devices their own future upgrade path.
Why are my Intune Windows update reports empty?
Most often because the Windows data connector is off. Enable features that require Windows diagnostic data in processor configuration and, for readiness reports, Windows license verification under Tenant administration > Connectors and tokens > Windows data. Then allow time for data to arrive.
How long is Windows 11 26H2 supported?
As an annual H2 release, 26H2 gets 36 months of servicing for Enterprise and Education and 24 months for Home and Pro, counted from GA.
Wrapping up
Windows 11 26H2 is the kind of release that rewards preparation over heroics. The update itself is a restart. The work is in the plumbing around it: rings that do not fight your feature update policy, Autopilot devices that are targeted from their first check-in, compliance rules that understand 26H1, scripts that do not depend on WMIC, and reporting that is switched on before you need it. Get those right this week and the October 13 deadline for 24H2 Pro becomes a non-event.
On July 13, 2026, Microsoft announced one of the biggest changes to authentication in Microsoft Entra ID in years: Microsoft-provided SMS and voice call authentication is being retired, and passkeys become the default authentication experience for everyone. If you still have users approving MFA with a text message or a phone call, this change lands in your tenant automatically – starting September 1, 2026, and finishing with a hard cutoff on February 1, 2027.
I have spent the last two weeks walking customers through what this actually means for them, and the same questions come up every time: What exactly happens to my tenant, and when? How do I find out who is affected? How do I get my users onto passkeys without melting the help desk? And – the question behind the question – what if I am not ready? Can I buy more time, and can I stop Microsoft from prompting my users to register new methods while I work out my plan?
This post is the playbook I wish I could just hand to every IT admin right now. We will cover:
The full retirement timeline and what changes automatically in your tenant
How to find every user who still relies on SMS or voice
How to move them to passkeys (or the Authenticator app) in a controlled way
How to extend the period if you need more time – the temporary opt-out and the customer-managed telecom provider option
How to suppress the registration prompts so your users are not nudged before you are ready
Lessons learned from real migrations, so you can skip the mistakes I have already made for you
Everything below is based on Microsoft’s official announcement and documentation as of late July 2026, plus hands-on testing in my own tenant. Where Microsoft has said “details coming later” I will say so explicitly, because a few important pieces (the opt-out API and the Security Store telecom catalog) are not published yet at the time of writing.
Why Microsoft is doing this
The short version: SMS and voice are the weakest links in the MFA chain, and attackers know it. Phone-based factors are vulnerable to SIM swapping, SS7 interception, social engineering of telecom support desks, and – increasingly – AI-assisted phishing that walks a user through approving a fraudulent prompt in real time. Microsoft’s own numbers have long shown that SMS is roughly 40% less effective at preventing compromise than the Authenticator app, and neither of them holds up against a well-built adversary-in-the-middle (AiTM) phishing kit. Passkeys do, because the credential is cryptographically bound to the site it was registered for – there is nothing for the user to type or approve on a fake page.
Microsoft has been signaling this direction for years: system-preferred MFA, the passkey registration campaign feature, mandatory MFA for Azure management, and the Secure Future Initiative. The July announcement is the point where the signaling stops and enforcement begins. SMS and voice are no longer positioned as secure authentication methods in Entra ID, and Microsoft will simply stop delivering them natively.
It is worth being clear about the scope: only Microsoft-provided SMS and voice delivery is being retired. Microsoft Authenticator (push and TOTP), hardware OATH tokens, FIDO2 security keys, Windows Hello for Business, certificate-based authentication, and external/third-party MFA methods are all unaffected. And SMS/voice as a concept does not disappear entirely – organizations with a genuine regulatory or operational need can keep it by bringing their own telecom provider through the Microsoft Security Store (more on that below).
The timeline – dates you need in your calendar
Here is the full sequence of events. I recommend literally putting these in your team calendar today.
Date
What happens
August 1, 2026
API support and documentation for the temporary opt-out becomes available. This lets you delay the September changes while you finish your migration (details below).
September 1, 2026
Users enabled for SMS or voice in the Authentication Methods Policy (or legacy per-user MFA settings) are automatically enabled for passkeys. Your registration campaign is set to Microsoft managed, targeting passkeys, and these users are pulled into scope. On their next MFA sign-in they are nudged to register a passkey (skippable, with unlimited snoozes by default).
September 7, 2026
(Related change) Self-service password reset only accepts authentication methods the user has actually registered.
September 18, 2026
Microsoft publishes the telecom provider options, terms, and pricing information in the Microsoft Security Store.
October 30, 2026
You can select and configure a customer-managed telecom provider through the Security Store if you need to keep SMS or voice.
February 1, 2027
Microsoft-provided SMS and voice delivery is retired. Users whose only MFA method is SMS or voice get a blocking passkey registration prompt at sign-in – no more skipping. There is no opt-out from this milestone. It applies to all tenants in the public cloud.
Two things stand out. First, the September 1 changes are automatic – if you do nothing, Microsoft changes your authentication methods policy and your registration campaign settings for you. Second, February 1, 2027 is a hard wall. The temporary opt-out only postpones the nudging, not the retirement itself. Every plan you make should work backwards from February 1.
Note that this timeline applies to the public cloud. Sovereign and government cloud environments follow a later schedule that Microsoft will communicate separately.
What actually changes in your tenant on September 1
This is the part most summaries gloss over, so let us be precise. If you have users enabled for SMS or voice on September 1, 2026, Microsoft will:
Auto-enable passkeys (FIDO2) in your Authentication Methods Policy for those users, placed in a passkey profile that allows all passkey types – synced passkeys (iCloud Keychain, Google Password Manager) as well as device-bound passkeys (Microsoft Authenticator, Entra passkey on Windows, hardware security keys).
Set your registration campaign to “Microsoft managed”, targeting passkeys. Under Microsoft managed, the snooze duration becomes one day, snoozes are unlimited, and targeting expands to MFA-capable users. In practice: every time an affected user completes MFA (at most once per day), they see a “set up a passkey” interrupt they can skip.
Nudge users at their next MFA sign-in. The nudge is evaluated per device-and-browser combination – a user with Windows Hello for Business will not be nudged on their Windows PC in Chrome or Edge, but the same user may be nudged when signing in from a Mac or a phone, because that credential does not travel with them.
If that is exactly what you want – great, you can lean back and let Microsoft drive registration for you. But in most organizations you will want to control the pacing, the communication, and the target method yourself. Everything below shows you how.
Step 1: Find out who is actually affected
Before you plan anything, get the numbers. “We use the Authenticator app” is what every IT manager tells me; the registration report almost always tells a different story – old accounts that registered a phone number in 2019, frontline workers, service-adjacent accounts, board members, external consultants.
Entra ID > Authentication methods > Policies – SMS and Voice call still enabled for All users.
Option A: Microsoft’s official analyzer script
Microsoft published a dedicated PowerShell script for exactly this purpose: the Entra SMS and Voice Usage Analyzer on GitHub. Run it with Global Reader, Security Reader, or Authentication Policy Administrator, and it reports which users are enabled for and actively using SMS or voice. Any non-zero result means your tenant is in scope for this whole exercise.
Option B: The user registration details report
In the portal: Entra ID > Authentication methods > User registration details. Filter on the registered methods column for Phone / Alternate phone / Office phone, and pay special attention to users whose default MFA method is a phone-based one. Note that this report requires a Microsoft Entra ID P1 license – in an unlicensed tenant the blade returns a 401, so fall back to the analyzer script or Graph below.
Option C: Microsoft Graph PowerShell, if you want it scriptable
Connect-MgGraph -Scopes "AuditLog.Read.All","UserAuthenticationMethod.Read.All"
# Pull registration details for all users
$details = Get-MgReportAuthenticationMethodUserRegistrationDetail -All
# Users with any phone-based method registered
$phoneUsers = $details | Where-Object {
$_.MethodsRegistered -match 'mobilePhone|alternateMobilePhone|officePhone'
}
# The high-risk subset: phone is their DEFAULT (or only) MFA method
$phoneDefault = $phoneUsers | Where-Object {
$_.DefaultMfaMethod -in @('mobilePhone','voiceMobile','voiceAlternateMobile','voiceOffice','sms')
}
$phoneOnly = $phoneUsers | Where-Object {
-not ($_.MethodsRegistered -match 'microsoftAuthenticator|passKey|windowsHelloForBusiness|fido2|softwareOneTimePasscode|hardwareOneTimePasscode')
}
$phoneUsers | Export-Csv .\phone-users-all.csv -NoTypeInformation
$phoneOnly | Export-Csv .\phone-users-ONLY-phone.csv -NoTypeInformation
"Any phone method: {0} | Phone as default: {1} | Phone as ONLY method: {2}" -f `
$phoneUsers.Count, $phoneDefault.Count, $phoneOnly.Count
The three buckets matter because they need different treatment:
Phone registered, but stronger methods too: lowest risk. These users just need their default flipped (system-preferred MFA usually handles this already) and eventually a passkey.
Phone as default: will notice the change. Needs communication.
Phone as the ONLY method: these are the users who hit the blocking registration prompt on February 1, 2027. This list is your migration backlog, sorted by priority.
While you are here, create a security group (for example SG-MFA-PhoneOnly-Migration) and fill it with the affected users. You will reuse it for the registration campaign scoping, for Conditional Access pilots, and for targeted communication.
Step 2: Decide where each user segment lands
Do not try to move everyone to the same method. In every migration I have run, the population splits into three or four segments:
Knowledge workers with a Windows PC or Mac: passkeys, full stop. Windows Hello for Business already covers the primary device for many; add a synced or Authenticator-based passkey for the phone and browser scenarios. No license cost, phishing-resistant, and it satisfies the February 2027 requirement.
Mobile-first users who already have Authenticator: passkey in Microsoft Authenticator. The app they already have becomes a device-bound passkey store. This is usually the smoothest single upgrade in the whole project.
Frontline and shared-device users: this is where you slow down and think. FIDO2 hardware keys work brilliantly for shared-PC scenarios. For users with no corporate phone and no personal-phone policy, hardware OATH tokens remain supported (they are not part of this retirement) – just remember they are not phishing-resistant, so treat them as transitional.
The genuinely stuck: regulated out-of-band SMS requirements, alarm and dispatch numbers, environments where smartphones are banned. This small segment is what the customer-managed telecom provider option exists for. Document the requirement (which regulation, which scenario) – you will want that paper trail anyway.
Synced versus device-bound passkeys deserves a sentence: synced passkeys (iCloud Keychain, Google Password Manager) are the most user-friendly and survive device loss, but the private key follows a consumer cloud account. Device-bound passkeys (Authenticator, security keys, Entra passkey on Windows) keep the credential on hardware you can reason about. Microsoft’s September auto-enablement allows all types; if your security team wants device-bound only, configure that in the passkey (FIDO2) policy yourself – and note that a restricted passkey profile changes the nudge behavior (see the suppression section below).
Step 3: Enable and configure passkeys properly
If you let the September 1 auto-enablement do this for you, passkeys arrive with an open, allow-everything profile. Doing it yourself first means you choose the settings – and you take the change out of Microsoft’s hands.
In the Entra admin center: Entra ID > Authentication methods > Policies > Passkey (FIDO2).
Passkey (FIDO2) settings – Enable and target with the default passkey profile.
The settings that matter:
Enable the method, targeting either all users or your migration group to start with.
Allow self-service set up: must be Yes, both for users to register from My Security Info and for the registration campaign nudge to work at all.
Enforce attestation: only if you have a real requirement – attestation-enforced profiles suppress the registration nudge, which may be exactly what you do not want during a migration.
Key restrictions / AAGUIDs: same caveat. If you restrict to specific security key models, the Microsoft managed campaign will not switch to passkey targeting automatically, and nudge behavior changes. Restrict deliberately, not by inherited habit.
Step 4: Run the registration campaign on your terms
The registration campaign (“nudge”) is the engine Microsoft will use in September – but you can start it earlier, scope it tighter, and pace it yourself. A campaign you run in August against a pilot group beats a Microsoft managed campaign that hits everyone in September.
In the portal: Entra ID > Authentication methods > Registration campaign.
Registration campaign – this tenant is already on Microsoft managed, targeting Passkey (FIDO2) with a 1-day snooze and unlimited snoozes.
Configuration that has worked well for me:
State: Enabled (not Microsoft managed – Enabled gives you control of every knob).
Target method: Passkey (FIDO2). Note you can only run one campaign at a time – passkeys or Authenticator, not both.
Include targets: your pilot group first, then the SG-MFA-PhoneOnly-Migration group in waves. Do not start with All users.
Days allowed to snooze: 3 or 7 during the soft phase. This is tenant-wide, not per group.
Limited number of snoozes: Disabled (unlimited) during the pilot; switch to Enabled (three skips, then required) when you move to enforcement mode. The snooze counter is tracked per user and survives configuration changes.
The same policy via Graph, if you prefer infrastructure-as-code (permissions: Policy.ReadWrite.AuthenticationMethod):
A few behaviors worth knowing before your help desk finds out for you:
The nudge only appears after a successful interactive MFA – users inside an existing SSO session are not interrupted.
Conditional Access policies scoped to Register security information are evaluated first. If you restrict security info registration to compliant devices or trusted networks (and since July 6, 2026 these policies are enforced during Windows Hello for Business and macOS Platform SSO enrollment too), users outside those conditions silently do not get nudged. Plan for how those users will ever register.
Closing the browser counts as a snooze.
The passkey nudge checks whether the user has a local passkey for the current device-and-browser combination. Expect users to report “it keeps asking me even though I already did it” when they switch between PC, Mac, and phone. That is by design; put it in your FAQ.
Step 5: Communicate like the sign-in experience depends on it (it does)
Coordinated communication is the single biggest predictor of a smooth rollout – Microsoft says the same thing in their deployment guidance, and my experience agrees. The pattern that works:
Awareness (now to August): “SMS and phone-call MFA is being retired by Microsoft. Here is why, and here is what will replace it.” Scope it to the affected group – blasting the whole company about a change that only touches 15% of users creates noise and ticket volume for nothing.
Action (September onwards): step-by-step registration guides per device type – Windows Hello, iPhone/iCloud, Android/Google, Authenticator. Microsoft has ready-made end-user templates at aka.ms/mfatemplates that you can rebrand.
Reminder (November-January): targeted mails to the shrinking list of users who still have no phishing-resistant method, with a hard date. Pull the list from the same Graph report you used in step 1 and watch it trend toward zero.
Give the help desk a one-pager: what the nudge screen looks like, how to register each passkey type, what “Skip for now” does, and – critically – what changes on February 1, 2027, when skipping stops being an option.
Need more time? Your two extension options
Now for the part many of you scrolled here for. There are two legitimate ways to buy time, and they solve different problems. Neither of them moves the February 1, 2027 wall.
Option 1: The temporary opt-out (September 2026 to February 2027)
Microsoft is providing a temporary, tenant-level opt-out from the September 1 changes – the passkey auto-enablement and the automatic registration campaign switch. This is aimed at organizations that have a different plan (for example, migrating to a customer-managed telecom provider, rolling out hardware keys on their own schedule, or moving users to another method) and do not want Microsoft touching their authentication methods policy in the meantime.
What we know as of late July 2026:
The opt-out is exercised via API, and Microsoft publishes the API details and documentation on August 1, 2026. Keep an eye on the official retirement page – that is where it will land.
It delays the September 1 auto-enablement and nudging while you complete your transition activities.
It is temporary by design: it covers the September 1, 2026 through February 1, 2027 window. On February 1, enforcement applies to all tenants, opted out or not. Users whose only method is SMS or voice will face the blocking passkey registration prompt unless you have configured a telecom provider.
My advice: even if you plan to opt out, do it as a scheduling decision, not an avoidance decision. Opting out without a dated migration plan just moves your crunch from September to January.
Option 2: Keep SMS/voice with a customer-managed telecom provider
If you have a genuine regulatory or operational requirement for a telephony factor – out-of-band SMS mandated by a compliance regime, users in environments where nothing else works – you can continue using SMS and voice past February 2027 by contracting with a telecom provider through the Microsoft Security Store:
September 18, 2026: Microsoft publishes the provider catalog, terms, and pricing in the Security Store. Evaluate providers against your regional and compliance requirements.
October 30, 2026: configuration opens. You select a provider, stand up the contract through the marketplace flow, and wire it into your tenant.
Costs: this is the part to socialize with management early. Unlike today, where SMS delivery is bundled into your licensing, the customer-managed model is your contract with the carrier – typically per-message pricing that varies by provider, volume, and geography. Migrating users to passkeys costs nothing; keeping SMS becomes a line item.
Treat this as a scoped exception, not a tenant-wide strategy: identify the specific user segments with the documented need, put them on the customer-managed channel, and default everyone else to passkeys. Between the carrier cost, the audit questions, and the fact that SMS remains phishable, the economics push the same direction as the security argument.
One more planning note: test the provider flow with a pilot group well before February. You do not want to discover carrier delivery quirks in specific countries during the enforcement week.
Suppressing the registration prompts while you work out your plan
Maybe you are mid-negotiation with a telecom provider. Maybe your change advisory board meets quarterly. Maybe you simply do not want users seeing Microsoft-branded prompts before your communication has landed. Whatever the reason, here is how you keep the nudges away from your users – deliberately and reversibly.
The clean way: take your users out of scope before September 1
The September auto-enablement only targets users enabled for SMS or voice in the Authentication Methods Policy or legacy per-user MFA settings. If you migrate users to other methods and disable SMS/voice for them before September 1, there is nothing for Microsoft to auto-enable and nobody gets pulled into the Microsoft managed campaign. This is the option Microsoft itself points to, and it has the advantage of actually solving the problem rather than postponing it.
SMS settings – Enable and Target with group scoping and the Use for sign-in option.
The control way: set the registration campaign yourself
The registration campaign is a tenant setting, and your configuration is the control surface. To stop nudging entirely:
Portal: Entra ID > Authentication methods > Registration campaign > set State to Disabled > Save.
If you want the campaign running but need to shield specific populations – VIPs mid-quarter-close, a factory site with no phones, a business unit in the middle of a divestiture – use exclude targets instead of disabling the whole thing:
Exclusion wins over inclusion – a user in both lists is excluded. And remember the softer levers before you reach for Disabled: a long snooze duration (up to 14 days) with unlimited snoozes is a much gentler campaign than the Microsoft managed default of daily prompts.
The State dropdown is your control surface: Enabled, Disabled, or Microsoft managed.
What suppression does NOT do
Three honest caveats, because I have seen all three misunderstood already:
Disabling the campaign today does not prevent the September 1 change. Microsoft sets the campaign to Microsoft managed as part of the rollout. Expect to re-assert your configuration after September 1, or use the official opt-out API from August 1 – that is the supported mechanism for exactly this scenario.
Other setup prompts still exist. Security defaults, SSPR combined registration enforcement, and Conditional Access policies requiring MFA registration are separate mechanisms. The registration campaign switch only controls the passkey/Authenticator nudge.
Nothing suppresses February 1, 2027. The blocking prompt for SMS/voice-only users is enforced for all tenants. Microsoft has been unusually explicit: there is no opt-out from that milestone. Suppression buys you communication time; it does not buy your users a future with SMS codes.
Lock in the gains with authentication strengths
Once a user segment has registered passkeys, close the door behind them. A Conditional Access authentication strength policy requiring Phishing-resistant MFA for your most sensitive applications (or for privileged roles) ensures that a registered passkey is not just an option sitting next to a weaker method – it becomes the method that actually gets used. The built-in strengths cover the common cases:
Phishing-resistant MFA: passkeys (FIDO2), Windows Hello for Business, certificate-based authentication. This is the end state.
Passwordless MFA: the above plus Authenticator passwordless sign-in. A good intermediate target.
MFA: the classic list, including SMS and voice – which is exactly why you want to move off it.
Sequence matters here: roll out authentication strengths after registration in each wave, not before. If you require phishing-resistant MFA from users who have not registered a passkey yet, and they cannot satisfy the security info registration CA policy either, you have built a deadlock the service desk gets to untangle with Temporary Access Passes, one ticket at a time. Pilot group, registration wave, comms, then the strength policy – in that order, per wave.
This is also the answer to a question I get a lot: “if SMS stops working in February, does that not just mean attackers move to phishing our Authenticator prompts?” Yes – retiring SMS is necessary, not sufficient. Authentication strengths are how you convert the passkey rollout from a registration statistic into an actual reduction of attack surface.
Quick answers to the questions everyone asks
Does this affect Microsoft 365 personal or family accounts? No – this timeline is about Microsoft Entra ID (work and school accounts) in the public cloud. Consumer accounts and sovereign clouds run on their own schedules.
Are Authenticator push notifications and TOTP codes going away too? No. Only Microsoft-provided SMS and voice delivery is retired. Authenticator, TOTP, hardware OATH tokens, FIDO2 keys, Windows Hello for Business, and certificate-based authentication all continue.
Will my users get locked out on February 1, 2027? Not locked out – blocked-until-registered. A user whose only method is SMS or voice will be required to register a passkey during sign-in before they can continue. That is a support-heavy morning if it hits hundreds of users at once, which is the entire argument for doing this on your own schedule.
We use a third-party MFA provider through external authentication methods – are we affected? External MFA methods are not being retired. But if some of your users are also enabled for Entra SMS or voice, those users are in scope for the September auto-enablement, so clean up the policy targeting.
Can I keep using SMS for SSPR only? Only through a customer-managed telecom provider. The retirement covers SSPR as well as MFA.
Do not forget SSPR
The retirement applies across Entra, including self-service password reset. If your SSPR policy leans on phone-based verification, those methods stop working on the same February 2027 date unless a customer-managed provider is in place. Combine that with the September 7, 2026 change (SSPR only accepts methods the user has registered) and the message is clear: your SSPR method policy needs the same review as your MFA policy. Microsoft has said that password change support for passwordless users is coming, but if passwords are still part of your world, make sure every user has at least two non-phone methods registered – Authenticator plus email, or Authenticator plus security questions – before you switch off phone options.
Lessons learned from the field
These are the things the documentation will not tell you, collected from migrations I have run or rescued:
1. The registration report always contains surprises. Every tenant I have analyzed had phone-only users nobody expected: meeting room accounts someone MFA-enabled in a panic, a CFO whose Authenticator broke in 2023 and “temporarily” fell back to SMS, external bookkeepers, that one integration account a vendor set up with a real mobile number. Run the report before you estimate the project, not after.
2. Check your break-glass accounts first, not last. If your emergency access accounts use voice call as a factor (it was a common recommendation a decade ago), fix that this week. FIDO2 hardware keys stored in physically separate locations is the pattern. You do not want to discover this dependency during an incident in March 2027.
3. Per-user MFA settings are still lurking in older tenants. Users enabled through the legacy per-user MFA portal are in scope for the September auto-enablement too. If you never finished the migration to the Authentication Methods Policy, this is the forcing function – converged authentication methods migration first, then the passkey rollout. Doing them simultaneously multiplies the confusion.
4. The nudge’s per-device evaluation generates tickets. Users who registered a passkey on their PC get nudged again on their phone and conclude “it didn’t work”. Pre-empt it in your comms: one passkey per platform is normal, and Windows Hello for Business does not follow you to your iPhone.
5. Conditional Access and the nudge interact silently. A CA policy that locks security info registration to compliant devices will quietly prevent nudges for users on unmanaged devices – which, in a BYOD-heavy organization, can be most of the affected population. Decide on a registration path for those users (Temporary Access Pass issued by the service desk works well) before you turn on enforcement.
6. Watch out for shared phone numbers. Shops, wards, and warehouses where one number backs ten accounts break in interesting ways when those accounts each need an individual passkey. FIDO2 keys on a lanyard have solved this everywhere I have tried them.
7. Guests are in scope, and passkey support for B2B is not fully there yet. Microsoft says passkey support for B2B and internal guests lands by end of 2026 – which is cutting it close to February 2027. Inventory your guest users with phone-based MFA now, and consider whether external MFA trust settings (accepting the home tenant’s MFA claim) can take them out of the equation entirely.
8. Do not let “temporary” become permanent. Every extension mechanism in this post – the opt-out, the telecom provider, long snoozes, exclusion groups – is a bridge. Put an expiry date and an owner on each one the day you create it. The tenants that struggle in January 2027 will be the ones that treated September’s opt-out as a solution.
9. Sell the upside, not just the deadline. Passkeys are genuinely faster – no more typing codes, no more “open the app on your other phone”. Users who experience a passkey sign-in once rarely want to go back. Frame the change as an upgrade with a deadline, not a compliance chore, and your registration numbers will show the difference.
My recommended plan, condensed
Now: run the analyzer script and the registration report. Build the affected-users group. Check break-glass accounts.
August: decide per segment: passkey, Authenticator bridge, hardware key, or (rarely) telecom provider. If the September auto-changes conflict with your plan, grab the opt-out API details on August 1 and file the change request. Configure the passkey policy yourself before Microsoft does it for you.
September-October: pilot the registration campaign against IT, then wave by wave. Send awareness and action comms. Evaluate the Security Store catalog (from September 18) if you have a telephony requirement, and configure the provider from October 30.
November-December: flip the campaign to limited snoozes for the stragglers. Chase the phone-only list down toward zero. Fix SSPR methods.
January 2027: buffer month. Nothing new – just verification, reporting, and the final targeted reminders before the February 1 enforcement.
Microsoft retiring SMS and voice MFA is not a surprise direction – it is the industry direction with a date on it. The organizations that will sail through this are the ones that treat September 1, 2026 as their deadline for having a plan, not February 1, 2027 as their deadline for panicking. Run the report today, segment your users, take control of the registration campaign before Microsoft’s defaults do it for you, and use the extension mechanisms for what they are: bridges with an expiry date.
If you want help assessing your tenant – from a quick phone-method inventory to a full passkey rollout – you know where to find me.
Microsoft has announced that enhanced host pool management for Azure Virtual Desktop is now generally available. In short: you can now create a host pool with a session host configuration, and the platform takes over the work of creating and updating session hosts for you. I set it up in my own tenant, and in this post I will walk through the setup step by step, including two gotchas the wizard will not warn you about.
What actually changes
With a standard host pool, you deploy session hosts yourself and keep them updated yourself. A host pool with a session host configuration flips that model:
Session host configuration: one definition of what every session host should look like: image, VM size, OS disk, network, domain join and the local admin credentials.
Session host management policy: how changes roll out: batch size, logoff behavior and the time zone used for scheduling.
Session host update: when you change the image or configuration, Azure Virtual Desktop replaces the session hosts for you, batch by batch.
Autoscale can create and delete session hosts based on demand, not just start and stop them.
There is also no registration token to manage anymore: the service handles agent registration itself.
Before you start
Only pooled host pools support session host configuration.
You choose the management approach when the host pool is created. An existing host pool cannot be converted, and you cannot switch back.
The local administrator credentials for the session hosts must come from Azure Key Vault: the wizard only offers Key Vault references, not inline username and password fields.
Step 1: Prepare the Key Vault
Create a Key Vault with two secrets, one for the VM admin username and one for the password. Do this before you open the host pool wizard: the wizard caches the vault list when it loads.
If your vault uses the access policy permission model, you must also grant the Azure Virtual Desktop service access to read secrets:
az keyvault set-policy -n kv-tm-avd-prod-001 \
--object-id <AVD-provider-object-id> \
--secret-permissions get list
Step 2: Basics
In the Azure portal, go to Azure Virtual Desktop, select Host pools and select Create.
Pick Pooled, and set Create Session Host Configuration to Yes. This is the decision that enables the whole feature set. Set your load balancing algorithm and max session limit as usual.
Step 3: Session hosts
You can set the number of session hosts to 0 and still define the full configuration. That is exactly what makes this approach nice to prepare in advance, since autoscale or a later update can create the hosts. I used the Windows 11 Enterprise multi-session 25H2 image with Microsoft 365 Apps, Trusted launch, a name prefix, my virtual network and Microsoft Entra ID join.
At the bottom of the tab, the virtual machine administrator account is referenced from Key Vault: two dropdowns for the vault and secret holding the username, and two for the password.
Step 4: Management
The wizard assigns a system-assigned managed identity to the host pool and shows exactly which roles it will get, including Desktop Virtualization Virtual Machine Contributor on the session host resource group and Key Vault Secrets User on the credential vault. You need Owner or User Access Administrator rights for these role assignments to succeed.
Step 5: Review and create
Validation checks the configuration, and the deployment creates the host pool, the application group and the session host configuration.
On the host pool overview you can now see Uses Session Host Configuration: Yes, and the toolbar has new Start, Restart and Stop commands that operate on the whole pool.
Two gotchas from my deployment
Key Vault access: portal validation passed, but the deployment failed with UnableToAccessKeyVaultSecret. The role assignments the wizard creates are Azure RBAC, so if your vault runs the access policy permission model, the Azure Virtual Desktop provider has no access. Grant it an access policy as shown in step 1 and redeploy.
VM size restrictions: my subscription had no access to Standard_D2as_v5 in West Europe, which also only surfaced at deployment time. Check availability first with: az vm list-skus -l westeurope –query "[?name=='Standard_D2as_v6'].restrictions"
Third-party app patching has been the quiet tax on every Intune estate I run. Chrome, 7-Zip, Notepad++, Zoom, the JDKs – none of them are hard to package, but multiplied across a catalog of apps and a monthly cadence, the packaging-and-supersedence treadmill eats real hours. Enterprise App Management (EAM) took the first bite out of that when it shipped the Microsoft-hosted Enterprise App Catalog. The auto-update option – now Generally Available – takes the rest.
I read the short write-up on Xplore the Cloud and it is a good primer on the toggle. This post goes a layer deeper: the licensing reality, how auto-update differs from guided supersedence, the caveats Microsoft tucks into the docs that will bite you in production, how to monitor it, and a rollout playbook I would actually follow with a customer.
On the visuals in this post. Rather than embed portal screenshots, I have linked each step to the exact Microsoft Learn page that shows the official UI – so the images you see are always current with the portal instead of going stale in a blog. If you are reproducing this internally, capture from your own tenant so the branding matches.
What EAM and the Enterprise App Catalog Actually Are
Enterprise App Management is an Intune capability that gives you a Microsoft-curated catalog of prepackaged Win32 apps (EXE and MSI) hosted by Microsoft. When you add one, Intune pre-fills everything you would normally reverse-engineer yourself:
Restart behaviour, return codes, install context (system vs user)
The catalog is large – well over a thousand titles today, from Adobe Acrobat and Google Chrome for Business to the whole Eclipse Temurin / Zulu JDK matrix, 7-Zip, Notepad++, Firefox, PowerToys and Wireshark. Content is served from *.manage.microsoft.com and installed by the Intune Management Extension (IME) – not winget, which is a common misconception.
EAM is not part of base Intune. It requires a subscription in addition to Intune Plan 1/Plan 2, and you get it one of three ways:
As part of the Microsoft Intune Suite
As the standalone Enterprise App Management add-on SKU
Bundled into Microsoft 365 E5 – the change that makes this genuinely worth revisiting, because a lot of my customers already own E5 and were never using the feature
A quick way to confirm the entitlement is actually provisioned: go to Apps > Windows > Create and open the App type dropdown. If Enterprise App Catalog app is not in the list, the tenant does not have EAM enabled yet – licensing alone is not enough, the entitlement has to be present. (I checked a Plan-2-only tenant while writing this and the option simply is not there, which is the fastest tell.) See Microsoft Intune plans and pricing for the SKU details.
Two Update Models: Guided Supersedence vs Auto-Update
Before GA, keeping a catalog app current meant guided update supersedence: Intune surfaced available updates under Apps > Enterprise App Catalog apps with updates, you created a new app version, and you wired up a supersedence relationship to replace the old one. Controlled, reviewable – and manual. It is still fully supported and documented under Guided update supersedence for Enterprise App Management.
Auto-update collapses that loop. Enable it on a catalog app with a Required assignment and Intune detects new catalog versions and pushes them to targeted devices automatically. No new app, no supersedence relationship, no monthly click-through.
Here is the honest comparison:
Guided update supersedence
Automatically update
Trigger
You create the new version + supersedence
Intune detects the catalog version
Review before deploy
Yes
No
Phased rollout / rings
Yes (via assignments)
No – all targeted devices at once
Assignment types
Required and Available
Required only
Rollback / uninstall remediation
You control it
None built in
Change-control friendly
Yes
Not really
Effort per update
Manual, recurring
Zero after setup
Neither is strictly better. Auto-update is fantastic for the low-risk long tail (utilities, runtimes, browsers on a fast ring). Guided supersedence still earns its keep where you need a maintenance window, a pilot ring, or a change record.
Enabling Auto-Update
The switch lives in the app-creation wizard, not in a global setting. When you add an Enterprise App Catalog app, the update method is presented as part of the flow:
Apps > Windows > Add > Enterprise App Catalog and pick your app.
Work through the app information and configuration (accept the pre-filled install/detection logic unless you have a reason not to).
On the assignment step, set a Required assignment – auto-update does nothing for Available assignments.
Choose the update method: the default is Update with Supersedence; select Automatically update instead.
The exact screen: the update-method choice appears on the assignments step. Microsoft documents it under Add a Windows catalog app – Step 6: Assignments, which shows the “Automatically update” option in context.
You can spot auto-update apps afterwards by adding the catalog/auto-update column or filter in the Windows apps list. Note that the list does not pin a static version number for these apps – the version is whatever the catalog currently serves, which is the whole point.
The Caveats That Will Bite You
This is where the vendor blogs stop and production begins. Microsoft documents these limitations, but they are easy to miss (see the Limitations and known issues section of the Enterprise Application Management docs):
You cannot flip the update method on an existing app. Supersedence -> auto-update (or back) is not editable. To move an already-deployed app onto auto-update you create a new catalog app with auto-update, then use supersedence to uninstall the old one. Plan the migration; there is no in-place switch.
No rollback or automatic uninstall remediation. If a bad version ships, auto-update will not pull it back. Remediation is manual – an Uninstall intent or a remediation script.
Malicious-version revocation is on you to remediate. If Microsoft pulls a compromised version from the catalog, it posts a notice in the admin center, but you have to find and fix affected devices.
Catalog cache lag of up to one hour. The catalog is cached, so a revoked or new version can take up to 60 minutes to reflect – a real exposure window during a security event.
No rollout rings or phased deployment. New version out = every targeted device, simultaneously. There is no built-in ring. If you want staging, you build it yourself with separate assignment groups, or you stay on guided supersedence.
Reporting shows latest state only. Intune keeps the current reported state per device, not a full version history. Mid-rollout, different devices legitimately show different states.
Not supported as a blocking app in the Enrollment Status Page or Autopilot Device Preparation. Use a fixed-version catalog app for ESP gating.
No running-app detection. Intune cannot tell whether the app is open when it updates. For an editor or browser mid-session, that can mean a forced close. This is the caveat I would flag hardest to end users.
Do not double-manage a title. If a separate LOB/Win32 assignment targets the same app, you get a version race condition. One app, one deployment type.
Monitoring Auto-Update
You lose the pre-deploy review gate, so lean harder on reporting:
Enterprise App Catalog apps with updates (Apps blade) – shows which catalog apps have newer versions available. For auto-update apps this is informational, but it is your catalog-freshness pulse.
Managed Apps report (per device) – lists installed/not-installed/available apps for a device with application, version, resolved intent, and install status. This is your ground truth for “what version is actually on this machine right now.” See Intune reports overview – Managed Apps report.
Per-app device install status – the standard app monitoring blade still applies; expect churn while a version rolls out because reporting reflects only the latest state.
Automating with Graph
Everything above is Graph-addressable through the deviceAppManagement/mobileApps surface (win32CatalogApp / mobile app supersedence resources). If you manage app deployments as code, you can query which catalog apps are on auto-update and audit assignments in bulk rather than clicking through the portal – handy across a multi-tenant MSP estate.
Treat the exact resource types as version-dependent – check the current Intune Graph reference before you build automation on them, because the catalog-app schema is still evolving.
A Rollout Playbook
This is roughly how I would introduce auto-update to a customer rather than flipping everything at once:
Confirm licensing and entitlement. Intune Suite, the EAM add-on, or M365 E5 – and verify the Enterprise App Catalog app type actually appears in the Create wizard. If it is E5, you already paid for it.
Pick the safe long tail first. Utilities and runtimes where a forced update mid-use is a non-event: 7-Zip, Notepad++, PowerToys, the JDKs, CLI tools. Leave user-facing editors and browsers for later.
Deploy as a new Required app with Automatically update to a pilot group. Remember you cannot convert existing supersedence apps in place – build new and supersede the old.
Watch the Managed Apps report for a cycle to confirm devices land on the expected version.
Communicate the no-running-app-detection reality. Tell users that catalog apps may update and close silently, so they should save work. This single message prevents most of the support tickets.
Keep guided supersedence for anything that genuinely needs a maintenance window, a phased ring, or a change record. Auto-update is a tool, not a religion.
Do not double-manage. Retire any legacy LOB/Win32 package for a title before you put it on auto-update.
FAQ
Is EAM auto-update free?
No. It needs the Enterprise App Management entitlement – via the Microsoft Intune Suite, the standalone EAM add-on, or a Microsoft 365 E5 subscription that includes it. Base Intune Plan 1/Plan 2 alone does not surface the catalog.
Can I switch an existing catalog app from supersedence to auto-update?
No. The update method is fixed at app creation. Create a new catalog app with Automatically update, then use supersedence to uninstall the old one.
Does auto-update support update rings or phased rollout?
No. When a new version is published, it goes to all targeted devices at once. If you need staging, use separate assignment groups or stay on guided supersedence.
Does it work for apps assigned as “Available”?
No. Auto-update applies only to Required assignments. Available apps continue to use the existing update workflow.
Will Intune wait if the app is running?
No. There is currently no running-application detection, so an update can close an app that is in use. Warn your users.
Can I roll back a bad version automatically?
No. There is no built-in rollback. Remediate manually with an Uninstall intent or a remediation script.
The Bottom Line
Auto-update turns EAM from a faster packaging tool into something closer to a managed patch service for a large slice of your third-party Windows estate. For the low-risk long tail it is close to set-and-forget, and if you are on Microsoft 365 E5 it costs you nothing extra to start. Just go in eyes-open: there is no rollback, no native ring model, and no running-app detection, so match the update model to the risk of each app rather than reaching for the switch on everything. Start with the boring utilities, watch the reporting, and expand from there.
“I want to RDP into a Windows Server 2022 and log in with my FIDO2 security key instead of typing a password.” It sounds like a single feature you turn on. It is not. Whether it works at all depends on one thing most people skip past: what your server and your client are joined to.
Before you touch a single setting, you also need to be clear about which of two completely different things you actually want, because they share the word “FIDO2” and almost nothing else:
Authenticate the RDP logon itself with a FIDO2 key – passwordless sign-in to the remote server.
Redirect a FIDO2 key into the session so a web app or app inside the RDP session can use WebAuthn, while the key stays plugged into your local machine.
These have different requirements and different failure modes. Let me take them in order, and for the first one walk through all three join states.
First, the one that trips everyone up: a FIDO2 key is an Entra credential
This is the single fact that makes the rest of the post make sense. A FIDO2 security key is registered in Microsoft Entra ID. It is not, by itself, an on-premises Active Directory credential.
So when you log on to a remote server with a FIDO2 key, two things have to happen:
Entra ID authenticates the key.
Something has to turn that into a Kerberos ticket the on-prem world (and the server) understands.
That second step is where the join state decides your fate.
Scenario 1: FIDO2 sign-in to the RDP session
Entra-joined
The cleanest case. If both your client and the target are Microsoft Entra joined, FIDO2 sign-in over RDP works with the modern RDP stack (the web-account-selector flow) on current Windows 10, Windows 11 and Windows Server 2022 builds.
The catch with servers: pure Entra join is not supported on Windows Server. Server SKUs do not Entra-join the way a client does. So in practice “Entra-joined target” applies to Windows 10/11 remote hosts, and your Windows Server 2022 box lands in the hybrid scenario below even when the rest of your estate is cloud-first.
What you need:
Client (and where applicable the host) Microsoft Entra joined.
FIDO2 enabled as an authentication method in Entra ID > Authentication methods (see Microsoft’s FIDO2 enablement guide), with the user in scope and a key registered.
Current Windows builds on both ends and an up-to-date RDP client.
For an Entra-joined client signing into an Entra-joined Windows 10/11 host, there is no Kerberos-trust plumbing to configure – it largely just works once the method is enabled.
Hybrid-joined (this is where Server 2022 actually lives)
Because Windows Server 2022 cannot be pure-Entra-joined, hybrid is the realistic target join state for a server. Both the client and the server are Microsoft Entra hybrid joined – joined to on-prem AD and registered to Entra ID.
Here you must build the bridge that turns the Entra FIDO2 authentication into an on-prem Kerberos ticket. That bridge is Microsoft Entra Kerberos, deployed as cloud Kerberos trust:
Run the Entra Kerberos setup to create the Microsoft Entra Kerberos Server object in your on-prem AD. It shows up as a special computer object (effectively a read-only-DC-style KDC object) that lets Entra ID issue partial TGTs for your AD domain.
Configure Windows Hello for Business cloud Kerberos trust via Intune or Group Policy so the FIDO2/WHfB credential is allowed to request those tickets.
Enable the security key sign-in credential provider on the machines. On Entra-joined clients this is on by default; on hybrid-joined devices you turn it on explicitly – via Intune (Authentication method / “Enable security key sign-in”) or the equivalent ADMX policy Turn on security key sign-in under Computer Configuration > Administrative Templates > System > Logon.
With cloud Kerberos trust in place, the flow is: key authenticates to Entra, Entra issues a partial TGT, the on-prem DC completes it, and the server gets a Kerberos logon it trusts. Service tickets and authorization stay on your on-prem domain controllers – you are not moving authorization to the cloud, only the initial credential.
If FIDO2 RDP “authenticates but won’t log on to the server,” cloud Kerberos trust is almost always the missing piece.
On-prem only (no Entra at all)
Here is the honest answer: the native FIDO2 credential provider does not work for on-premises-only devices. Microsoft is explicit about this. No Entra, no FIDO2 sign-in – because there is nothing to issue the Entra side of the credential.
That does not leave you stuck, but it does mean changing the question. Your realistic options are:
Use the key as a smart card. Many FIDO2 keys also carry a PIV/smart-card applet. Stand up AD CS (your on-prem PKI), issue smart-card logon certificates onto the key, and you get certificate-based passwordless RDP using the long-standing smart-card logon path. RDP already knows how to redirect a smart card reader into the session. This is “passwordless RDP with a security key” in the literal sense, but the mechanism is smart-card logon, not FIDO2/WebAuthn.
Go hybrid. If passwordless-with-FIDO2 specifically is the goal, the supported route is to hybrid-join the estate and deploy cloud Kerberos trust as above. For most shops this is the better long-term answer than building out smart-card PKI just for RDP.
A third-party MFA-for-RDP product if you want a step-up factor on top of passwords without the PKI or Entra work.
So: pure on-prem FIDO2 sign-in is not a checkbox – it is either smart-card-via-PKI or a move to hybrid.
Key-as-smart-card via AD CS PKI, or move to hybrid
Scenario 2: WebAuthn redirection into the session
Different problem, much smaller. You do not want to log into the server with the key – you want a website or app running inside the RDP session to use the FIDO2 key that is physically plugged into your local PC.
That is WebAuthn redirection, and the good news is:
It is supported on Windows Server 2022 (and Windows 10 1809+ / Windows 11).
It is on by default. There is no positive switch to flip – you only need to make sure nobody disabled it.
The control that matters lives on the server (the RDP host) as Group Policy:
Computer Configuration > Administrative Templates > Windows Components > Remote Desktop Services > Remote Desktop Session Host > Device and Resource Redirection > Do not allow WebAuthn redirection
Set it to Disabled or Not Configured to allow redirection. If it is Enabled, redirection is blocked and any in-session FIDO2 prompt fails instantly.
This is the one I see bite people most often, and the cause is almost always the same: a hardened golden image. CIS benchmarks and a lot of corporate baselines set “Do not allow WebAuthn redirection” to Enabled. If your security key worked fine on the local desktop but dies the moment you are inside RDP, check this policy before anything else. The ADMX comes from the Windows 11 22H2 administrative templates or newer, so make sure your Central Store is current too.
On a current Remote Desktop client you opt in on the Local Resources tab by ticking WebAuthn (Windows Hello or security keys). For the full walkthrough of using your key inside the session – including Windows 11 client cross-device passkey support – see the companion post: Using Your FIDO2 Key From Inside the RDP Session.
Picking the right path
“I want to log into the server with my key.” → Scenario 1. Find your join state in the table. For a real Windows Server 2022, that almost always means hybrid + cloud Kerberos trust.
“I want to use my key for a website/app running on the server.” → Scenario 2. Confirm “Do not allow WebAuthn redirection” is not Enabled, and you are done.
“We are on-prem only and want passwordless RDP.” → It is not native FIDO2. Either key-as-smart-card via AD CS, or move to hybrid.
Wrap-up
The reason “enable FIDO2 over RDP” has no single answer is that the key is an Entra credential and your server probably is not pure-cloud. Sort out the join state first, then the rest follows: Entra-joined is nearly free, hybrid needs cloud Kerberos trust, and on-prem-only means smart-card PKI or a hybrid move. And if it is really just an in-session web app you are after, the whole thing collapses to one Group Policy that your hardening baseline may have already turned off.
Microsoft has confirmed the next annual feature update, Windows 11, version 26H2, and the headline for IT is a familiar one: this is an enablement package (eKB), not a full OS swap. If you have been through the 24H2 to 25H2 cycle, the playbook is almost identical – but there are a couple of new wrinkles worth planning around. This post walks through the supported upgrade paths, how you drive it with Windows Autopatch and Intune, and how to actually track the rollout from pilot to production.
What 26H2 actually is
26H2 shares the same servicing branch as 24H2 and 25H2. That means for devices already on those versions, the upgrade is delivered as a tiny enablement package – around 174 KB – that simply flips the version and build number (build 26300) after a single restart. No multi-gigabyte download, no long offline phase, no feature-update reboot marathon. The new capabilities ship continuously through monthly cumulative updates and are switched on by the eKB.
Microsoft frames it as “a predictable, low-disruption update experience for organizations and IT professionals,” and from a deployment standpoint that is exactly what it is – an update ring approval rather than a migration project. Expect general availability in the fall of 2026, in line with previous H2 releases.
Upgrade paths – know your starting point
The delivery method depends entirely on the version a device is sitting on today:
Windows 11 24H2 / 25H2 – direct eKB upgrade. ~174 KB, one restart. This is the easy 95% for most managed fleets.
Windows 11 23H2 and older – different servicing branch, so no eKB. These need the full feature-update media path (~6.5 GB download and the full upgrade experience).
The 26H1 caveat – 26H1 sits on a separate Windows core branch and does not roll forward to 26H2 via the standard enablement path. If you have any 26H1 (specialized/insider) devices, plan a different route for them.
Windows 10 – no shortcut here. These are full upgrades (or, frankly, replacements) and should already be on your end-of-support migration plan.
Upgrade paths to 26H2 depend on the version a device sits on today.
Action before fall: run an inventory split by OS version now. Anything not already on 24H2/25H2 is your long-tail – get those onto a current branch first so 26H2 becomes a one-restart eKB rather than a 6.5 GB project.
Driving it with Windows Autopatch
If you are on Autopatch, 26H2 is close to trivial to approve – it appears in the feature update flow like any other release, and because the payload is tiny, distribution can complete in a day rather than weeks.
The mechanics you already rely on still apply. Autopatch groups split your estate into deployment rings – Test, First, Fast, and Last. If you do not define extra rings, Test acts as your pilot and Last as production. Releases flow sequentially through the rings, and Autopatch monitors device telemetry the whole way – if failure or compatibility signals spike, it can automatically pause progression to the next ring.
Pilot: keep Test/First small but representative – mix hardware models, key line-of-business apps, and a few power users who will actually report friction.
Soak time: because the eKB is so small, the temptation is to rush. Resist it – the value of a pilot is the soak window, not the download time. Give each ring a real bake period to surface app and driver issues.
Safety net: you retain Pause, Resume, and Rollback for feature updates directly from Intune if a ring goes sideways.
Not on Autopatch? The same model is available with Intune Feature Update profiles plus Update Rings – you target 26H2 as the feature update version and stagger deferrals/rings manually. You lose the automatic ring progression and telemetry-driven pause, but the staged approach is the same.
Autopatch rings, the telemetry safety net, and what to watch as you promote from pilot to production.
Tracking pilot to production
This is where most rollouts get loose. “We deployed it” is not the same as “we can prove the estate moved.” Here is the reporting stack I lean on:
Reports > Windows Autopatch – the two Autopatch reports give you ring-level rollout status and quality/feature update health. This is your primary “where is each ring” view.
Reports > Device management > Windows Updates – the feature update report and readiness reporting validate which devices are eligible and which are blocked, before and during the push.
Email notifications – make sure your Autopatch admin contacts are current so you actually receive the proactive alerts rather than discovering issues in a dashboard.
A simple version-count KQL/report – track devices reporting build 26300 over time as your single “percentage on 26H2” number for management. Watch the curve per ring, not just the total.
Define your exit criteria before you start: e.g. pilot ring at >95% success with zero unresolved Sev-1 app issues for X days before releasing the next ring. Let the telemetry and your soak window – not the trivial download size – gate each promotion.
Support lifecycle
The usual split applies: Enterprise, Education, IoT Enterprise and Enterprise multi-session get 36 months of support, while Home, Pro, Pro Education and Pro for Workstations get 24 months (support running to roughly October 2028). Factor that into whether 26H2 is a “move now” or a “this fall” decision for each ring.
A short pre-flight checklist
Inventory by OS version – identify anything not on 24H2/25H2.
Get the long-tail (23H2 and older, Windows 10) onto a current branch first.
Flag any 26H1 devices for a separate path.
Confirm Autopatch groups / Intune feature update profiles and rings are sane.
Verify Autopatch admin contacts and reporting access.
Write down your per-ring exit criteria and soak windows.
Bottom line: 26H2 is an approval, not a migration – for the devices that are on a current branch. Spend your effort on the long-tail and on a disciplined pilot-to-production cadence, and the eKB itself will be the least interesting part of the project.