Private/Send-Intunepackage.ps1
function Send-intunepackage { [CmdletBinding()] Param ( [parameter(Position = 0, Mandatory = $true)] [ValidateNotNullOrEmpty()][String]$Package, [parameter(Position = 1, Mandatory = $true)] [ValidateNotNullOrEmpty()][String]$IntuneBody, [parameter(Position = 1, Mandatory = $true)] [ValidateNotNullOrEmpty()][pscustomobject]$EncryptionInfo ) $Baseuri = "https://graph.microsoft.com/beta/deviceAppManagement/mobileApps" write-verbose "Creating $($Package) on intune platform" $InTuneProfileURI = "$($BaseURI)" Write-Verbose "Creating Intune Application" $NewApp = Invoke-RestMethod -Uri $InTuneProfileURI -Headers $Script:GraphHeader -body $intuneBody -Method POST -ContentType "application/json" $ContentBody = $EncryptionInfo | Select-Object Name, Size, sizeEncrypted | ConvertTo-Json Write-Verbose "Sending expected encrypted body size to Graph API: $ContentBody" $ContentReq = Invoke-RestMethod -Uri "$($BaseURI)/$($NewApp.id)/microsoft.graph.win32lobapp/contentVersions/1/files/" -Headers $script:GraphHeader -body $ContentBody -Method POST -ContentType "application/json" Write-Verbose "Trying to get file uri for $package" do { Write-Verbose " Still trying to get file uri. Please wait." $AzFileUriCheck = "$($BaseURI)/$($NewApp.id)/microsoft.graph.win32lobapp/contentVersions/1/files/$($ContentReq.id)" $AzFileUri = Invoke-RestMethod -Uri $AzFileUriCheck -Headers $script:GraphHeader -Method get -ContentType "application/json" if ($AZfileuri.uploadState -like "*fail*") { break } start-sleep 5 } while ($null -eq $AzFileUri.AzureStorageUri) Write-Verbose "Retrieved upload URL. Uploading package $($package) via AzCopy." $InstallerDir = [System.IO.Path]::GetDirectoryName("$($InstallerPath)") $ExtactedEncFile = "$($InstallerDir)\$($EncryptionInfo.name)" write-host "Trying to upload $($ExtactedEncFile)" $UploadResults = & "$($ENV:Temp)\IntuneRMMHelper\azCopy.exe" cp "$($ExtactedEncFile)" "$($Azfileuri.AzureStorageUri)" --block-size-mb 4 --output-type 'json' $EncBody = $EncryptionInfo | Select-Object fileEncryptionInfo | ConvertTo-Json $CommitReq = Invoke-RestMethod -Uri "$($BaseURI)/$($NewApp.id)/microsoft.graph.win32lobapp/contentVersions/1/files/$($ContentReq.id)/commit" -Headers $script:GraphHeader -body $EncBody -Method POST -ContentType "application/json" do { write-verbose "Still trying to get commit state. Please wait." $CommitStateReq = Invoke-RestMethod -Uri "$($BaseURI)/$($NewApp.id)/microsoft.graph.win32lobapp/contentVersions/1/files/$($ContentReq.id)" -Headers $script:GraphHeader -Method get -ContentType "application/json" if ($CommitStateReq.uploadState -like "*fail*") { throw "Commit Failed for $($Package). Moving on to Next application. Manual intervention will be required" } start-sleep 10 } while ($CommitStateReq.uploadState -eq "commitFilePending") if ($CommitStateReq.uploadState -like "*fail*") { continue } write-verbose "Commiting application version" $ConfirmBody = @{ "@odata.type" = "#microsoft.graph.win32lobapp" "committedContentVersion" = "1" } | Convertto-Json $CommitFinalizeReq = Invoke-RestMethod -Uri "$($BaseURI)/$($NewApp.id)" -Headers $script:GraphHeader -body $Confirmbody -Method PATCH -ContentType "application/json" Write-Verbose "checking if path contains logo.png, and if so, uploading logo to intune" if (test-path "$Installerdir\logo.png") { Write-Verbose " found logo.png. Trying to upload image" $base64Logo = [convert]::ToBase64String((get-content "$Installerdir\logo.png" -encoding byte)) $LogoBody = [ordered]@{ "@odata.type" = "#microsoft.graph.win32lobapp" "largeIcon" = [ordered]@{ "type" = "image/png" "value" = $base64logo } } | Convertto-Json Write-Verbose "using $($BaseURI)/$($NewApp.id) for logo upload" Write-Verbose $LogoBody $LogoPatchRequest = Invoke-RestMethod -Uri "$($BaseURI)/$($NewApp.id)" -Headers $script:GraphHeader -body $LogoBody -Method PATCH -ContentType "application/json" } Write-Verbose "Removing temporary files as everything has been uploaded." $Cleanup = get-childitem $InstallerDir -Filter *.intunewin | remove-item -Force return $($NewApp.id) } |