Init Go-IntuneWin32App-Bulk.ps1
Signed-off-by: Georg Pfuetzenreuter <georg@lyergic.dev>
This commit is contained in:
parent
463613998d
commit
f7b9c8b0b1
164
Go-IntuneWin32App-Bulk.ps1
Normal file
164
Go-IntuneWin32App-Bulk.ps1
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
###
|
||||||
|
# Creeated: 03/11/2021 - georg@lysergic.dev
|
||||||
|
# Modified: 09/11/2021 - georg@lysergic.dev - Added Intune API based app upload/creation
|
||||||
|
# Modified: 10/11/2021 - georg@lysergic.dev - Added Intune API based app assignment
|
||||||
|
# Modified: 10/11/2021 - georg@lysergic.dev - Added Retry block to catch notPublished assignment errors
|
||||||
|
#
|
||||||
|
# Required structure:
|
||||||
|
# ..\Packages - Sources
|
||||||
|
# ..\Intune - Intune Output
|
||||||
|
# ..\Meta - Package specific configuration (version, architecture and detection method)
|
||||||
|
# ./IntuneWinAppUtil.exe - Tool
|
||||||
|
# ./ServiceUI.exe - System context wrapper
|
||||||
|
#
|
||||||
|
# Other prerequesites:
|
||||||
|
# $ Connect-MSIntuneGraph -TenantID <customer>.onmicrosoft.com -ClientID <API Application ID> -Verbose
|
||||||
|
# Tip: utilize ./connect-<customer>.ps1 if available
|
||||||
|
###
|
||||||
|
|
||||||
|
# to-do: move GroupID into a config file. allow for multiple groups.
|
||||||
|
$GroupID = "<DEVEL USER ASSIGNMENT GROUP>"
|
||||||
|
|
||||||
|
# Create IntuneWin blackbox files:
|
||||||
|
Write-Host "`nBulk Action 1/2: " -ForegroundColor White -BackgroundColor Blue
|
||||||
|
Write-Host "Processing of .intunewin files started ...`n"
|
||||||
|
$init_name = "ServiceUI"
|
||||||
|
$init_suffix = "exe"
|
||||||
|
foreach ($app in Get-ChildItem ..\Packages\) {
|
||||||
|
Copy-Item .\ServiceUI.exe ..\Packages\$app\
|
||||||
|
$basedir = "..\Intune"
|
||||||
|
$outdir = "$basedir\$app"
|
||||||
|
If (!(test-path $basedir\$app.intunewin)) {
|
||||||
|
New-Item -ItemType Directory -Force -Path $outdir
|
||||||
|
.\IntuneWinAppUtil.exe -c "..\Packages\$app" -s "$init_name.$init_suffix" -o "$outdir"
|
||||||
|
Move-Item $outdir\$init_name.intunewin $basedir\$app.intunewin
|
||||||
|
Remove-Item $outdir
|
||||||
|
} else {
|
||||||
|
Write-Host "Skipping IntuneWin creation: " -ForegroundColor Yellow -NoNewline
|
||||||
|
Write-Host "An intunewin file for $app already exists."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create Win32App objects in Intune and Upload the IntuneWin files we created above:
|
||||||
|
Write-Host "`nBulk Action 2/2: " -ForegroundColor White -BackgroundColor Blue
|
||||||
|
Write-Host "Processing of Intune Win32App objects started ...`n"
|
||||||
|
foreach ($IntuneFile in Get-ChildItem ..\Intune\) {
|
||||||
|
$Version = $null
|
||||||
|
$Architecture = $null
|
||||||
|
$ProductCode = $null
|
||||||
|
$DetectionScriptFile = $null
|
||||||
|
$Key = $null
|
||||||
|
$ValueName = $null
|
||||||
|
$ValueContent = $null
|
||||||
|
$Operator = $null
|
||||||
|
|
||||||
|
$IntuneWinPath = "..\Intune\$IntuneFile"
|
||||||
|
$IntuneWinFile = "$IntuneFile"
|
||||||
|
$DisplayNameConstruct = $IntuneWinFile.Replace("_"," ").Replace(".intunewin","")
|
||||||
|
$app = $IntuneWinFile.Replace(".intunewin","")
|
||||||
|
$DisplayName = "MEM - $DisplayNameConstruct"
|
||||||
|
|
||||||
|
$Win32App = Get-IntuneWin32App -DisplayName "$DisplayName"
|
||||||
|
If ($Win32App) {
|
||||||
|
Write-Host "Skipping Win32App creation: " -ForegroundColor Yellow -NoNewline
|
||||||
|
Write-Host "$DisplayName might already exist in Intune."
|
||||||
|
} else {
|
||||||
|
Write-Host "Creating and uploading Win32App: " -ForegroundColor Blue -NoNewline
|
||||||
|
Write-Host "$DisplayName"
|
||||||
|
If (Test-Path -Path ..\Meta\$app) {
|
||||||
|
Get-Content ..\Meta\$app | Where-Object {$_.length -gt 0} | Where-Object {!$_.StartsWith("#")} | ForEach-Object {
|
||||||
|
$var = $_.Split('=',2).Trim()
|
||||||
|
Set-Variable -Scope Script -Name $var[0] -Value $var[1]
|
||||||
|
}
|
||||||
|
switch ($DetectionMethod) {
|
||||||
|
msi { $DetectionRule = New-IntuneWin32AppDetectionRuleMSI -ProductCode "$ProductCode" }
|
||||||
|
script { $DetectionRule = New-IntuneWin32AppDetectionRuleScript -ScriptFile $DetectionScriptFile -EnforceSignatureCheck $false -RunAs32Bit $false }
|
||||||
|
registry-integer { $DetectionRule = New-IntuneWin32AppDetectionRuleRegistry -KeyPath "$Key" -ValueName "$ValueName" -IntegerComparison -IntegerComparisonOperator "$Operator" -IntegerComparisonValue "$ValueContent" }
|
||||||
|
file { $DetectionRule = New-IntuneWin32AppDetectionRuleFile -FileOrFolder file -Path "$FilePath" -DetectionType exists -Existence }
|
||||||
|
default { Write-Host "Error: " -ForegroundColor Red -NoNewline
|
||||||
|
Write-Host "Broken metafile or invalid DetectionMethod. Aborting further processing."
|
||||||
|
Exit 1 }
|
||||||
|
}
|
||||||
|
$InstallCommandLine = "ServiceUI.exe -process:explorer.exe `"Deploy-Application.exe`""
|
||||||
|
$UninstallCommandLine = "ServiceUI.exe -process:explorer.exe `"Deploy-Application.exe -DeploymentType Uninstall`""
|
||||||
|
$IntuneDescription = "$DisplayNameConstruct $Version $Architecture"
|
||||||
|
$IntuneDisplayName = "$DisplayName $Version"
|
||||||
|
If (test-path ..\Logos\$app.png) {
|
||||||
|
$ImageFile = "..\Logos\$app.png"
|
||||||
|
$Icon = New-IntuneWin32AppIcon -FilePath (Resolve-Path $ImageFile)
|
||||||
|
Add-IntuneWin32App -FilePath (Resolve-Path $IntuneWinPath) -DisplayName $IntuneDisplayName -Description $IntuneDescription -Publisher "Atos" -InstallExperience "system" -RestartBehavior "suppress" -DetectionRule $DetectionRule -InstallCommandLine $InstallCommandLine -UninstallCommandLine $UninstallCommandLine -Icon $Icon
|
||||||
|
} ElseIf (test-path ..\Logos\$app.jpg) {
|
||||||
|
$ImageFile = "..\Logos\$app.jpg"
|
||||||
|
$Icon = New-IntuneWin32AppIcon -FilePath (Resolve-Path $ImageFile)
|
||||||
|
Add-IntuneWin32App -FilePath (Resolve-Path $IntuneWinPath) -DisplayName $IntuneDisplayName -Description $IntuneDescription -Publisher "Atos" -InstallExperience "system" -RestartBehavior "suppress" -DetectionRule $DetectionRule -InstallCommandLine $InstallCommandLine -UninstallCommandLine $UninstallCommandLine -Icon $Icon
|
||||||
|
} ElseIf (test-path ..\Logos\$app.jpeg) {
|
||||||
|
$ImageFile = "..\Logos\$app.jpeg"
|
||||||
|
$Icon = New-IntuneWin32AppIcon -FilePath (Resolve-Path $ImageFile)
|
||||||
|
Add-IntuneWin32App -FilePath (Resolve-Path $IntuneWinPath) -DisplayName $IntuneDisplayName -Description $IntuneDescription -Publisher "Atos" -InstallExperience "system" -RestartBehavior "suppress" -DetectionRule $DetectionRule -InstallCommandLine $InstallCommandLine -UninstallCommandLine $UninstallCommandLine -Icon $Icon
|
||||||
|
} else {
|
||||||
|
Add-IntuneWin32App -FilePath (Resolve-Path $IntuneWinPath) -DisplayName $IntuneDisplayName -Description $IntuneDescription -Publisher "Atos" -InstallExperience "system" -RestartBehavior "suppress" -DetectionRule $DetectionRule -InstallCommandLine $InstallCommandLine -UninstallCommandLine $UninstallCommandLine
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Write-Host "Skipping Win32App creation: " -ForegroundColor Yellow -NoNewline
|
||||||
|
Write-Host "I couldn't find a metafile at ..\Meta\$app."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# If the app output was empty earlier, it should now contain a freshly created app:
|
||||||
|
If (!($Win32App)) {
|
||||||
|
$Win32App = Get-IntuneWin32App -DisplayName "$DisplayName"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Assign the app to our user group, if it is not assigned already:
|
||||||
|
$Win32AppAssignment = Get-IntuneWin32AppAssignment -ID $Win32App.id
|
||||||
|
|
||||||
|
If ($Win32AppAssignment) {
|
||||||
|
Write-Host "Skipping Assignment: " -ForegroundColor Yellow -NoNewline
|
||||||
|
Write-Host "$DisplayName seems to be assigned already."
|
||||||
|
} Else {
|
||||||
|
Add-IntuneWin32AppAssignmentGroup -Include -ID $Win32App.id -GroupID $GroupID -Intent "available" -Notification "hideAll"
|
||||||
|
}
|
||||||
|
|
||||||
|
$AssignmentLoop = $false
|
||||||
|
$AssignmentTries = "3"
|
||||||
|
[int]$AssignmentRetryCount = "0"
|
||||||
|
do {
|
||||||
|
$AssignmentRetryCount = $AssignmentRetryCount + 1
|
||||||
|
try {
|
||||||
|
If ($Win32App.publishingState -eq 'notPublished') {
|
||||||
|
Write-Host "Warning: " -ForegroundColor Yellow -NoNewline
|
||||||
|
Write-Host "$DisplayName is not marked as `"published`" yet!"
|
||||||
|
$AssignmentLoop = $false
|
||||||
|
throw "1"
|
||||||
|
} ElseIf ($Win32App.publishingState -eq 'published') {
|
||||||
|
Write-Host "OK: " -ForegroundColor Green -NoNewline
|
||||||
|
Write-Host "Finished processing of $DisplayName."
|
||||||
|
$AssignmentLoop = $true
|
||||||
|
} Else {
|
||||||
|
Write-Host "Error: " -ForegroundColor Red -NoNewline
|
||||||
|
Write-Host "Processing of $DisplayName failed. Unhandled publishingState. You should debug this."
|
||||||
|
$AssignmentLoop = $false
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
If ($AssignmentRetryCount -ge $AssignmentTries) {
|
||||||
|
Write-Host "Error: " -ForegroundColor Red -NoNewline
|
||||||
|
Write-Host "Failed to aquire `"published`" state. Stopping further processing of $DisplayName."
|
||||||
|
Write-Host "You might need to run this script again in a few minutes for the assignment to push. " -NoNewline
|
||||||
|
Write-Host "If you already run this script twice and it still doesn't work, please delete the app from Intune before trying it again - consider using the following command:"
|
||||||
|
Write-Host "`` Remove-IntuneWin32App -ID"$Win32App.id"`` `nGood luck!"
|
||||||
|
$AssignmentLoop = $true
|
||||||
|
#throw $_.Exception
|
||||||
|
} Else {
|
||||||
|
#Write-Host "Warning: " -ForegroundColor Yellow -NoNewline
|
||||||
|
#Write-Host "Failed to aquire `"published`" state. Trying again in 20 seconds ..."
|
||||||
|
Write-Host "Trying again in 20 seconds - " -NoNewline
|
||||||
|
Write-Host "This was attempt $AssignmentRetryCount out of $AssignmentTries..."
|
||||||
|
Start-Sleep -Seconds 20
|
||||||
|
$Win32App = Get-IntuneWin32App -DisplayName "$DisplayName"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while ($AssignmentLoop -eq $false)
|
||||||
|
Write-Host "`n"
|
||||||
|
}
|
||||||
|
# EOF
|
Reference in New Issue
Block a user