HomeNewsletterCommunityToolsArchiveBlogAboutQuick Links Subscribe free
← Back to Blog
Intune IntuneWin32Store AppIntuneWinIMEMSIXAutopilotApp DeploymentPowerShell

Microsoft Intune: Win32 vs. Store App Deployment — Complete Guide

IA
Imran Awan
28 June 2026

Every Intune deployment decision eventually comes down to the same question: Win32 or Store? Get it right and apps deploy silently, update automatically, and never appear in your remediation backlog. Get it wrong and you are spending Friday afternoon hunting a failed IME extension, chasing a detection rule that never fires, or explaining why a business-critical app didn't install during Autopilot. This guide covers both methods completely — what they are, when to use each, and how to operate them at scale.

Community credit: The structured comparison in this guide was inspired by handwritten deployment notes created by Anuradha Kumari — a great example of the Microsoft IT community sharing knowledge. The technical depth here expands on that framework with official Microsoft documentation and field-tested PowerShell.

The Core Distinction — Control vs Convenience

Before diving into specifics, understand the fundamental trade-off. Win32 app deployment routes everything through the Intune Management Extension (IME) — an agent that runs on the device and executes your installer with whatever switches, scripts, and detection rules you define. You have complete control. You also carry complete responsibility.

Store app deployment bypasses the local agent entirely. Intune sends a policy to Windows, Windows talks directly to the Microsoft Store (or Windows Package Manager), and the app installs and updates through that cloud channel. You give up fine-grained control. In return, you get automatic updates, no packaging overhead, and no IME dependency chain to debug.

Win32 App Deployment — The Control Engine

Supported types: .msi, .exe, PowerShell-wrapped installers, complex multi-file packages, and anything that runs as a standard Windows executable. If it has a setup.exe, you can deploy it as Win32.

Packaging requirement: Every Win32 app must be converted to the .intunewin format using the Microsoft Win32 Content Prep Tool (IntuneWinAppUtil.exe) before upload. This tool compresses and encrypts the source folder into a single package file that Intune can distribute securely.

01-PackageWin32App.ps1
# Download Win32 Content Prep Tool from GitHub releases
# https://github.com/microsoft/Microsoft-Win32-Content-Prep-Tool

$sourcePath  = "C:\AppPackages\7zip"         # Folder containing setup files
$setupFile   = "7z2301-x64.msi"            # Primary installer filename
$outputPath  = "C:\IntunePackages"         # Where .intunewin will be saved
$prepTool    = "C:\Tools\IntuneWinAppUtil.exe"

& $prepTool -c $sourcePath -s $setupFile -o $outputPath -q

Write-Host "Package created: $outputPath\$($setupFile -replace '\.\w+$','.intunewin')"

Deployment mechanism: The IME agent (Microsoft.Management.Services.IntuneWindowsAgent.exe) polls Intune every 8 hours by default. When a Win32 app assignment is detected, IME downloads the .intunewin package from Azure CDN, decrypts it, and executes the installer silently in the SYSTEM context.

Detection rules: Intune will not mark a Win32 app as installed until the detection rule passes. You can use file/folder detection, registry key detection, MSI product code detection, or a custom PowerShell detection script. Missing or incorrect detection rules are the most common cause of Win32 apps showing as "Failed" even though the software installed successfully.

02-Win32DetectionScript.ps1
# Custom detection script — exits 0 (detected) or 1 (not found)
$appPath = "C:\Program Files\7-Zip\7z.exe"
$minVersion = [version]"23.01.0.0"

if (Test-Path $appPath) {
    $fileVer = [version](Get-Item $appPath).VersionInfo.FileVersion
    if ($fileVer -ge $minVersion) {
        Write-Output "Detected: $fileVer"
        exit 0
    }
}
exit 1

Store App Deployment — The Cloud-Native Route

Supported types: MSIX, Appx, and UWP applications published in the Microsoft Store. These are modern, sandboxed Windows application packages that install, update, and uninstall cleanly without registry sprawl.

