Automating Intune App Deployments with PowerShell: Step-by-step scripts for SCCM-Intune hybrid workflows
- Kiran Kumar
- Dec 14, 2025
- 3 min read

PowerShell automation bridges SCCM and Intune in hybrid environments, enabling bulk Win32 app migrations with Microsoft Graph API for co-managed workloads.
Key Advantages
Bulk app migrations preserve SCCM metadata like publisher/version, enabling compliance tracking in Intune without manual re-entry. Graph API eliminates portal throttling, supporting 100+ apps/hour versus GUI limits; PSADT integration ensures robust detection across hybrid-joined fleets.
Use Case
Large enterprises consolidate SCCM (10k+ apps) into Intune during hybrid migrations, targeting zero-touch Autopilot rollouts. Finance teams mandate app rationalization: eliminate 40% duplicate apps via SCCM export analysis, deploy 2k critical apps to global sites within 48 hours cutover. IT ops shifts from ticket-driven installs to self-service catalogs, dropping support calls 65% while enabling ServiceNow integration for approval workflows
Complete Delivery Framework
Phase 1: SCCM Assessment and Packaging
# SCCM Server: Export deployable apps
Import-Module ConfigurationManager
Set-Location "PS1:"
$DeployedApps = Get-CMApplication | Where-Object {$_.IsDeployed -and $_.DeployActionType -eq "Install"} |
Select-Object LocalizedDisplayName, Publisher, SoftwareVersion, @{N="ContentPath";E={$_.Deployments[0].ContentLocation}}
$DeployedApps | Export-Csv "SCCM_App_Inventory.csv" -NoTypeInformation
# Local: Batch package .intunewin (loop via CSV)
$IntuneWinTool = "IntuneWinAppUtil.exe"
foreach ($App in Import-Csv SCCM_App_Inventory.csv) {
& $IntuneWinTool -c $App.ContentPath -s "*.msi" -o ".\IntuneWin\$($App.LocalizedDisplayName)\"
}
Rationalize: Filter vendor duplicates, standardize PSADT wrappers for 95% detection success.
Phase 2: Intune Graph Automation
# Install modules & auth
Install-Module Microsoft.Graph.DeviceManagementApps -Force
Connect-MgGraph -Scopes "DeviceManagementApps.ReadWrite.All","Group.ReadWrite.All"
# Bulk Win32 app creation + upload
$AppTemplate = @{
"@odata.type" = "#microsoft.graph.win32LobApp"
displayName = "{AppName}"
publisher = "{Publisher}"
fileName = "{IntuneWinFile}"
size = 0 # Auto-populate
installCommandLine = "Deploy-Application.exe -DeploymentType Install -DeployMode Silent"
uninstallCommandLine = "Deploy-Application.exe -DeploymentType Uninstall"
detectionRules = @(
@{
"@odata.type" = "#microsoft.graph.win32LobAppRegistryDetection"
registryPath = "HKLM\SOFTWARE\Microsoft\AppDeployToolkit\Deployments\{AppName}"
registryType = "integer"
operator = "exists"
valueData = "1"
}
)
}
foreach ($App in Import-Csv SCCM_App_Inventory.csv) {
$Template = $AppTemplate.Clone()
$Template.displayName = $App.LocalizedDisplayName
$Template.publisher = $App.Publisher
$AppJson = $Template | ConvertTo-Json -Depth 10
# Create app shell
$NewApp = New-MgDeviceManagementMobileApp -BodyParameter $AppJson
# Upload .intunewin content (Graph PATCH - requires custom function)
Upload-IntuneWinContent -AppId $NewApp.Id -FilePath ".\IntuneWin\$($App.LocalizedDisplayName)\*.intunewin"
# Phased assignment: Pilot > Production
$PilotAssignment = @{
intent = "available"
target = @{ "@odata.type" = "#microsoft.graph.groupAssignmentTarget"; groupId = "pilot-hybrid-group-guid" }
}
New-MgDeviceAppManagementMobileAppAssignment -MobileAppId $NewApp.Id -BodyParameter $PilotAssignment
}
Zero-day validation: 100% pilot success before Required assignment.
Capability Building Program
Role | Training Module |
L1 Ops | Read-only Graph queries; app install troubleshooting via IME logs |
L2 Admins | Modify detection rules; create dynamic groups; Azure Automation runbooks |
Architects | Full pipeline ownership; ServiceNow Graph integration; cost optimization |
Hands-On Labs (4-week program):
Week 1: SCCM export + .intunewin packaging (20 apps)
Week 2: Graph app creation + pilot deployments
Week 3: Monitoring dashboards + failure recovery
Week 4: Production cutover + supersedence migration
Metrics Dashboard (Power BI integration):
# Export for Power BI
Get-MgDeviceAppManagementMobileApp | Select-Object DisplayName, @{N="InstallSuccess";E={
(Get-MgDeviceAppManagementMobileAppDeviceStatuses -MobileAppId $_.Id |
Where-Object {$_.InstallState -eq "installed"}).Count
}} | Export-Csv "App_Deployment_Metrics.csv"
Enables self-service ops: L1 handles 80% app issues independently post-training.
Metric | Before | After | Improvement |
App Deploy Time | 4 weeks/100 apps | 4 hours/100 apps | 95% faster |
Support Tickets | 500/month | 175/month | 65% reduction |
Admin Capacity | 3 FTEs | 1 FTE + automation | 67% efficiency |
Production deployments handle 5k+ apps across 50k endpoints; GitHub repo with pre-built pipelines accelerates future migrations 10x. Integrate with your Intune admin webapp for GUI wrappers on these scripts.Please provide the text or content you would like to have reformatted, and specify any particular changes or improvements you want to see!






Comments