PHP2Shell (CVE-2026-109618 and CVE-2026-109619): Critical PHP RCE – How to Check, Patch and Verify Your Servers Today

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
Fixed in PHP 8.5.12, 8.4.27, 8.3.36, 8.2.35 (and 8.6.0 RC4)
End-of-life branches 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:

sudo apt-get update
sudo apt-get install --only-upgrade $(dpkg-query -W -f='${db:Status-Abbrev} ${Package}\n' '*php8.3*' \
  | awk '$1=="ii"{print $2}')

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.

  1. 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.
  2. 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.
  3. Patched: the first run did nothing because of the php8.3-json issue above. The second run, with only installed packages, upgraded 13 packages.
  4. Restarted: php-fpm8.3 -t to test the config, restarted FPM, reloaded Apache.
  5. 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
  • โ˜ Restart FPM, Apache (if mod_php), workers and supervisors; redeploy containers
  • โ˜ 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.

References

Wrapping up

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.

MC1507808: Microsoft Turns On ‘Require Risk Remediation for High-Risk Users’ in Your Tenant – What to Check Before October 28

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 IDMC1507808, 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 stateReport-only, 30-day evaluation period ending
EnforcementWeek of October 28, 2026. Automatically set to On unless you set it to On or Off yourself
Who is in scopeTenants with Microsoft Entra ID P2 (included in Microsoft 365 E5 and EMS E5)
ConditionUser risk = High (Entra ID Protection)
Grant controlRequire risk remediation (adaptive risk remediation)
ScopeA new security group created by Microsoft together with the policy
Not coveredSign-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:

  1. 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.
  2. 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

DateWhat happens
October 1, 2026Legacy user risk and sign-in risk policies in ID Protection are retired
Start of the 30-day evaluationMicrosoft creates the policy + security group in Report-only (check the creation date in your own tenant, see Step 1)
October 14, 2026MC1507808 reminder published
Week of October 28, 2026Policy 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:

ScenarioWhat ID Protection does
Password user with an active risk detection such as leaked credentials, password spray or session history involving a compromised passwordUser 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 propertiesUser’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.

Step 1: Find the policy and check its state

In the portal:

  1. Sign in to the Microsoft Entra admin center as at least Conditional Access Administrator.
  2. Browse to Entra ID > Conditional Access > Policies.
  3. 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 Entra Conditional Access Policies list with two policies Created by Microsoft and five created by the user
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:

Connect-MgGraph -Scopes "Policy.Read.All"

Get-MgIdentityConditionalAccessPolicy -All |
    Where-Object { $_.DisplayName -like "Microsoft-managed*" } |
    Select-Object DisplayName, State, CreatedDateTime |
    Sort-Object DisplayName |
    Format-Table -AutoSize

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.

Microsoft Entra ID Protection Risky users report with risk level chart and filters
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.
Connect-MgGraph -Scopes "Policy.Read.All", "User.ReadBasic.All", "GroupMember.Read.All"

$p = Get-MgIdentityConditionalAccessPolicy -All |
    Where-Object { $_.DisplayName -like "Microsoft-managed*remediation*" }

$p.Conditions.Users.IncludeGroups |
    ForEach-Object { (Get-MgGroup -GroupId $_).DisplayName }

$p.Conditions.Users.ExcludeUsers |
    ForEach-Object { (Get-MgUser -UserId $_).UserPrincipalName }

$p.Conditions.Users.ExcludeGroups |
    ForEach-Object { (Get-MgGroup -GroupId $_).DisplayName }

Step 4: Check for conflicting risk policies

If a user is targeted by more than one user risk policy, precedence applies:

  • Block overrides everything.
  • Require risk remediation overrides Require password change.

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.

