A user opens Windows Update and sees a line telling them the PC does not currently meet Windows 11 system requirements. That single sentence is the entire diagnostic output. There is no field naming the check that failed, no value, no code. So the guessing starts.
Some admins order replacement laptops. Some paste a registry bypass from a forum without knowing what it does to their support position. Almost nobody reads the check that actually failed, even though Windows wrote it to disk in at least three places before it showed that message.
"Not eligible for Windows 11" is one message hiding several independent gates: a 64-bit CPU on the published supported list, TPM 2.0 present and enabled, UEFI firmware that is Secure Boot capable, 4 GB of memory and a 64 GB system disk. Microsoft documents exactly what the compatibility appraiser writes when one of them fails: an UpgEx colour and a RedReason value such as Tpm, UefiSecureBoot, CpuFms, Memory or SystemDriveSize, under HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags. Read that value and you know which gate to act on. And the honest position on bypasses: Microsoft's own installer text says a device installed this way "will no longer be supported and won't be entitled to receive updates", so a bypass is a decision about support, not a fix.
The problem: one message, several independent gates
Windows 11 has a published list of minimum hardware requirements. Every item on that list is checked separately. Any one of them can block the upgrade on its own.
Here is the documented list, straight from Microsoft's Windows 11 requirements article, with the way to read each one on a live device.
| Documented requirement | Documented minimum | How you read it locally |
|---|---|---|
| Processor | 1 GHz or faster, two or more cores, on a compatible 64-bit processor or system on a chip | Get-CimInstance Win32_Processor |
| Memory | 4 GB or greater | Win32_ComputerSystem.TotalPhysicalMemory |
| Storage | 64 GB or greater available disk space | Get-Disk |
| System firmware | UEFI, Secure Boot capable | Get-ComputerInfo -Property BiosFirmwareType and Confirm-SecureBootUEFI |
| TPM | Trusted Platform Module version 2.0 | Win32_Tpm.SpecVersion, Get-Tpm, tpm.msc |
| Graphics card | Compatible with DirectX 12 or later, with a WDDM 2.0 driver | dxdiag |
| Display | High definition (720p), 9 inch or greater, 8 bits per colour channel | Display settings |
Two of those rows cause almost all of the confusion in an enterprise fleet, and both are worth spelling out before anything else.
The first is the processor row. "Compatible 64-bit processor" is not a speed test. It is a lookup against a list Microsoft publishes per Windows 11 release, on separate pages for AMD, Intel and Qualcomm parts. A four-core, 3 GHz, 64-bit chip can fail purely because its model is not on the list for the release you are deploying.
The second is the firmware row. It says "UEFI, Secure Boot capable". It does not say Secure Boot enabled. Microsoft's own Secure Boot support article is explicit: "the requirement to upgrade a Windows 10 device to Windows 11 is only that the PC be Secure Boot capable by having UEFI/BIOS enabled". A device with Secure Boot switched off in firmware still satisfies the gate, as long as the firmware supports Secure Boot at all.
Gotcha that costs money. Admins routinely read Confirm-SecureBootUEFI returning False as "not Secure Boot capable" and mark the device for replacement. False means capable but currently disabled. Only the error text Cmdlet not supported on this platform means the platform genuinely cannot do Secure Boot. Those two results look similar in a script that swallows exceptions, and they mean completely opposite things for your hardware budget.
So the real question is never "is this device eligible". It is "which gate failed". Windows answers that question in writing, and the next section explains who writes it.
Why it happens: the appraiser decides, not Setup
Two different components evaluate Windows 11 hardware requirements, at two different times, and they write to two different places. Confusing them is the root of most bad troubleshooting here.
The chain, in order. A scheduled task called Microsoft Compatibility Appraiser runs compattelrunner.exe, loading appraiser.dll. The appraiser inventories the device, compares it against a compatibility data file it refreshes from Microsoft, and writes its verdict into the registry under AppCompatFlags. Windows Update reads that verdict to decide whether to offer the upgrade at all. Only later, if an upgrade is actually attempted, does Windows Setup run its own separate system-requirement action and write an XML compatibility report.
That means a device can be blocked without Setup ever running. The message in Windows Update is the appraiser's answer, not Setup's.
What the appraiser actually is, in plain English. The compatibility appraiser is the part of Windows diagnostic data that answers one question: if this device tried to move to the next version of Windows, what would go wrong? It has existed since the Windows 10 upgrade era. It checks hardware, drivers and applications, then reduces the whole answer to a colour. Microsoft calls that colour the Upgrade Experience marker, or UpgEx. It documents four values: Red means the device cannot upgrade, Orange means functionality regresses after upgrade, Yellow means an app must be uninstalled first, and Green means none of those. Starting with Windows 11, Microsoft's documentation states that "the UpgEx marker evaluates against the Windows 11 minimum hardware requirements".
The useful part for us is that Microsoft publishes the specific reason codes. In the Configuration Manager readiness dashboard documentation, these conditions are listed as making a device Red for Windows 11.
| Condition that failed | Documented value written | What it actually means |
|---|---|---|
| System does not support TPM 2.0 | RedReason=Tpm | No TPM, a 1.2 TPM, or a TPM turned off in firmware |
| System is not Secure Boot capable | RedReason=UefiSecureBoot | Legacy BIOS, or UEFI firmware with no Secure Boot support |
| Less than 4 GB of RAM | RedReason=Memory | Memory visible to the OS is under the floor |
| Fewer than two processor cores | RedReason=CPU | Core count gate |
| CPU does not support 1 GHz or higher | RedReason=CPU | Rated clock speed gate |
| CPU is not an approved Windows 11 CPU generation | RedReason=CpuFms | Model is not on the published supported-processor list. FMS is family, model, stepping |
| Device is in S mode and not a Home SKU | RedReason=SModeState | Edition gate, not hardware |
| System drive smaller than 64 GB | RedReason=SystemDriveSize | Disk capacity gate |
Read that table again with an operations hat on. It is a complete decode of the message users see. If you can read RedReason off a device, you never have to guess which gate failed, and you never have to replace a laptop that only needed a firmware toggle.
Microsoft also documents a second, separate reason a device is not offered the upgrade, which is not a hardware gate at all: a safeguard hold. A safeguard hold is Microsoft blocking a specific feature update on devices with a known issue, such as a broken fingerprint sensor driver. The documented registry marker for it is GStatus, where 2 means no hold is in effect and 0 means a hold is in effect. A device can be perfectly eligible on hardware and still not be offered the upgrade because of a hold. Those two situations produce similar user complaints and completely different actions.
The binaries in the flow
Naming the actual files makes the chain concrete, and lets you confirm each one exists rather than trusting a diagram.
| File | Location | Role in the flow |
|---|---|---|
compattelrunner.exe | C:\Windows\System32\ | The host process the appraiser scheduled task launches |
appraiser.dll | C:\Windows\System32\ | The appraiser itself. Loaded by compattelrunner with -m:appraiser.dll |
aeinv.dll | C:\Windows\System32\ | Application and device inventory used by the compatibility evaluation |
invagent.dll, devinv.dll, generaltel.dll | C:\Windows\System32\ | Inventory and general telemetry helpers loaded in the same runs |
appraiser.sdb, Appraiser_Data.ini | C:\Windows\Panther\ | The compatibility database and data file the verdict is evaluated against |
APPRAISER_TelemetryBaseline_*.bin | C:\Windows\appcompat\appraiser\ | Per-target-OS baseline data, one file per evaluated release |
MBR2GPT.EXE | C:\Windows\System32\ | Not part of appraisal. Converts a system disk from MBR to GPT so it can boot UEFI |
On the Windows 11 Enterprise device used to write this article, every file above was present except appraiser.sdb in System32, which lives in C:\Windows\Panther instead. That is worth knowing before you write a detection rule against a path you have not checked.
The appraiser answer can be stale. The verdict in the registry is whatever the last completed appraiser run concluded, against whatever compatibility data version it had at the time. If diagnostic data is turned off, or the scheduled task has not completed, the keys can be missing or old. Treat an absent value as "not evaluated", never as "eligible". The companion script for this post deliberately reports that case as INFO rather than PASS for exactly this reason.
How to verify: read each gate directly
There are four surfaces worth reading, in this order: the registry verdict, the live hardware state, the Setup logs, and the XML compatibility report. Start with the registry, because it is the fastest answer.
1. The registry verdict
Everything in this section lives under one parent key.
| Subkey and value | What it holds | Documented by Microsoft? |
|---|---|---|
Appraiser\GWX → GStatus | 2 = no safeguard hold in effect, 0 = a hold is in effect | Yes, in the safeguard holds article |
TargetVersionUpgradeExperienceIndicators\GE<release> | One subkey per target release the appraiser evaluated, for example GE24H2, GE25H2 | Yes, the key path and the release-suffix pattern |
… → GStatus, GatedBlockId, GatedBlockReason | Hold state, the eight-digit safeguard ID, and the reason string | Yes, all three, with an example |
… → UpgEx | The upgrade experience colour: Green, Yellow, Orange, Red | Yes, the marker and its four values |
… → RedReason | The specific blocking reason, for example Tpm, UefiSecureBoot, CpuFms | Yes, the values are listed for Windows 11 |
… → DestBuildNum, FailedPrereqs, DataVer, AppraiserVersion | Target build, prerequisite list, data and appraiser versions | No. Observed on a live device, not documented |
CompatMarkers, UpgradeExperienceIndicators | Older marker keys written by the same component | No. Present on a live device, not documented |
That last distinction matters more than it looks. The documented values are safe to build detection logic on. The undocumented ones can change in any monthly update without notice, so read them for diagnosis and do not gate a deployment on them.
A blocked device shows the same value names with different data, for example UpgEx of Red and RedReason of Tpm. That is the entire diagnosis in two values.
2. The live hardware state
The registry tells you what the appraiser concluded. The commands below tell you what is actually true right now, which is what you need before touching firmware. Each one reads only; none of them change anything.
Read the TPM chip's own words too. Run tpm.msc to open the TPM Management console. The TPM Manufacturer Information panel shows Specification Version, which is the same TCG value as Win32_Tpm.SpecVersion, in a form you can screenshot for a hardware vendor ticket. If the console says the TPM cannot be found while firmware claims it is enabled, you have a firmware or driver problem rather than a Windows 11 eligibility problem, and that is a different ticket entirely.
3. The Setup logs
If an upgrade was actually attempted, Setup left its own trail. Microsoft documents the log locations by phase; these are the ones that matter for hardware gates.
| Log path | What it holds | Search for |
|---|---|---|
C:\$WINDOWS.~BT\Sources\Panther\setupact.log | Down-level phase. The most important log, and where the requirement scan runs | CompatSysRequirement, CHWReqChecker |
C:\$WINDOWS.~BT\Sources\Panther\setuperr.log | Errors only, same phase | your result code, Shell application requested abort |
C:\Windows\Panther\setupact.log | Post-upgrade phase, after OOBE | Compatibility scan data is saved to |
C:\Windows\Panther\CompatData_*.xml | The compatibility report Setup wrote, one per scan | BlockingType, HardwareType |
C:\Windows\Logs\MoSetup\BlueBox.log | Communication between setup.exe and Windows Update | MainHr, Cleanup |
C:\$WINDOWS.~BT\Sources\Rollback\setupact.log | Rollback phase, for generic rollbacks | 0xC1900101 |
Here is what a healthy requirement scan looks like. These are genuine lines from C:\Windows\Panther\setupact.log on the device used for this article, with nothing invented.
The XML that scan produces is the clearest artefact of the lot. Each check appears as a HardwareItem with a HardwareType name and a BlockingType. On this device the Secure Boot item reads exactly like this, again real and untouched apart from line wrapping:
<CompatibilityInfo BlockingType="None"/>
</HardwareItem>
BlockingType="None" is the healthy reading. A gate that failed carries a blocking value instead, and the HardwareType name tells you which check it was. Microsoft does not publish the full list of HardwareType names, so treat the names you find as observed rather than documented, and use them to point at a gate rather than as a contract.
4. Event Viewer: an honest N/A
Microsoft publishes no Event IDs for Windows 11 hardware-requirement appraisal. There is no event to look for that says "TPM gate failed". Saying so plainly is more useful than inventing one, so here is the substitute: the channels that exist, and what they are actually good for.
| Channel | State on a stock Windows 11 device | What it is good for |
|---|---|---|
Microsoft-Windows-Compat-Appraiser/Operational | Enabled, and empty on the test device | Existence proves the appraiser has a channel. Do not expect eligibility verdicts here |
Microsoft-Windows-Compat-Appraiser/Analytic | Disabled by default | Analytic channels are for tracing, not day-to-day diagnosis |
Setup | Enabled, populated by Microsoft-Windows-Servicing | Servicing and update install history, not hardware gates |
Microsoft-Windows-SetupPlatform/Analytic | Present | Setup platform tracing during an actual upgrade attempt |
Confirm this yourself rather than trusting the table, with wevtutil el piped into a filter, then Get-WinEvent -ListLog on any channel you care about to see whether it is enabled and how many records it holds. If a channel is enabled with zero records, the answer to "why is there nothing in Event Viewer" is simply that nothing writes there for this scenario.
5. Services and scheduled tasks
The appraiser is driven by a scheduled task, and its data upload depends on one service.
| Item | Name | Expected state |
|---|---|---|
| Scheduled task path | \Microsoft\Windows\Application Experience\ | Contains the compatibility appraiser task plus PcaPatchDbTask, SdbinstMergeDbTask, StartupAppTask |
| Appraiser task action | %windir%\system32\compattelrunner.exe -m:appraiser.dll -f:DoScheduledTelemetryRun | Ready. This is the exact action string read from the live task |
| Service (short name) | DiagTrack | Running. Display name: Connected User Experiences and Telemetry |
Read them with Get-ScheduledTask -TaskPath '\Microsoft\Windows\Application Experience\' and Get-Service DiagTrack. On the test device the task name is Microsoft Compatibility Appraiser Exp, which is a reminder that task names vary by build and that you should enumerate the path rather than hard-code a task name.
The fix: act on the gate that actually failed
Now that you can name the failing gate, each one has a different answer. Only one of them is "buy new hardware".
| Failing gate | What actually fixes it | Reboot or reinstall? |
|---|---|---|
| TPM absent or disabled | Enable it in firmware. Intel platforms usually call it PTT, AMD platforms fTPM | Firmware change plus reboot |
| TPM is 1.2 | Some platforms offer a firmware switch from 1.2 to 2.0. It clears the TPM, so suspend BitLocker and have your recovery key first | Firmware change plus reboot |
| Secure Boot reported not supported | Check whether the machine is booted in CSM/legacy mode first. If the firmware genuinely has no Secure Boot support, this gate cannot be fixed in software | Firmware change, possibly disk conversion |
| Legacy BIOS boot with an MBR disk | MBR2GPT.EXE /validate, then convert, then switch firmware to UEFI | Disk conversion plus firmware change |
| Memory below 4 GB | Add memory if the platform allows it | Hardware change |
| System disk below 64 GB | Replace the disk, or redeploy to a larger one | Hardware change |
RedReason=CpuFms | Nothing. The model is not on the list. This is the refresh case | Device replacement |
GStatus=0 (safeguard hold) | Not a hardware problem. Look up GatedBlockId on Windows release health and wait for the fix, or opt out for validation only | Neither |
Getting into firmware without a boot-key race
Microsoft documents a route into UEFI firmware settings from inside Windows, which is far more reliable than telling a user to hammer F2 at boot.
From there, the two settings to look for are the TPM (PTT or fTPM) and the boot mode, changing it from Legacy BIOS or CSM to UEFI. Microsoft's Secure Boot article calls out that same boot-mode change explicitly.
Converting an MBR system disk
If the disk is MBR, switching firmware to UEFI on its own produces an unbootable machine. Convert first. MBR2GPT.EXE ships in Windows\System32 on every supported Windows version and can validate without changing anything.
Destructive-risk warning. MBR2GPT /convert repartitions the system disk. Microsoft's own tool output says "If conversion is successful the disk can only be booted in GPT mode. These changes cannot be undone!" and the documentation states that after conversion "the firmware must be reconfigured to boot in UEFI mode". It also warns that a BitLocker-encrypted volume must have protection suspended first, and that existing protectors then need to be deleted and recreated. Run /validate on a pilot device, confirm return code 0, and have a tested recovery path before you touch a fleet. Return code 7 means the disk layout does not meet requirements, and 6 means a volume is encrypted.
The bypass question, answered honestly
Two registry approaches circulate for installing Windows 11 on ineligible hardware. Being precise about their documentation status matters more here than anywhere else in this article, because the consequence is your support position.
| Subkey and value | Claimed effect | Documentation status |
|---|---|---|
MoSetup → AllowUpgradesWithUnsupportedTPMOrCPU (REG_DWORD) | Allows an in-place upgrade to proceed with an unsupported CPU or TPM | Circulated everywhere, including Microsoft Q&A threads, which are user-generated content. I could not verify it on any current Microsoft-official documentation page. Treat as undocumented |
LabConfig → BypassTPMCheck, BypassSecureBootCheck and similar | Skips individual checks during a clean install started from media | Undocumented. No Microsoft documentation page defines these values |
Two observations from the live device, offered as facts rather than advice. The MoSetup key exists by default on this Windows 11 Enterprise build, and it is empty, which contradicts the common instruction that you must create the key yourself. And LabConfig does not exist on a running OS at all, because it is an install-time construct rather than something a managed device carries.
What Microsoft actually says about installing on ineligible hardware. This is the documented consequence, and it is not ambiguous. The support article states that a device not meeting the requirements "won't receive support from Microsoft", and that such devices are "not guaranteed to receive updates, including but not limited to security updates". The text presented at install time goes further: "If you proceed with installing Windows 11, your PC will no longer be supported and won't be entitled to receive updates. Damages to your PC due to lack of compatibility aren't covered under the manufacturer warranty." Microsoft also recommends rolling back to Windows 10 immediately if Windows 11 was installed on a device that does not meet the requirements. In a managed estate, that is a decision for whoever owns the risk register, not for whoever is closing the ticket. This article does not recommend it, and the companion script deliberately cannot write any of these values.
Group Policy: no policy makes a device eligible
Say this plainly, because it saves hours of searching: there is no Group Policy setting, no CSP and no Intune configuration profile that makes an ineligible device eligible for Windows 11. Eligibility is a hardware fact evaluated on the device. Policy controls what is offered, not what is possible.
Two policies genuinely matter around this problem, and both are in the same ADMX file, WindowsUpdate.admx.
To reach the safeguard policy in the Group Policy Editor:
- Run
gpedit.mscon the device, or open your domain GPO in the Group Policy Management Editor. - Expand Computer Configuration.
- Expand Administrative Templates.
- Expand Windows Components.
- Expand Windows Update.
- Select Manage updates offered from Windows Update.
- Open Disable safeguards for Feature Updates and set it to Enabled only for validation devices.
- In the same folder, Select the target Feature Update version controls which release is offered, using the product name and version fields.
To make the appraiser's verdict visible to your reporting at all, diagnostic data has to be on. That is a separate policy:
- Open the Group Policy Management Console or
gpedit.msc. - Expand Computer Configuration, then Administrative Templates, then Windows Components.
- Select Data Collection and Preview Builds.
- Open Allow diagnostic data, which is named Allow telemetry on Windows 10 version 1809 and earlier.
- Choose the level. The documented values are
0for diagnostic data off,1for Required,2for Enhanced and3for Optional. - Set at least Required if you want readiness reporting to work. Microsoft's Configuration Manager readiness dashboard prerequisites state that telemetry should be enabled at basic level and hardware inventory enabled on clients.
Intune: the same reality, plus a report worth using
The two Windows Update policies above exist in the Settings Catalog and as CSPs. The safeguard one is ./Device/Vendor/MSFT/Policy/Config/Update/DisableWUfBSafeguards, where 0 is the default and means safeguards are enabled, and 1 means upgrades deploy without blocking on safeguards. Diagnostic data is System/AllowTelemetry.
To create that profile:
- Sign in to the Microsoft Intune admin center.
- Go to Devices, then Configuration.
- Select Create, then New policy.
- Platform: Windows 10 and later. Profile type: Settings catalog.
- Select Add settings and search for Disable WUfB Safeguards, or for Allow Telemetry for the diagnostic data setting.
- Set the value, assign the profile to a small validation group only, and save.
The genuinely useful Intune surface for this problem is not a policy at all. It is a report. Endpoint analytics has a Work from anywhere report whose Windows tab gives a device-by-device view of Windows 11 hardware readiness. The Windows 11 readiness status column shows Capable, Not capable, Upgraded or Unknown, and the Windows 11 readiness reason column names the specific hardware requirements that are not met. Selecting Windows on the Overview page shows a chart of the top hardware blockers across the tenant.
That chart is the difference between "we need a hardware refresh" and "four hundred devices need a firmware toggle". Microsoft's documentation also notes that devices showing Unknown are usually inactive rather than broken, so check last check-in time before you treat them as a problem.
Windows Update for Business already protects you here. Microsoft's planning guidance states that organisations using Windows Update client policies get the benefit of "ensuring that devices that don't meet the minimum hardware requirements aren't automatically offered the Windows 11 upgrade", plus more insight into which safeguard holds are blocking individual devices. So an ineligible managed device is not going to be surprised into an upgrade. That also means the absence of an offer is expected behaviour, not a fault to chase.
Defender and security policy: N/A, and why
This topic does not touch Microsoft Defender, attack surface reduction, exploit protection, WDAC or the firewall. No Endpoint Security profile influences hardware eligibility, and no ASR rule blocks an upgrade offer. The overlap people expect is TPM and Secure Boot, but those are firmware facts read by the appraiser, not Defender features. Saying N/A here is more useful than inventing a connection, and if a colleague insists Defender is involved, the RedReason value on the device will settle it.
Proof it worked: a real read-only gate report
The companion script for this article, Get-Windows11ReadinessGate.ps1, evaluates every documented gate separately and prints the measured value beside the requirement. It writes nothing. It cannot set a bypass value, cannot touch firmware and cannot change a service.
The output below is a genuine run on the Windows 11 Enterprise device used to write this article, with only the device name replaced. It exited with code 0, and the same script parsed with zero errors on Windows PowerShell 5.1 and PowerShell 7.6 and produced the same verdicts on both.
Three design decisions in that script are worth borrowing for any readiness check you write yourself.
It reports the CPU supported-model gate as MANUAL, not PASS. There is no local database of supported processors to compare against, so claiming a pass would be a guess dressed as a result. It prints the family, model and stepping so you can compare against the published list for the release you are deploying.
It distinguishes a read failure from a genuine absence. If Win32_Tpm returns nothing, the script asks Get-Tpm for a second opinion. Only when that confirms TpmPresent=False does it record a real FAIL. Otherwise the gate is READ-FAILED and the whole run exits 1, because a device wrongly reported as having no TPM is how unnecessary hardware orders get raised.
It treats Confirm-SecureBootUEFI returning False as a pass, with a note explaining why, because the documented requirement is capable and not enabled.
Deploying it read-only at scale. Run it as an Intune platform script or as the detection half of a remediation and collect the -AsJson output. The exit codes are designed for that: 0 means every gate passed, 2 means a gate genuinely failed, and 1 means a read failed and the result should not be trusted. Never collapse 1 and 2 into one bucket, because one of them is a device problem and the other is a data-quality problem.
References
- Windows 11 requirements - the minimum hardware requirements, including the TPM 2.0 and "UEFI, Secure Boot capable" wording.
- Windows Processor Requirements - the per-release supported AMD, Intel and Qualcomm processor lists.
- Manage Windows 11 readiness dashboard - the documented
UpgExcolours and the full list ofRedReasonvalues for Windows 11. - Safeguard holds for Windows - the
GStatus,GatedBlockIdandGatedBlockReasonregistry values and their meanings. - Opt out of safeguard holds - the
Update/DisableWUfBSafeguardsCSP and the "Disable safeguards for Feature Updates" policy, with Microsoft's cautions. - Log files and resolving upgrade errors - the Setup log locations by phase and the documented search strings.
- Get-Tpm and Win32_Tpm class - the TPM properties, including the documented
SpecVersionformat. - Confirm-SecureBootUEFI - the documented True, False and "Cmdlet not supported on this platform" behaviours.
- MBR2GPT - syntax, disk prerequisites, return codes and the warning that conversion cannot be undone.
- Work from anywhere report in endpoint analytics - the Windows 11 readiness status and readiness reason columns.
- Plan for Windows 11 - determining eligibility, and the statement that Windows Update client policies stop ineligible devices being offered the upgrade.
- Windows 11 on devices that don't meet minimum system requirements - the support and update-entitlement statements quoted above.
- IsProcessorFeaturePresent - the documented constants used to read SSE2, NX and CMPXCHG16B.
No community or MVP deep-dive is cited here. I looked for one specifically on reading the Windows 11 hardware gate and could not verify a match on topic, and a fabricated citation is worse than an omitted table.
Download it from Imran76Awan/Windows-11-Scripts — no sign-in required. It is read-only: it reports and never changes a device or anything in Intune. Validate it in your own environment before relying on the output.