Packaging requirement: None. You add a Store app in the Intune portal using either a Direct Store Link (the app's Store URL) or an App URI (e.g., ms-windows-store://pdp/?ProductId=9NBLGGH4NNS1). No file preparation, no upload, no CDN.

Deployment mechanism: Intune sends a WinGet/Windows Package Manager policy to the device. Windows manages the download directly from the Microsoft Store cloud CDN and installs it natively. The Microsoft Store background sync service handles subsequent version updates automatically — no IME involvement, no detection rule required.

Important: Store app deployment requires the Microsoft Store for Business integration to be configured in your Intune tenant, or the newer WinGet-integrated deployment via the Microsoft Store app type added in Intune in 2023. Ensure the Windows Store app service is not blocked by your Conditional Access or firewall policies.

Head-to-Head Comparison

Dimension Win32 Store (MSIX/UWP) Win32 Wins?
Supported formatsMSI, EXE, PowerShellMSIX, Appx, UWP
Packaging requiredYes — .intunewin formatNo — Direct Store Link or App URI
Delivery agentIntune Management Extension (IME)Windows Store + WinGet
Update controlFull admin controlAutomatic via Store
Custom install switchesYes — full command-line controlNo
Pre/post-install scriptsYesNo
Complex dependenciesYes — dependency chainingLimited
Detection rulesRequired (file, reg, MSI, script)Automatic (Store-managed)
Automatic updatesManual (new version required)Automatic
Troubleshooting complexityHigh — IME logs, event viewerLow — Store handles errors
Offline deploymentYes — package cached on Azure CDNNo — requires internet to Store

Win32 Deployment Lifecycle — Step by Step

  1. Package: Run IntuneWinAppUtil.exe against your source folder to produce the .intunewin file.
  2. Upload: Add the Win32 app in the Intune portal (Apps → Windows → Add → Windows app (Win32)). Configure install command, uninstall command, and detection rule.
  3. Assign: Target a user or device group with Required, Available, or Uninstall intent.
  4. IME check-in: On the target device, IME polls for new assignments. Trigger manually: restart the IntuneManagementExtension service.
  5. Download and decrypt: IME downloads the .intunewin from the Azure CDN URL and decrypts it using the embedded key.
  6. Execute: IME runs the install command in the SYSTEM context, capturing stdout/stderr.
  7. Detect: IME runs the detection rule. If it passes, the app is marked Installed. If it fails, the app is marked Failed regardless of exit code.
  8. Maintain: For updates, upload a new .intunewin version and supersede the old assignment.

Store App Deployment Lifecycle

  1. Direct Store link: Find the app in the Microsoft Store, copy its URI or product ID.
  2. Add in Intune: Apps → Windows → Add → Microsoft Store app (new). Search or paste the Store link.
  3. Assign: Target user or device groups. Set install context (user or device).
  4. MDM sync: At next MDM check-in, Windows receives the Store app policy.
  5. Direct cloud install: Windows contacts the Microsoft Store CDN directly and streams the package. No IME involved.
  6. Automatic updates: The Store background sync service checks for new app versions and applies them silently.

Deployment Choice Tree — Which Method to Use

Scenario Recommended Reason
Legacy LOB app (.exe, complex MSI)Win32No Store version; needs custom switches
App available in Microsoft StoreStoreZero packaging overhead, auto-updates
App with pre-install dependency (e.g. .NET)Win32Win32 dependency chaining handles ordering
Microsoft 365 Apps (Office)Win32 (ODT)Office Deployment Tool gives full channel control
Consumer/productivity app (VLC, 7-Zip)Store (WinGet)Available in Store; updates handled automatically
App requiring post-install registry writesWin32Post-install PowerShell script via Win32 wrapper
App needing strict version pinningWin32Store auto-updates break version pinning requirements

Autopilot & App Ingestion Order

When a new device goes through Autopilot provisioning, applications are not installed simultaneously. Intune follows a strict precedence order determined by app type and assignment. Understanding this prevents the most common Autopilot failure: a user reaching the desktop before critical apps finish installing.

Critical setting for Autopilot: To block the user from reaching the desktop until required Win32 apps finish installing, set the app assignment intent to Required and enable the "Block device until all required apps are installed" toggle on the Autopilot Enrollment Status Page (ESP).
Phase What happens App types installed
1. Physical HardwareFactory reset, OOBE beginsNone
2. Azure AD / Entra JoinDevice registers in Entra ID, MDM enrollment beginsNone
3. ESP — Device phaseIntune policies and device-targeted apps deploy. IME installs. Win32 Required apps deploy here.Win32 (device), Store (device), LOB MSI
4. ESP — Account phaseUser signs in. User-targeted Required apps deploy.Win32 (user), Store (user)
5. Desktop unlockedDevice Readiness complete. User can work.Available apps install on-demand

Checking Deployment Status via PowerShell

03-CheckWin32AppStatus.ps1
# Get Win32 app deployment status for all devices via Graph API
Connect-MgGraph -Scopes "DeviceManagementApps.Read.All"

$win32Apps = Get-MgDeviceAppManagementMobileApp -Filter "isOf('microsoft.graph.win32LobApp')"

foreach ($app in $win32Apps) {
    Write-Host "`n=== $($app.DisplayName) ===" -ForegroundColor Cyan
    $states = Get-MgDeviceAppManagementMobileAppDeviceStatuses -MobileAppId $app.Id
    $states | Select-Object DeviceName, InstallState, LastSyncDateTime |
        Sort-Object InstallState | Format-Table -AutoSize
}
04-TriggerIMESync.ps1
# Force IME to re-evaluate app assignments on local device (requires local admin)

# Method 1: Restart the IME service
Restart-Service -Name "IntuneManagementExtension" -Force

# Method 2: Trigger the IME scheduled task
Get-ScheduledTask | Where-Object { $_.TaskName -like "*Intune*" } |
    Start-ScheduledTask

# Method 3: Check IME logs for recent activity
$logPath = "$env:ProgramData\Microsoft\IntuneManagementExtension\Logs\IntuneManagementExtension.log"
Get-Content $logPath -Tail 50 | Select-String "Win32App|Install|Error|Failed"

IME Log — Reading Win32 App Failures

When a Win32 app reports Failed, the IME log at C:\ProgramData\Microsoft\IntuneManagementExtension\Logs\IntuneManagementExtension.log is your primary diagnostic source.

Log pattern Meaning Fix
ExitCode: 1603Fatal error during installationCheck for pending reboot; run installer manually as SYSTEM
Detection failedInstaller succeeded but detection rule returned no matchVerify detection path/registry key exists on device
ContentPrepProviderDownload or decryption issueCheck proxy/firewall for *.manage.microsoft.com
Dependency failedA dependency app did not install firstCheck dependency app is assigned and not failing separately
ExitCode: 3010Install succeeded, reboot requiredAdd 3010 as "Success + reboot" in return codes

Community Perspective

r/Intune community consensus: "Win32 for anything business-critical, Store for productivity tools where you don't need to control the version." A frequently upvoted thread: "The moment I stopped fighting Store apps and just used Win32 for everything LOB, my failure rate dropped to near zero. More work upfront, zero surprises in production."
LinkedIn field engineers: The most common Win32 mistake: writing detection rules that check the installer's temp extraction path rather than the final install location. The installer succeeds, the temp path exists briefly, detection fires — then the temp path is cleaned up and the app shows as uninstalled on next check-in.
MVP perspective — Michael Niehaus (Microsoft): Michael consistently emphasises that Win32 app deployment during Autopilot requires careful ESP configuration. His recommendation: always test app installs in the ESP Device Phase before enabling the blocking option in production — a single failed Required app will block every Autopilot device from completing. Full guidance at oofhours.com.
MVP perspective — Rudy Ooms (Call4Cloud): Rudy's key finding on IME internals: IME uses a local SQLite database at C:\ProgramData\Microsoft\IntuneManagementExtension\DB to track app state. If this database becomes corrupted after a botched upgrade or rollback, apps permanently report incorrect state. Fix: stop the IME service, delete the DB file, restart the service. IME re-syncs from the Intune portal within minutes.
MVP perspective — Peter van der Woude: Peter's widely-cited detection rule guidance: "Never detect on an MSI product code alone for complex apps — detect on the actual binary that users will run, with a version check." This catches partial installs and upgrade failures that MSI product code detection misses entirely.

Official Resources

Share this post
LinkedIn X / Twitter Reddit Bluesky

More from EndpointWeekly

Intune
Intune Enrollment Error Codes: Complete Troubleshooting Guide
Intune enrollment failing with a hex error code? This complete reference covers every…
Intune
Top 10 Intune PowerShell Commands Every Admin Should Know
These 10 Microsoft Graph PowerShell commands are the foundation every IT admin and EUC…
Autopilot
Windows Autopilot: Complete Device Lifecycle Management Guide
Zero-touch provisioning from factory to fully managed desktop. Complete guide to…