Get-MgIdentityConditionalAccessPolicy -All -Headers @{ Prefer = "include-unknown-enum-members" } |
    Where-Object { $_.Conditions.UserRiskLevels } |
    Select-Object DisplayName, State,
        @{n = "UserRisk"; e = { $_.Conditions.UserRiskLevels -join "," }},
        @{n = "Grant";    e = { $_.GrantControls.BuiltInControls -join "," }} |
    Format-Table -AutoSize

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:

  1. A high-risk user will be asked to change their password, or simply to sign in again, sometimes twice. That is expected.
  2. A user who can’t do MFA will be blocked and needs an admin to remediate the risk in ID Protection.
  3. 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.

References

Wrapping up

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.

KB5127648 breaks 802.1X PEAP Wi-Fi authentication on Windows 11: cause and workarounds

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:

LogEvent IDMessage
WLAN-AutoConfig12011Wireless 802.1X authentication started successfully (PEAP)
WLAN-AutoConfig12014Authentication restarted, reason: OneX Held State timeout
WLAN-AutoConfig12013Authentication failed, error 0x80070285 (internal authentication error)
Wired-AutoConfig15514Authentication FAILED, reason 0x50005, error 0x80070285
Wired-AutoConfig15506Authentication suspended, Explicit EAP failure received, BlockingTime 600
EapHost2088User 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

Microsoft announced in 2025 that it would tighten NTLMv1 handling in Windows 11 24H2 and Windows Server 2025. The timeline in the support article Upcoming changes to NTLMv1 in Windows 11, version 24H2 and Windows Server 2025 is explicit:

  • 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:

reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0" /v BlockNtlmv1SSO /t REG_DWORD /d 0 /f

Reboot afterwards. The value means:

  • 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:

# Detect-BlockNtlmv1SSO.ps1
$path = 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0'
$value = (Get-ItemProperty -Path $path -Name BlockNtlmv1SSO -ErrorAction SilentlyContinue).BlockNtlmv1SSO
if ($value -eq 0) { Write-Output 'Compliant'; exit 0 }
Write-Output "Non-compliant (value: $value)"; exit 1

# Remediate-BlockNtlmv1SSO.ps1
$path = 'HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0'
New-ItemProperty -Path $path -Name BlockNtlmv1SSO -PropertyType DWord -Value 0 -Force | Out-Null
Write-Output 'BlockNtlmv1SSO set to 0 (Audit). Reboot required.'
exit 0

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.

References

Windows 11 26H2 Is Here: What to Do with Autopilot and Intune (and How to Report on It)

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 availabilitySeptember 29, 2026
Build26300 (10.0.26300.x)
Delivery for 24H2 and 25H2Enablement package (KB5121794), single restart
Delivery for 23H2 and Windows 10Full feature update (media-based, several GB)
Windows 11 26H1 devicesNot eligible for 26H2 (different Windows core)
Servicing36 months for Enterprise and Education, 24 months for Home and Pro
Hardware requirementsUnchanged 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:

BuildVersionPath to 26H2
10.0.19045Windows 10 22H2Full upgrade (hardware permitting)
10.0.22631Windows 11 23H2Full feature update
10.0.26100Windows 11 24H2Enablement package
10.0.26200Windows 11 25H2Enablement package
10.0.26300Windows 11 26H2Already there
10.0.28000Windows 11 26H1Not 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 11 26H2 Intune Windows devices OS version column
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:

Connect-MgGraph -Scopes "DeviceManagementManagedDevices.Read.All"

$map = @{ '19045'='Win10 22H2'; '22631'='23H2'; '26100'='24H2'; '26200'='25H2'; '26300'='26H2'; '28000'='26H1' }

Get-MgDeviceManagementManagedDevice -All -Filter "operatingSystem eq 'Windows'" -Property "deviceName,osVersion" |
    Group-Object { ($_.OsVersion -split '\.')[2] } |
    Select-Object @{n='Build';e={$_.Name}}, @{n='Version';e={$map[$_.Name]}}, Count |
    Sort-Object 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.

Intune update rings with feature update deferral before Windows 11 26H2 rollout
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.

Intune Windows updates Feature updates tab with Autopatch update readiness
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.

Intune feature update policy with Windows 11 version 26H2 selected
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:

(device.devicePhysicalIDs -any (_ -startsWith "[ZTDId]"))

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.

Intune Windows enrollment with Autopilot device preparation and device association
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.

Intune Windows data connector for Windows diagnostic data and license verification
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:

Windows Autopatch feature updates report not available without prerequisites
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:

Intune Windows updates reports list for Windows 11 26H2 reporting
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:

AlertWhat it meansWhat to do
PolicyConflictDeferralAn update ring defers feature updatesSet feature deferral to 0 days on the ring
PolicyConflictPauseUpdates are paused on the deviceResume the ring or remove the pause GPO
DeploymentConflictDevice is in more than one feature update policyFix group membership and exclusions
SafeguardHoldMicrosoft is holding the update for a known issueLook up the hold ID on Windows release health
IncompatibleServicingChannelDevice is on an Insider or preview channelMove it to the retail (GA) channel
DeviceRegistrationInvalidGlobalDeviceIdDevice cannot register with Windows UpdateMake sure the Microsoft Account Sign-In Assistant service is not disabled
EndOfServiceApproachingThe current version is close to end of servicingPrioritize 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:

  1. 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.
  2. Week 0 to 1: run the device readiness and compatibility risks reports for 26H2. Deploy 26H2 as soon as possible to IT devices.
  3. Week 1: pilot group across all hardware models, including devices with legacy drivers. Prioritize 24H2 Pro devices because of the October 13 deadline.
  4. 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.
  5. 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.

References

Microsoft Is Retiring SMS and Voice MFA in Entra ID: Your Migration Playbook (and How to Buy More Time)

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:

  1. 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).
  2. 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.
  3. 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 admin center Authentication methods Policies blade showing SMS and Voice call enabled for All users
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:

  1. 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.
  2. 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.
  3. 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.
  4. 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 blade with Enable toggle, All users target and the default passkey profile
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.

For the enterprise-grade rollout, follow Microsoft’s phishing-resistant passwordless deployment guide – it covers the persona-based approach in far more depth than I can here.

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 blade set to Microsoft managed targeting Passkey FIDO2 with 1 day snooze and unlimited snoozes
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):

PATCH https://graph.microsoft.com/v1.0/policies/authenticationMethodsPolicy

{
  "registrationEnforcement": {
    "authenticationMethodsRegistrationCampaign": {
      "state": "enabled",
      "snoozeDurationInDays": 3,
      "enforceRegistrationAfterAllowedSnoozes": false,
      "excludeTargets": [],
      "includeTargets": [
        {
          "id": "<objectId of SG-MFA-PhoneOnly-Migration>",
          "targetType": "group",
          "targetedAuthenticationMethod": "fido2"
        }
      ]
    }
  }
}

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:

  1. 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.
  2. 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.
  3. 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 blade with Enable toggle, target scoping and Use for sign-in option
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.

Graph:

PATCH https://graph.microsoft.com/v1.0/policies/authenticationMethodsPolicy

{
  "registrationEnforcement": {
    "authenticationMethodsRegistrationCampaign": {
      "state": "disabled",
      "snoozeDurationInDays": 1,
      "enforceRegistrationAfterAllowedSnoozes": true,
      "excludeTargets": [],
      "includeTargets": []
    }
  }
}

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:

{
  "registrationEnforcement": {
    "authenticationMethodsRegistrationCampaign": {
      "state": "enabled",
      "snoozeDurationInDays": 7,
      "enforceRegistrationAfterAllowedSnoozes": false,
      "excludeTargets": [
        { "id": "<objectId of SG-MFA-Nudge-Excluded>", "targetType": "group" }
      ],
      "includeTargets": [
        { "id": "all_users", "targetType": "group",
          "targetedAuthenticationMethod": "fido2" }
      ]
    }
  }
}

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.

