Hello B D, Anup, thank you for posting in the Microsoft Q&A community.
There are a few technical reasons why this discrepancy is likely occurring on the IoT Enterprise LTSC edition:
First, Windows 11 IoT Enterprise LTSC is purpose-built for fixed-function devices and optimizes its operating footprint. To reduce attack surfaces and system overhead, many traditional Windows Explorer and Shell extensions—including the property handlers for BitLocker UI components (such as bdeui.dll or fvecpl.dll)—are either stripped down, disabled by default, or have much tighter security boundaries compared to standard Pro and Enterprise editions.
Secondly, the Windows Shell API property System.Volume.BitLockerProtection relies on underlying BitLocker APIs and WMI providers (Win32_EncryptableVolume). While standard Pro/Enterprise editions might allow a standard user token partial read access to UI-driven encryption status (primarily for File Explorer integration), IoT LTSC enforces strict administrative checks at the API boundary. When queried without elevation, the system denies access to the volume metadata and gracefully fails by returning a truncated or empty result (0x000401A0 / VT_EMPTY).
To resolve this issue and retrieve the BitLocker status without running your user-facing application as an Administrator, I recommend the following approaches:
You can delegate WMI read permissions to standard users for the BitLocker namespace, and modify your application to query WMI rather than the Shell API. The Shell API is UI-bound and its implementation can be inconsistent across specialized LTSC SKUs. To do this:
- Open wmimgmt.msc as an administrator.
- Right-click WMI Control (Local) and select Properties.
- Navigate to the Security tab.
- Expand Root -> CIMv2 -> Security -> MicrosoftVolumeEncryption.
- Click Security, add your standard user account (or the Authenticated Users group), and grant them Enable Account and Remote Enable permissions.
Once delegated, your standard user application can execute a WMI query against the
Win32_EncryptableVolumeclass to read theProtectionStatusorConversionStatusproperty natively.
If WMI queries are restricted in your environment's compliance baseline, an alternative workaround is to implement a two-tier model. Since standard users are restricted from querying critical system security states on locked-down LTSC environments, you can create a lightweight Windows Service running as LocalSystem. This service can query the BitLocker status via manage-bde, WMI, or the FVE API, and securely expose the result to your standard user compliance application via Inter-Process Communication (IPC) such as a Named Pipe or shared memory. This aligns seamlessly with Microsoft's best practices for security auditing applications.
To help me further isolate if this is purely a missing Shell DLL registration on this specific LTSC build or a strict permission boundary issue, please provide some additional diagnostic data.
Please run the following PowerShell command to see if the underlying WMI provider is also explicitly blocking access:
Get-CimInstance -Namespace "Root\CIMv2\Security\MicrosoftVolumeEncryption" -ClassName Win32_EncryptableVolume
Please run this command in Command Prompt to verify if the BitLocker property handler is correctly registered in the LTSC registry:
reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\PropertySystem\PropertyHandlers" /s | findstr -i "BitLocker"
Lastly, if possible, run Process Monitor (ProcMon) while executing your C++ code. Look for "Access Denied" or "Name Not Found" events targeting bdeui.dll, fveapi.dll, or volume handles, and share the specific paths that are failing.
Official Microsoft Documentation Reference:
- Win32_EncryptableVolume class: https://learn.microsoft.com/en-us/windows/win32/secprov/win32-encryptablevolume