Registration campaign State dropdown open showing Enabled, Disabled and Microsoft managed options
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:

  1. 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.
  2. 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.
  3. 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

  1. Now: run the analyzer script and the registration report. Build the affected-users group. Check break-glass accounts.
  2. 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.
  3. 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.
  4. November-December: flip the campaign to limited snoozes for the stragglers. Chase the phone-only list down toward zero. Fix SSPR methods.
  5. January 2027: buffer month. Nothing new – just verification, reporting, and the final targeted reminders before the February 1 enforcement.

References and further reading

Wrapping up

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.

Enhanced Host Pool Management for Azure Virtual Desktop is Now GA: How to Set It Up

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.

Azure Virtual Desktop host pools list in the Azure portal with the Create button

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.

Create a host pool Basics tab with Create Session Host Configuration set to Yes

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.

Session hosts tab with zero session hosts, name prefix and virtual machine location

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.

Virtual machine administrator account referenced from Azure Key Vault secrets in the host pool wizard

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.

Management tab showing the managed identity and role assignments including Key Vault Secrets User

Step 5: Review and create

Validation checks the configuration, and the deployment creates the host pool, the application group and the session host configuration.

Review and create tab with validation passed

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.

Host pool overview showing Uses Session Host Configuration Yes and the new Start, Restart and Stop commands

Two gotchas from my deployment

  1. 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.
  2. 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"

Read the GA announcement and the host pool management approaches documentation for the full details, including how session host update handles drain, logoff and rollback.

Auto-Updating Enterprise App Catalog Apps in Intune: What GA Actually Changes

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:

  • Install and uninstall commands
  • Detection rules (file version, file size, registry)
  • Requirements (OS architecture, minimum OS)
  • 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.

See the current catalog and the add flow: Add a Windows catalog app (Win32) to Intune on Microsoft Learn lists every title and walks the wizard step by step.

The licensing reality (check this first)

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:

  1. As part of the Microsoft Intune Suite
  2. As the standalone Enterprise App Management add-on SKU
  3. 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:

  1. Apps > Windows > Add > Enterprise App Catalog and pick your app.
  2. Work through the app information and configuration (accept the pre-filled install/detection logic unless you have a reason not to).
  3. On the assignment step, set a Required assignment – auto-update does nothing for Available assignments.
  4. 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.

# Requires Microsoft.Graph, scope DeviceManagementApps.Read.All
Connect-MgGraph -Scopes "DeviceManagementApps.Read.All"

# List Enterprise App Catalog (Win32 catalog) apps and their assignment intent
Get-MgDeviceAppManagementMobileApp -Filter "isof('microsoft.graph.win32CatalogApp')" -ExpandProperty assignments |
  Select-Object DisplayName, Id,
    @{n='Intent';e={ ($_.Assignments.Intent) -join ',' }} |
    Format-Table -AutoSize

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:

  1. 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.
  2. 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.
  3. 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.
  4. Watch the Managed Apps report for a cycle to confirm devices land on the expected version.
  5. 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.
  6. 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.
  7. 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.

References and Further Reading

Using a FIDO2 Security Key Over RDP to Windows Server 2022: On-Prem, Hybrid and Entra-Joined

“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:

  1. Authenticate the RDP logon itself with a FIDO2 key – passwordless sign-in to the remote server.
  2. 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.

Scenario 1 at a glance

Join state (client + server)FIDO2 RDP logon?What you have to configure
Entra joined (Win10/11 host)YesFIDO2 method enabled in Entra; current builds
Hybrid joined (typical for Server 2022)YesEntra Kerberos (cloud Kerberos trust) + WHfB cloud trust + security key sign-in enabled
On-prem only (no Entra)Not nativelyKey-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.

Getting Ready for Windows 11, version 26H2: Upgrade Paths, Autopatch, and Tracking Pilot to Production

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.
Windows 11 26H2 upgrade paths: 24H2/25H2 via enablement package, 23H2 and older via full media, 26H1 on a separate branch
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 deployment rings Test, First, Fast, Last with telemetry-driven pause and rollout tracking
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:

  1. 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.
  2. 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.
  3. Email notifications – make sure your Autopatch admin contacts are current so you actually receive the proactive alerts rather than discovering issues in a dashboard.
  4. 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.

Further reading and references

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.

PIM Tray: Activate Microsoft Entra ID PIM Roles From the Windows Tray

Entra ID PIM activation - PIM Tray Windows tray app

Entra ID PIM activation is a daily ritual for anyone who operates Microsoft Entra ID. If you operate Microsoft Entra ID for a living, you know the dance. Open the portal. Sign in. PIM. My roles. Activate. Type a reason. Pick a duration. Confirm. Repeat for every role, every shift, every customer.

Honestly, I do this on most days. So does every other IT pro I know.

This week, however, I finally decided I was done with it – so I built PIM Tray, a tiny Windows tray app that activates one or more Entra ID PIM roles in a single dialog. It is free, open source under MIT, code-signed, and on GitHub at github.com/ThomasMarcussen/PIMTray.

Entra ID PIM Activation in 30 Seconds: What PIM Tray Does

  • Sits in the Windows system tray as a shield icon.
  • Left-click opens a small window listing every role you are eligible for. Right-click shows the same list as a context menu, plus sign-in / sign-out / about.
  • Tick one or more roles, hit Activate, type a reason, pick a duration, done.
  • A single Windows toast tells you which roles activated, which are pending approval, and which failed – so partial success is obvious instead of buried.

That is essentially the whole pitch. In short: no browser, no tab switching, no clicking through six blades to find the same form you used twenty minutes ago.

Why I Built an Entra ID PIM Activation Tool

First, I tried the obvious alternatives.

  • The Entra portal is the canonical UX. It is fine for one role, painful for three, exhausting for ten.
  • Microsoft.Graph PowerShell with a snippet works, but I do not want to keep a terminal open for a 3 second action, and reason prompts in a shell are friction.
  • Microsoft Authenticator and WAM do not do PIM activation.
  • A couple of community tools exist, but none were code-signed, none batched, and one of them shipped its own browser.

In the end, what I actually wanted was a tool that lived where my other always-on tools live – the notification area – and respected the fact that admins activate roles in clusters, not one at a time.

Therefore I built PIM Tray, a small tool that turns Entra ID PIM activation into a one-click workflow that lives in the Windows tray.

How Entra ID PIM Activation Works in PIM Tray

In particular, there are three moving parts: authentication, discovery, and activation.

Authentication: MSAL Interactive Sign-In

PIM Tray uses MSAL (Microsoft.Identity.Client) as a public client. The default system browser pops, you complete MFA and Conditional Access the proper way, and the token is cached encrypted to disk at %LOCALAPPDATA%\PIMTray\msal_cache.bin via DPAPI. As a result, subsequent launches go silent until the refresh token expires.

Importantly, no password is ever typed into the app, and there is no embedded browser or token-stealing surface area.

Role Discovery: One Microsoft Graph Call

After sign-in, PIM Tray queries Microsoft Graph for every PIM role you are eligible for, with the scope expanded:

GET https://graph.microsoft.com/v1.0/roleManagement/directory/roleEligibilitySchedules
    ?$filter=principalId eq '&lt;your object id>'
    &amp;$expand=roleDefinition

As a result, every eligible role shows up in the list automatically, with its display name and scope (Directory or a resource path). There is no config file of role IDs to maintain.

Activation: One POST Per Checked Role

Then, for each role you tick, PIM Tray posts a self-activation request:

POST https://graph.microsoft.com/v1.0/roleManagement/directory/roleAssignmentScheduleRequests
Content-Type: application/json

{
  "action": "selfActivate",
  "principalId": "&lt;user object id>",
  "roleDefinitionId": "&lt;role id>",
  "directoryScopeId": "/",
  "justification": "Friday change window, ticket INC0001234",
  "scheduleInfo": {
    "startDateTime": "2026-05-12T07:30:00Z",
    "expiration": { "type": "AfterDuration", "duration": "PT4H" }
  }
}

Notably, errors surface verbatim from Graph. If your role policy requires approval, the request is created in pending state and the tray balloon says so. If the policy requires ticket info that the form does not capture, the call fails clearly. No magic, no silent retries, no surprises.

Under the hood, the whole app is .NET 9 WinForms. In total, the signed exe is about 1.3 MB, while the MSI installer is under 500 KB.

Entra ID PIM Activation: The Permissions Question

PIM Tray needs three delegated Microsoft Graph scopes:

  • RoleEligibilitySchedule.Read.Directory
  • RoleAssignmentSchedule.ReadWrite.Directory
  • User.Read

Specifically, there are two practical ways to satisfy them:

  1. Use the bundled default ClientId – the public Microsoft Graph PowerShell first-party app. The first sign-in shows the standard consent prompt. A Global Administrator can pre-consent at tenant level so end users never see the prompt again. Zero setup, but tenant-wide consent to a Microsoft-published app is heavier than some security teams want.
  2. Register your own Entra ID app. New registration, mobile and desktop platform, redirect URI http://localhost, the three delegated scopes above, admin consent granted once. Paste the resulting TenantId and ClientId into appsettings.json (auto-created at %APPDATA%\PIMTray\ on first run). Cleaner long-term, especially if you ship the tool to other admins in your tenant.

In addition, both paths are documented in the README. For personal use, option 1 is two clicks away.

Install

PIMTray.msi  ->  C:\Program Files\PIM Tray\PIMTray.exe

To get started, download the signed MSI from the v1.0.0 release. The MSI is signed with our EV certificate (DigiCert, with RFC 3161 timestamp) so SmartScreen and Microsoft Defender treat it normally and Add/Remove Programs shows a real publisher instead of Unknown.

Requirements:

  • Windows 10 or 11 (x64)
  • .NET 9 Windows Desktop Runtime on the target machine
  • At least one eligible PIM role on your signed-in account

Alternatively, to build from source, clone the repo and run dotnet publish -c Release -r win-x64 --self-contained false -p:PublishSingleFile=true. The exe lands in bin\Release\net9.0-windows\win-x64\publish\.

Frequently Asked Questions

Does PIM Tray support PIM for Groups?

Not in v1.0.0. The current release covers Entra ID directory roles via roleManagement/directory. Group-membership activations (identityGovernance/privilegedAccess/group/) are on the roadmap.

Does PIM Tray support Azure resource PIM (subscriptions, resource groups)?

Not yet. Azure RBAC PIM goes through roleManagement/rbacApplications and needs a different scope ID model. Tracking it as a roadmap item.

Does PIM Tray work with Conditional Access policies that require MFA on PIM?

Yes. In fact, authentication is interactive through MSAL using the system browser, which inherits all your Conditional Access policies, MFA prompts, and even Windows Hello / passkey flows. If your policy requires reauth for PIM, you get the standard Microsoft challenge.

Where is the token stored?

%LOCALAPPDATA%\PIMTray\msal_cache.bin, encrypted with DPAPI scoped to the current Windows user. The token never leaves your machine.

Is PIM Tray code-signed?

Yes. Both PIMTray.exe and PIMTray.msi are signed with an EV code-signing certificate from DigiCert and timestamped via RFC 3161, so the signature stays valid past certificate expiry.

Is PIM Tray open source?

Yes, MIT licensed. Source, issues and pull requests at github.com/ThomasMarcussen/PIMTray.

What is Next

The roadmap on the repo is short and honest:

  • PIM for Groups (group-membership activations)
  • Azure Resource PIM (subscription / resource group scopes)
  • Approval-pending polling so you do not have to refresh manually
  • Start at logon toggle in the About dialog
  • Optional dark mode

Finally, if you use PIM Tray and it shaves five minutes off your week, that is a win for both of us. Issues and PRs welcome.

Try It

If PIM Tray fits your Entra ID PIM activation routine and you build something on top of it, ping me. I would like to hear what other patterns admins want to automate next.


Thomas Marcussen is a Microsoft MVP and Technology Architect. More notes and tools at thomasmarcussen.com.