├── .gitignore ├── .images └── startpage.png ├── LICENSE ├── README.md ├── Start-IntuneAppCreator.ps1 ├── libaries ├── MaterialDesignColors.dll └── MaterialDesignThemes.Wpf.dll ├── modules ├── appCreator.psm1 ├── uiHandler.psm1 └── utility.psm1 └── xaml ├── message.xaml └── ui.xaml /.gitignore: -------------------------------------------------------------------------------- 1 | .tmp/ 2 | .sources/* 3 | -------------------------------------------------------------------------------- /.images/startpage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JayRHa/Intune-App-Creator/2ae5c7023d06beb7b0fb3a89f9f428a5f8a72126/.images/startpage.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Jannik Reinhard 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Intune-App-Creator 2 | [Blog Post](https://jannikreinhard.com/2022/08/01/introduction-of-the-chocolatey-intune-app-creator/) 3 |
11 | 12 | 13 | Anyone who has worked with Intune and deployed an app knows that this is a bit of work. You have to download the sources, create the IntuneWin file, create the app in Intune. To simplify this I have created the Intune App Creator. With this application you can search within the >9,000 Chocolatey and automatically add this app to your Intune app portfolio with just one click. 14 | 15 |  16 | -------------------------------------------------------------------------------- /Start-IntuneAppCreator.ps1: -------------------------------------------------------------------------------- 1 | <# 2 | Version: 1.0 3 | Author: Jannik Reinhard (jannikreinhard.com) 4 | Script: Start-IntuneAppCreator 5 | Description: 6 | Add cocolatey apps easy to intune 7 | Release notes: 8 | 1.0 : 9 | - Init 10 | 1.1 : 11 | - Only install 'Microsoft.Graph.Devices.CorporateManagement' 12 | - Minor changes 13 | - Bug fixes 14 | 1.2 : 15 | - Rename Tool 16 | - Only allow custom repositories 17 | #> 18 | ########################################################################################################### 19 | ############################################ Functions #################################################### 20 | ########################################################################################################### 21 | function Get-MessageScreen{ 22 | param ( 23 | [Parameter(Mandatory = $true)] 24 | [String]$xamlPath 25 | ) 26 | 27 | [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 28 | Add-Type -AssemblyName PresentationFramework 29 | [xml]$xaml = Get-Content $xamlPath 30 | $global:messageScreen = ([Windows.Markup.XamlReader]::Load((New-Object System.Xml.XmlNodeReader $xaml))) 31 | $global:messageScreenTitle = $global:messageScreen.FindName("TextMessageHeader") 32 | $global:messageScreenText = $global:messageScreen.FindName("TextMessageBody") 33 | $global:button1 = $global:messageScreen.FindName("ButtonMessage1") 34 | $global:button2 = $global:messageScreen.FindName("ButtonMessage2") 35 | 36 | $global:messageScreenTitle.Text = "Initializing Intune App Creator" 37 | $global:messageScreenText.Text = "Starting Intune App Creator" 38 | [System.Windows.Forms.Application]::DoEvents() 39 | $global:messageScreen.Show() | Out-Null 40 | [System.Windows.Forms.Application]::DoEvents() 41 | } 42 | 43 | function Import-AllModules 44 | { 45 | foreach($file in (Get-Item -path "$global:Path\modules\*.psm1")) 46 | { 47 | $fileName = [IO.Path]::GetFileName($file) 48 | if($skipModules -contains $fileName) { Write-Warning "Module $fileName excluded"; continue; } 49 | 50 | $module = Import-Module $file -PassThru -Force -Global -ErrorAction SilentlyContinue 51 | if($module) 52 | { 53 | $global:messageScreenText.Text = "Module $($module.Name) loaded successfully" 54 | } 55 | else 56 | { 57 | $global:messageScreenText.Text = "Failed to load module $file" 58 | } 59 | [System.Windows.Forms.Application]::DoEvents() 60 | } 61 | } 62 | 63 | ########################################################################################################### 64 | ############################################## Start ###################################################### 65 | ########################################################################################################### 66 | # Configure 67 | $global:ChocolateyAppName = 'Chocolatey' 68 | 69 | # App Info 70 | $appName = "Intune App Creator (Unofficial)" 71 | $appVersion = "1.2" 72 | 73 | # Global Var 74 | $global:Path = $PSScriptRoot 75 | $global:PathSources = "$global:Path\.sources" 76 | 77 | $global:Auth = $false 78 | $global:ChocolateyAppId = $null 79 | 80 | ##################### 81 | ####### Start ####### 82 | ##################### 83 | 84 | # Start Start Screen 85 | Get-MessageScreen -xamlPath ("$global:Path\xaml\message.xaml") 86 | $global:messageScreenTitle.Text = "Initializing Intune App Creator" 87 | $global:messageScreenText.Text = "Starting Intune App Creator" 88 | [System.Windows.Forms.Application]::DoEvents() 89 | 90 | # Load all Modules 91 | $global:messageScreenText.Text = "Load all Modules" 92 | [System.Windows.Forms.Application]::DoEvents() 93 | Import-AllModules 94 | 95 | # Init App 96 | $global:messageScreenText.Text = "Init application and load dlls" 97 | [System.Windows.Forms.Application]::DoEvents() 98 | if (-not (Start-Init)){ 99 | Write-Error "Error while loading the dlls. Exit the script" 100 | Write-Warning "Unblock all dlls and restart the powershell seassion" 101 | $global:messageScreen.Hide() 102 | Exit 103 | } 104 | 105 | # Load main windows 106 | $returnMainForm = New-XamlScreen -xamlPath ("$global:Path\xaml\ui.xaml") 107 | $global:formMainForm = $returnMainForm[0] 108 | $xamlMainForm = $returnMainForm[1] 109 | $xamlMainForm.SelectNodes("//*[@Name]") | % {Set-Variable -Name "WPF$($_.Name)" -Value $formMainForm.FindName($_.Name)} 110 | $global:formMainForm.add_Loaded({ 111 | $global:messageScreen.Hide() 112 | $global:formMainForm.Activate() 113 | }) 114 | $theme = [MaterialDesignThemes.Wpf.ResourceDictionaryExtensions]::GetTheme($global:formMainForm.Resources) 115 | [void][MaterialDesignThemes.Wpf.ThemeExtensions]::SetBaseTheme($theme, [MaterialDesignThemes.Wpf.Theme]::'Dark') 116 | [void][MaterialDesignThemes.Wpf.ResourceDictionaryExtensions]::SetTheme($global:formMainForm.Resources, $theme) 117 | $WPFLabelToolName.Content = "$appName - V$appVersion" 118 | $Script:messageQueue = [MaterialDesignThemes.Wpf.SnackbarMessageQueue]::new() 119 | $Script:messageQueue.DiscardDuplicates = $true 120 | 121 | # Load the click actions 122 | $global:messageScreenText.Text = "Load Actions" 123 | [System.Windows.Forms.Application]::DoEvents() 124 | Set-UiAction 125 | Set-UiActionButton 126 | 127 | # Load User Interface 128 | Set-UserInterface 129 | 130 | # Get UserId 131 | $global:messageScreen.Hide() 132 | [void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') 133 | $title = 'Authentication' 134 | $msg = 'Enter your UPN:' 135 | $userId = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title) 136 | $global:messageScreen.Show() 137 | 138 | # Login 139 | $login = Set-LoginOrLogout -userId $userId 140 | if($login -eq $false){ 141 | Write-Error "Error during authentication" 142 | Write-Warning "Please try again" 143 | $global:messageScreen.Hide() 144 | Exit 145 | } 146 | 147 | # Get Custom Repository 148 | $global:repositoryUrl = "" 149 | While("" -eq $repositoryUrl){ 150 | $global:messageScreen.Hide() 151 | [void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') 152 | $title = 'Custom chocolatey repository' 153 | $msg = 'Enter your custom chocolatey repository url (community.chocolatey.org is not allow):' 154 | $repo = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title) 155 | if($repo -like '*chocolatey.org*'){ 156 | [System.Windows.MessageBox]::Show('The chocolatey community repository is not allow.') 157 | }else{$global:repositoryUrl = $repo} 158 | 159 | } 160 | $global:messageScreen.Show() 161 | 162 | # Install IntuneWinAppUtility 163 | $global:messageScreenText.Text = "Download IntuneWinAppUtil" 164 | [System.Windows.Forms.Application]::DoEvents() 165 | Install-IntuneWinAppUtility 166 | 167 | # Install Chocolatey 168 | Install-Chocolatey 169 | 170 | # Get app id from Chocolatey 171 | $global:messageScreenText.Text = "Get App Id from Chocolatey" 172 | [System.Windows.Forms.Application]::DoEvents() 173 | Show-InstallChocolatey 174 | 175 | #Load Form 176 | $formMainForm.ShowDialog() | out-null -------------------------------------------------------------------------------- /libaries/MaterialDesignColors.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JayRHa/Intune-App-Creator/2ae5c7023d06beb7b0fb3a89f9f428a5f8a72126/libaries/MaterialDesignColors.dll -------------------------------------------------------------------------------- /libaries/MaterialDesignThemes.Wpf.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JayRHa/Intune-App-Creator/2ae5c7023d06beb7b0fb3a89f9f428a5f8a72126/libaries/MaterialDesignThemes.Wpf.dll -------------------------------------------------------------------------------- /modules/appCreator.psm1: -------------------------------------------------------------------------------- 1 | <# 2 | .SYNOPSIS 3 | App Creation functions 4 | .DESCRIPTION 5 | App Creation functions 6 | .NOTES 7 | Author: Jannik Reinhard 8 | #> 9 | 10 | ## 11 | function Install-IntuneWinAppUtility { 12 | try { 13 | Invoke-WebRequest -Uri "https://github.com/microsoft/Microsoft-Win32-Content-Prep-Tool/raw/master/IntuneWinAppUtil.exe" -OutFile "$global:PathSources\IntuneWinAppUtil.exe" | Out-Null 14 | 15 | }catch{ 16 | Write-Error "Loading of the IntuneWinAppUtil failed" 17 | return $false 18 | } 19 | 20 | return $true 21 | } 22 | 23 | function Install-Chocolatey { 24 | $testchoco = powershell choco -v 25 | if(-not($testchoco)){ 26 | Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) 27 | choco source remove -n=chocolatey 28 | choco source add -n=customrepository -s="$global:repositoryUrl" 29 | } 30 | } 31 | 32 | function Search-ChocolateyApp { 33 | param ( 34 | [Parameter(Mandatory = $true)] 35 | [String]$searchText 36 | ) 37 | $searchList = choco search $searchText 38 | $version, $searchList = $searchList 39 | 40 | $packages = @() 41 | 42 | $searchList | ForEach-Object{ 43 | if($_ -like '*packages found.*'){return $packages} 44 | $objPackage = $_.Split() 45 | if(-not ($objPackage[0].trim() -eq '' -or $objPackage -like '*Validation*')){ 46 | $package = [PSCustomObject]@{ 47 | Name = $objPackage[0].trim() 48 | Version = $objPackage[1] 49 | } 50 | $packages += $package 51 | } 52 | } 53 | } 54 | 55 | function Get-AppId { 56 | param ( 57 | [Parameter(Mandatory = $true)] 58 | [String]$appName 59 | ) 60 | $appId = @(Get-MgDeviceAppMgtMobileApp -Filter "DisplayName eq '$appName'")[0].Id 61 | return $appId 62 | } 63 | 64 | function Add-Chocolatey{ 65 | $folder = "$global:PathSources\chocolatey" 66 | if(-not (Test-Path $folder)) { 67 | New-Item $folder -Itemtype Directory 68 | } 69 | if(-not (Test-Path "$folder\sources")) { 70 | New-Item "$folder\sources" -Itemtype Directory 71 | } 72 | $iconChocolatey = "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" 73 | if(-not(Test-Path ("$folder\chocolatey.png"))) { 74 | $imagePath = ("$folder\chocolatey.png") 75 | [byte[]]$Bytes = [convert]::FromBase64String($iconChocolatey) 76 | [System.IO.File]::WriteAllBytes($imagePath,$Bytes) 77 | } 78 | 79 | $global:chocolateyInstallationCommand | Out-File "$folder\sources\install.ps1" 80 | $global:chocolateyUnInstallationCommand | Out-File "$folder\sources\uninstall.ps1" 81 | 82 | Start-Sleep -Seconds 1.5 83 | $intuneWinFile = New-IntuneWin32AppPackage -SourceFolder "$folder\sources" -SetupFile "install.ps1" -OutputFolder $folder -IntuneWinAppUtilPath "$global:PathSources\IntuneWinAppUtil.exe" 84 | $detectionRule = New-IntuneWin32AppDetectionRuleFile -Existence -Path "C:\ProgramData\" -FileOrFolder "chocolatey" -DetectionType "exists" 85 | $requirementRule = New-IntuneWin32AppRequirementRule -Architecture All -MinimumSupportedOperatingSystem 1607 86 | $icon = New-IntuneWin32AppIcon -FilePath $imagePath 87 | $installCommandLine = "powershell.exe -executionpolicy bypass .\install.ps1" 88 | $uninstallCommandLine = "powershell.exe -executionpolicy bypass .\uninstall.ps1" 89 | Add-IntuneWin32App -FilePath $intuneWinFile.Path -DisplayName $global:ChocolateyAppName -Publisher 'Chocolatey' -InformationURL 'https://chocolatey.org/' -Description "Chocolatey has the largest online registry of Windows packages. Chocolatey packages encapsulate everything required to manage a particular piece of software into one deployment artifact by wrapping installers, executables, zips, and/or scripts into a compiled package file." -InstallCommandLine $installCommandLine -UninstallCommandLine $uninstallCommandLine -Icon $icon -InstallExperience system -RestartBehavior suppress -DetectionRule $detectionRule -RequirementRule $requirementRule 90 | New-Snackbar -Snackbar $WPFSnackbar -Text 'Chocolate App added to Intune' 91 | } 92 | 93 | function Add-App { 94 | param ( 95 | [Parameter(Mandatory = $true)] 96 | [String]$appName 97 | ) 98 | $appNameUpper = $appName.substring(0,1).toupper()+$appName.substring(1).tolower() 99 | 100 | if(Get-AppId -appName $appNameUpper){ 101 | New-Snackbar -Snackbar $WPFSnackbar -Text "$appNameUpper already exist in your tenant" 102 | return 103 | } 104 | 105 | $folder = "$global:PathSources\$appName" 106 | if(-not (Test-Path $folder)) { 107 | New-Item $folder -Itemtype Directory 108 | } 109 | if(-not (Test-Path "$folder\sources")) { 110 | New-Item "$folder\sources" -Itemtype Directory 111 | } 112 | 113 | $installCommand = '$appName = "' + $appName + '"' + "`n" + @' 114 | $chocoinstall = Get-Command -Name 'choco' -ErrorAction SilentlyContinue -WarningAction SilentlyContinue | Select-Object -ExpandProperty Source 115 | Invoke-Expression "cmd.exe /c $chocoInstall Install $appName -y" -ErrorAction Stop 116 | '@ 117 | $installCommand | Out-File "$folder\sources\install.ps1" 118 | "choco uninstall $appName -y" | Out-File "$folder\sources\uninstall.ps1" 119 | 120 | Start-Sleep -Seconds 1.5 121 | $intuneWinFile = New-IntuneWin32AppPackage -SourceFolder "$folder\sources" -SetupFile "install.ps1" -OutputFolder $folder -IntuneWinAppUtilPath "$global:PathSources\IntuneWinAppUtil.exe" 122 | 123 | $detectionRule = New-IntuneWin32AppDetectionRuleFile -Existence -Path "C:\ProgramData\chocolatey\lib" -FileOrFolder $appName -DetectionType "exists" 124 | $requirementRule = New-IntuneWin32AppRequirementRule -Architecture All -MinimumSupportedOperatingSystem 1607 125 | $installCommandLine = "powershell.exe -executionpolicy bypass .\install.ps1" 126 | $uninstallCommandLine = "powershell.exe -executionpolicy bypass .\uninstall.ps1" 127 | 128 | $appInfo = choco info $appName 129 | $site = ($appInfo | Where-Object {$_ -like '*Software Site*'}).Replace(" Software Site: ", "") 130 | $summary = ($appInfo | Where-Object {$_ -like '*Summary:*'}).Replace(" Summary: ", "") 131 | 132 | Add-IntuneWin32App -FilePath $intuneWinFile.Path -DisplayName $appNameUpper -Publisher 'Chocolatey' -InformationURL $site -Description $summary -InstallCommandLine $installCommandLine -UninstallCommandLine $uninstallCommandLine -InstallExperience system -RestartBehavior suppress -DetectionRule $detectionRule -RequirementRule $requirementRule 133 | 134 | $dependency = New-IntuneWin32AppDependency -ID $global:ChocolateyAppId -DependencyType "AutoInstall" 135 | $appId = Get-AppId -appName $appNameUpper 136 | Add-IntuneWin32AppDependency -ID $appId -Dependency $dependency 137 | New-Snackbar -Snackbar $WPFSnackbar -Text "$appNameUpper is added to your tenant" 138 | } 139 | 140 | 141 | 142 | $global:chocolateyInstallationCommand = @" 143 | Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) 144 | choco source remove -n=chocolatey 145 | choco source add -n=customrepos -s= 146 | "@ + '"' + $global:repositoryUrl + '"' 147 | 148 | $global:chocolateyUnInstallationCommand = @' 149 | $VerbosePreference = 'Continue' 150 | if (-not $env:ChocolateyInstall) { 151 | $message = @( 152 | "The ChocolateyInstall environment variable was not found." 153 | "Chocolatey is not detected as installed. Nothing to do." 154 | ) -join "`n" 155 | 156 | Write-Warning $message 157 | return 158 | } 159 | 160 | if (-not (Test-Path $env:ChocolateyInstall)) { 161 | $message = @( 162 | "No Chocolatey installation detected at '$env:ChocolateyInstall'." 163 | "Nothing to do." 164 | ) -join "`n" 165 | 166 | Write-Warning $message 167 | return 168 | } 169 | 170 | <# 171 | Using the .NET registry calls is necessary here in order to preserve environment variables embedded in PATH values; 172 | Powershell's registry provider doesn't provide a method of preserving variable references, and we don't want to 173 | accidentally overwrite them with absolute path values. Where the registry allows us to see "%SystemRoot%" in a PATH 174 | entry, PowerShell's registry provider only sees "C:\Windows", for example. 175 | #> 176 | $userKey = [Microsoft.Win32.Registry]::CurrentUser.OpenSubKey('Environment') 177 | $userPath = $userKey.GetValue('PATH', [string]::Empty, 'DoNotExpandEnvironmentNames').ToString() 178 | 179 | $machineKey = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\ControlSet001\Control\Session Manager\Environment\') 180 | $machinePath = $machineKey.GetValue('PATH', [string]::Empty, 'DoNotExpandEnvironmentNames').ToString() 181 | 182 | $backupPATHs = @( 183 | "User PATH: $userPath" 184 | "Machine PATH: $machinePath" 185 | ) 186 | $backupFile = "C:\PATH_backups_ChocolateyUninstall.txt" 187 | $backupPATHs | Set-Content -Path $backupFile -Encoding UTF8 -Force 188 | 189 | $warningMessage = @" 190 | This could cause issues after reboot where nothing is found if something goes wrong. 191 | In that case, look at the backup file for the original PATH values in '$backupFile'. 192 | "@ 193 | 194 | if ($userPath -like "*$env:ChocolateyInstall*") { 195 | Write-Verbose "Chocolatey Install location found in User Path. Removing..." 196 | Write-Warning $warningMessage 197 | 198 | $newUserPATH = @( 199 | $userPath -split [System.IO.Path]::PathSeparator | 200 | Where-Object { $_ -and $_ -ne "$env:ChocolateyInstall\bin" } 201 | ) -join [System.IO.Path]::PathSeparator 202 | 203 | # NEVER use [Environment]::SetEnvironmentVariable() for PATH values; see https://github.com/dotnet/corefx/issues/36449 204 | # This issue exists in ALL released versions of .NET and .NET Core as of 12/19/2019 205 | $userKey.SetValue('PATH', $newUserPATH, 'ExpandString') 206 | } 207 | 208 | if ($machinePath -like "*$env:ChocolateyInstall*") { 209 | Write-Verbose "Chocolatey Install location found in Machine Path. Removing..." 210 | Write-Warning $warningMessage 211 | 212 | $newMachinePATH = @( 213 | $machinePath -split [System.IO.Path]::PathSeparator | 214 | Where-Object { $_ -and $_ -ne "$env:ChocolateyInstall\bin" } 215 | ) -join [System.IO.Path]::PathSeparator 216 | 217 | # NEVER use [Environment]::SetEnvironmentVariable() for PATH values; see https://github.com/dotnet/corefx/issues/36449 218 | # This issue exists in ALL released versions of .NET and .NET Core as of 12/19/2019 219 | $machineKey.SetValue('PATH', $newMachinePATH, 'ExpandString') 220 | } 221 | 222 | # Adapt for any services running in subfolders of ChocolateyInstall 223 | $agentService = Get-Service -Name chocolatey-agent -ErrorAction SilentlyContinue 224 | if ($agentService -and $agentService.Status -eq 'Running') { 225 | $agentService.Stop() 226 | } 227 | # TODO: add other services here 228 | 229 | Remove-Item -Path $env:ChocolateyInstall -Recurse -Force -WhatIf 230 | 231 | 'ChocolateyInstall', 'ChocolateyLastPathUpdate' | ForEach-Object { 232 | foreach ($scope in 'User', 'Machine') { 233 | [Environment]::SetEnvironmentVariable($_, [string]::Empty, $scope) 234 | } 235 | } 236 | 237 | $machineKey.Close() 238 | $userKey.Close() 239 | '@ -------------------------------------------------------------------------------- /modules/uiHandler.psm1: -------------------------------------------------------------------------------- 1 | <# 2 | .SYNOPSIS 3 | Hadeling UI 4 | .DESCRIPTION 5 | Handling of the WPF UI 6 | .NOTES 7 | Author: Jannik Reinhard 8 | #> 9 | 10 | ######################################################################################## 11 | ###################################### UI Actions ###################################### 12 | ######################################################################################## 13 | function Set-UiActionButton{ 14 | #App Finder 15 | Add-XamlEvent -object $WPFButtonSearchBox -event "Add_Click" -scriptBlock { 16 | Show-LoadingView 17 | [System.Windows.Forms.Application]::DoEvents() 18 | Set-SearchedApps 19 | [System.Windows.Forms.Application]::DoEvents() 20 | Hide-LoadingView 21 | [System.Windows.Forms.Application]::DoEvents() 22 | } 23 | Add-XamlEvent -object $WPFButtonInstallChocolatey -event "Add_Click" -scriptBlock { 24 | Show-LoadingView 25 | [System.Windows.Forms.Application]::DoEvents() 26 | Add-Chocolatey 27 | [System.Windows.Forms.Application]::DoEvents() 28 | Show-InstallChocolatey 29 | [System.Windows.Forms.Application]::DoEvents() 30 | Hide-LoadingView 31 | [System.Windows.Forms.Application]::DoEvents() 32 | } 33 | 34 | #About 35 | Add-XamlEvent -object $WPFBlogPost -event "Add_Click" -scriptBlock {Start-Process "https://jannikreinhard.com/2022/08/01/introduction-of-the-chocolatey-intune-app-creator/"} 36 | Add-XamlEvent -object $WPFReadme -event "Add_Click" -scriptBlock {Start-Process "https://github.com/JayRHa/Intune-App-Creator"} 37 | Add-XamlEvent -object $WPFButtonAboutWordpress -event "Add_Click" -scriptBlock {Start-Process "https://www.jannikreinhard.com"} 38 | Add-XamlEvent -object $WPFButtonAboutTwitter -event "Add_Click" -scriptBlock {Start-Process "https://twitter.com/jannik_reinhard"} 39 | Add-XamlEvent -object $WPFButtonAboutLinkedIn -event "Add_Click" -scriptBlock {Start-Process "https://www.linkedin.com/in/jannik-r/"} 40 | } 41 | 42 | function Show-LoadingView{ 43 | $WPFLoadingDialog.Visibility="Visible" 44 | $WPFGridMain.IsEnabled=$false 45 | [System.Windows.Forms.Application]::DoEvents() 46 | } 47 | 48 | function Hide-LoadingView{ 49 | $WPFLoadingDialog.Visibility="Collapsed" 50 | $WPFGridMain.IsEnabled=$true 51 | [System.Windows.Forms.Application]::DoEvents() 52 | } 53 | 54 | function Set-UiAction{ 55 | #Add App 56 | Add-XamlEvent -object $WPFDataGridAllApps -event "Add_GotMouseCapture" -scriptBlock { 57 | if($_.OriginalSource.Name -eq 'ButtonAddApp'){ 58 | Show-LoadingView 59 | [System.Windows.Forms.Application]::DoEvents() 60 | 61 | if(-not ($global:ChocolateyAppId)){ 62 | New-Snackbar -Snackbar $WPFSnackbar -Text 'Chocolate App not detected. Click "Install Chocolatey"' 63 | [System.Windows.Forms.Application]::DoEvents() 64 | return 65 | } 66 | Add-App -appName $this.CurrentItem.AppName 67 | [System.Windows.Forms.Application]::DoEvents() 68 | } 69 | Hide-LoadingView 70 | [System.Windows.Forms.Application]::DoEvents() 71 | } 72 | } 73 | 74 | function Show-InstallChocolatey{ 75 | $global:ChocolateyAppId = Get-AppId -appName $global:ChocolateyAppName 76 | if($global:ChocolateyAppId){ 77 | $WPFLabelChocolateyAppId.Content = "App id: $($global:ChocolateyAppId)" 78 | $WPFLabelChocolateyAppId.Visibility="Visible" 79 | $WPFButtonInstallChocolatey.Visibility="Collapsed" 80 | }else{ 81 | $WPFLabelChocolateyAppId.Content = "App id:" 82 | $WPFLabelChocolateyAppId.Visibility="Collapsed" 83 | $WPFButtonInstallChocolatey.Visibility="Visible" 84 | } 85 | } 86 | 87 | 88 | function Set-SearchedApps { 89 | if(-not ($WPFTextboxSearchBoxDevice.Text)){ 90 | $WPFLabelAppCount.Content = "Searchbox is empty" 91 | $WPFLabelAppCount.Foreground = '#FFC31A1A' 92 | return 93 | } 94 | 95 | $packages = @(Search-ChocolateyApp -searchText $WPFTextboxSearchBoxDevice.Text) 96 | [System.Windows.Forms.Application]::DoEvents() 97 | 98 | $global:apps = [System.Data.DataTable]::New() 99 | [void]$global:apps.Columns.AddRange(@('AppName', 'AppVersion')) 100 | $global:apps.primarykey = $global:apps.columns['AppName'] 101 | $WPFDataGridAllApps.ItemsSource = $global:apps.DefaultView 102 | if(($packages).count -gt 0){$packages | ForEach-Object {[void]$global:apps.Rows.Add($_.Name, $_.Version)}} 103 | [System.Windows.Forms.Application]::DoEvents() 104 | 105 | $WPFLabelAppCount.Foreground = 'White' 106 | $WPFLabelAppCount.Content = "$($packages.count) Apps" 107 | [System.Windows.Forms.Application]::DoEvents() 108 | } 109 | 110 | function New-Snackbar { 111 | param ( 112 | $Snackbar, 113 | $Text, 114 | $ButtonCaption 115 | ) 116 | try{ 117 | if ($ButtonCaption) { 118 | $messageQueue.Enqueue($Text, $ButtonCaption, {$null}, $null, $false, $false, [TimeSpan]::FromHours( 9999 )) 119 | } 120 | else { 121 | $messageQueue.Enqueue($Text, $null, $null, $null, $false, $false, $null) 122 | } 123 | $snackbar.MessageQueue = $messageQueue 124 | } 125 | catch{ 126 | Write-Error "No MessageQueue was declared in the window.`n$_" 127 | } 128 | } 129 | 130 | function Set-UserInterface { 131 | # App finder 132 | $iconSearch = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAgVBMVEUAAAAknvMnmfUomfUomfUnmfUpmvUjl/MomPYomfUomfYnmPYpmvYomfUpmvUol/Muov8omvcnmfUomfUmmfIomfUpmPQnmfQomPUomfUnmfMomfUnnesrlf8omfUkku0nm/MomfUomPUnmfUomvQpmfUomfUnmvYomfUomfX///+Vwm5wAAAAKXRSTlMAFYLO9M+DFlLx8lRR/bBACz+v/hTwd3WBskHQDQzzDkKAs+95fc2IfxLEHQcAAAABYktHRCpTvtSeAAAAB3RJTUUH5gYUDicDFaCpggAAAJ5JREFUKM+tkNkOgjAQRVs2obILtaDsgt7//0GJpHFq9Enm6eTc5GZmGPtnuGU7jusdPr0f4DXiaPowQpykaZbjZCRFCbnRGYK2KVQac3gksFFrzHAhgcBVY4PWCLp3IIyqXmMClwQDRo0xLHr2hNtGEgGnh8zA2DdNXSHyjSbM0/aSMjQ9GFeL0y6qIP6+evnl33t59vjh15UGtsc8AfKLD4mzmPrPAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIyLTA2LTIwVDE0OjM5OjAzKzAwOjAwYoXoEAAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMi0wNi0yMFQxNDozOTowMyswMDowMBPYUKwAAAAASUVORK5CYII=" 133 | $iconCount = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAAN0lEQVRIiWNgGAUDDRjhrIor/xkYGBgYOnQwxcgBUHOYyDZgxIDROBgFlIPRVDTwYDQORgHlAADHmRgNDUab0wAAAABJRU5ErkJggg==" 134 | 135 | # About 136 | $iconLinkedIn = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABJ0lEQVRIie2Sr07DUBSHv9N1YmuxGCAMFG5BIJBYeAhCSOpm2wUMju0FyOawPMEegQSFJYHQsTkUCd34k/UgCKQ0KdDugoHP3T/n9+Wee+CfL5DkYrEVbQl0EeaKhCkMUbx+0+m97VkpXado+Gs58yJ0k3tW+kLR8AQLmYIUV4juCBxNY8sUiGon9N3j63G1ATwXFdhZB2pZu0ut0Y1KtA5SNi5AdUWFk9Sg5SazRSrsh4EjYeC8G+xJPBsGjqiySRxvMK5WEF0Fucgt+Ix+0+k9Pbpn4YE8hL57LqhvVLB8GK2VK6O7Wvt+G6A0iU+NCrREXcBGqQNc7s3cGhUQf//niwly8OOCD0+ttSM1EZoc7d9tkcLQQOYgU4DiTSkZIOpNUf8XeQFjeFM4aqoyewAAAABJRU5ErkJggg==" 137 | $iconTwitter = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAACA0lEQVRIie2SP2gTcRTHP+9y1+Qutf4dxCEJHXTUooOtWLqJILqIgrMgAXFqbMUlXUzqqCCosyIu4uBSFBHxz6A4ZQnFFrVasQ62uYsxXp5L06bJ5Uy66NDv+H3vfb7v9/jBhv61pNuBXVl1LNsbFzgDJICPCnd8y8ltXsR3Y95RhH2zY/GJloBk3r1mOU5m+oJU2sF7bO8JcDCg/B7YDiyYyMj0mPMJwFgpqwpC+nfZu79n8tumoADL9sbbwAH6gajC06rqibq5GiCiAovA8QrOu8RV71AzYfksYYqBRHdsdW41zKwqOeleFzjfYL0CvR2pmc8r0eicWfWWgEhIgM5edCKIaN0wG6u9ZeeSa7t7QQ4vW4Mgg77hY1a9vywPIKVGODSeCHBjXqYGE8DLDmgBqn1pdtYEqCH9BvIYGFpfAG9DA3o9Oy3wYp1wFB6FBhSyUpopO8MKZ4HXXfLnq+X4g2bTbDZStncPOADs7IYuIlc+Z6XlJxjNRtX300ARsDumK1MzKftGYHC7mWTOHRBDToNmghZpUKEn4o8UR/sWgoprTrT/plrz35f6TMvcbfh6TNFzoXBlyqByqji67Ue7lpUXpPKlI4jkgIGQbev6IKqXZ37G75KVWlhjy4mSeW9IqJ0UQ4ZVSQBbFL6KMicGb1B96JTjzwpZ+dXBIhv6D/QH8mKgEDaLDDsAAAAASUVORK5CYII=" 138 | $iconWordpress = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAD8ElEQVRIid2VX4iUVRjGf+/5Znfn+2azxT/4J9dZKQpUSDKKErUugoLIyXDcQiMCk4T+XLRuRhcDEbVtGHQRtOJVRbUG6yaBN1uURX/MyEgrMXe2VSMoKXd3vtnd+c7Txcza6mxSl3Uun/Oe53nf5z3nPfBfX3apzeUFNZbScU7mc+CuAy2uHTsF/iuT2xeVw31HCzbxrwWyXaUNhrqBH83oRcnBkrvsFEA4OdJqLljjIW/GUjnrGOqI+v6ZQEEuG8bPG369KdiapCq/usS2gt0CtAENiCHBQCrwPYlSc1CyG3N9xVK4k4L56XSuLvMq+Y0Y62TJ3S5x34I9DqwEWoAMxjIzHkm8O2LyeVVsHfI3tUXxcxfzXSBQtcWvD5w2gnujRnypPjlJw5OT0R+VhiQnaUNb11huRouWF9Q4FpaOmdyDiSUNzuweZOdA90ocx9nXJs3CSGr4JiCbCqPwxKM2Xk1w5FZwPXNbomWHt9nkBRWU0nEOOBmV05/91Nk8UNyR2Y40D5hvxgqkuNiZ2VbckdkuNAeYD1hSHlt3PlufGnTY0Nnf4/V1Fsl8zozeUljqvOplNQGYYxBoAhaYeGzxLoW16O+BEECyFygoVWXzD2HqBXJ1AsAqlByUaJ8sx3dWeZK908yclarEdwF47E0gqe1cm02XblteUDNwhyrJR4LrZxBwCxsZP4NZq0n3Awx2zvoB+OZ8iDQOMNyZOYMYOI8Hlo7T5ZVAW1MwfhpYNFMFUywp4ParXzw3F0DQWythhDg6MGWTodemTjR4DsmUq+e6QMD/PEHTIsyGgMbJJNUOECTB3ppF+2kqLwgm4ocBSkGmTzCKOHZiR3haaCNQLJNeDJypFzD3JQrWmvR+NXNtATj5VPo4cARpLy7ZZFbFf+mwMbA+zPYv6Y5vBpYYNmBya2UcqhMwT7+HPFIP4IEblnaduwbAzPYQRwfA2oGVV3aPrABw5l/3xn4nnwe8J9mDs7wT/XUCUTncVx1cQQvQU0WDLQCDbeErFo5kqY4LEh9sruKZgXmXh1+AbZTZLjwLkW+d3RLWCxwt2IScdaBkdwLPgH0g2ExBjrwlImj/q1+6bwr/7ezoauCIl14y53oMe2LqFV/UZBjqiPow1xegtxK02eC9pVF5ddVDmyZAazYcrb5gF5StogccvA30DnZm3p3OWXdNi6VwJ+Y+dfChx78TldKfZ58dW4gwIAZKwHdOdgWAfBIpZZ+Y2cfFOHr6Yr6/nZRtXWM5QbfDhjD1evmDzXHzMMBI8+gSV3FrcJZHvhVZR/HJTP9MPJf8Mle9qoba4MrJWCVVv0yDYZkddqJ/dkvYP93z/9/6E+aHsqs7a3d1AAAAAElFTkSuQmCC" 139 | $iconBlog = "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" 140 | 141 | 142 | # App finder 143 | $WPFImgSearchBoxDevice.source = Get-DecodeBase64Image -ImageBase64 $iconSearch 144 | $WPFImgAppCount.source = Get-DecodeBase64Image -ImageBase64 $iconCount 145 | 146 | #About 147 | $WPFImgTwitter.source = Get-DecodeBase64Image -ImageBase64 $iconTwitter 148 | $WPFImgWordpress.source = Get-DecodeBase64Image -ImageBase64 $iconWordpress 149 | $WPFImgLinkedIn.source = Get-DecodeBase64Image -ImageBase64 $iconLinkedIn 150 | $WPFImgBlog.source = Get-DecodeBase64Image -ImageBase64 $iconBlog 151 | } -------------------------------------------------------------------------------- /modules/utility.psm1: -------------------------------------------------------------------------------- 1 | <# 2 | .SYNOPSIS 3 | Core functions 4 | .DESCRIPTION 5 | Core functions 6 | .NOTES 7 | Author: Jannik Reinhard 8 | #> 9 | 10 | ## 11 | function Install-PSGalleryModule{ 12 | param 13 | ( 14 | [Parameter(Mandatory=$true)] 15 | $Module 16 | ) 17 | if ($null -eq (Get-Module -ListAvailable -Name $Module)) { 18 | try{ 19 | Install-Module $Module -Scope CurrentUser -Confirm:$false -Repository PSGallery -Force 20 | }catch{ 21 | Write-Error "Something went wrong during the installation of $Module" 22 | return $false 23 | } 24 | } 25 | return $true 26 | } 27 | 28 | function Start-Init { 29 | #Load dll 30 | try { 31 | [System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') | out-null 32 | [System.Reflection.Assembly]::LoadWithPartialName('presentationframework') | out-null 33 | [System.Reflection.Assembly]::LoadFrom("$global:Path\libaries\MaterialDesignThemes.Wpf.dll") | out-null 34 | [System.Reflection.Assembly]::LoadFrom("$global:Path\libaries\MaterialDesignColors.dll") | out-null 35 | }catch{ 36 | Write-Error "Loading from dll's was not sucessfull:" 37 | return $false 38 | } 39 | 40 | if (-not(Install-PSGalleryModule -Module 'IntuneWin32App')){return $false} 41 | 42 | # Create temp folder 43 | if(-not (Test-Path $global:PathSources)) { 44 | New-Item $global:PathSources -Itemtype Directory 45 | }else{ 46 | Remove-Item -Recurse -Force $global:PathSources 47 | New-Item $global:PathSources -Itemtype Directory 48 | } 49 | 50 | 51 | return $true 52 | } 53 | function Get-AuthToken { 54 | [cmdletbinding()] 55 | param 56 | ( 57 | [Parameter(Mandatory=$true)] 58 | $User 59 | ) 60 | 61 | $userUpn = New-Object "System.Net.Mail.MailAddress" -ArgumentList $User 62 | $tenant = $userUpn.Host 63 | $AadModule = Get-Module -Name "AzureAD" -ListAvailable 64 | if ($AadModule -eq $null) { 65 | Install-Module AzureAD -Scope CurrentUser -Confirm:$false 66 | } 67 | $AadModule = Get-Module -Name "AzureAD" -ListAvailable 68 | if ($AadModule -eq $null) { 69 | Write-Host "AzureAD PowerShell module not found, looking for AzureADPreview" 70 | $AadModule = Get-Module -Name "AzureADPreview" -ListAvailable 71 | } 72 | 73 | $adal = Join-Path $AadModule.ModuleBase "Microsoft.IdentityModel.Clients.ActiveDirectory.dll" 74 | $adalforms = Join-Path $AadModule.ModuleBase "Microsoft.IdentityModel.Clients.ActiveDirectory.Platform.dll" 75 | 76 | Add-Type -Path $adal 77 | Add-Type -Path $adalforms 78 | # [System.Reflection.Assembly]::LoadFrom($adal) | Out-Null 79 | # [System.Reflection.Assembly]::LoadFrom($adalforms) | Out-Null 80 | $clientId = "d1ddf0e4-d672-4dae-b554-9d5bdfd93547" 81 | $redirectUri = "urn:ietf:wg:oauth:2.0:oob" 82 | $resourceAppIdURI = "https://graph.microsoft.com" 83 | $authority = "https://login.microsoftonline.com/$Tenant" 84 | 85 | $authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList $authority 86 | $platformParameters = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.PlatformParameters" -ArgumentList "Auto" 87 | $userId = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.UserIdentifier" -ArgumentList ($User, "OptionalDisplayableId") 88 | $authResult = $authContext.AcquireTokenAsync($resourceAppIdURI,$clientId,$redirectUri,$platformParameters,$userId).Result 89 | 90 | 91 | $authHeader = @{ 92 | 'Content-Type'='application/json' 93 | 'Authorization'="Bearer " + $authResult.AccessToken 94 | 'ExpiresOn'=$authResult.ExpiresOn 95 | } 96 | $Global:AuthenticationHeader = $authHeader 97 | return $authHeader 98 | } 99 | 100 | function Get-GraphAuthentication{ 101 | if (-not(Install-PSGalleryModule -Module 'Microsoft.Graph.Devices.CorporateManagement')){return $false} 102 | if (-not(Install-PSGalleryModule -Module 'Microsoft.Graph.Users')){return $false} 103 | if (-not(Install-PSGalleryModule -Module 'Microsoft.Graph.Identity.DirectoryManagement')){return $false} 104 | 105 | try { 106 | $graphLogin = Connect-MgGraph -Scopes 'Application.ReadWrite.All' 107 | $connection = $? 108 | } catch { 109 | Write-Error "Failed to connect to MgGraph" 110 | return $false 111 | } 112 | 113 | if(-not ($connection)) {return $false} 114 | return $true 115 | } 116 | 117 | function Set-LoginOrLogout{ 118 | param( 119 | $userId 120 | ) 121 | if($global:auth){ 122 | Disconnect-MgGraph 123 | 124 | Set-UserInterface 125 | $global:auth = $false 126 | [System.Windows.MessageBox]::Show('You are logged out') 127 | Return 128 | } 129 | 130 | $authHeader = Get-AuthToken -user $userId 131 | $connectionStatus = Get-GraphAuthentication 132 | if(-not $connectionStatus) { 133 | [System.Windows.MessageBox]::Show('Login Failed') 134 | return $false 135 | } 136 | 137 | $global:auth = $true 138 | $graphLogin = Select-MgProfile -Name "beta" 139 | 140 | $user = Get-MgContext 141 | $org = Get-MgOrganization 142 | $upn = $user.Account 143 | 144 | Write-Host "------------------------------------------------------" 145 | Write-Host "Connection to graph success: $Success" 146 | Write-Host "Connected as: $($user.Account)" 147 | Write-Host "TenantId: $($user.TenantId)" 148 | Write-Host "Organizsation Name: $($org.DisplayName)" 149 | Write-Host "------------------------------------------------------" 150 | 151 | $temp = Get-ProfilePicture -upn $upn 152 | 153 | #Set Login menue 154 | $WPFLableUPN.Content = $user.Account 155 | $WPFLableTenant.Content = $org.DisplayName 156 | 157 | return $true 158 | } 159 | 160 | function Get-DecodeBase64Image { 161 | param ( 162 | [Parameter(Mandatory = $true)] 163 | [String]$imageBase64 164 | ) 165 | # Parameter help description 166 | $objBitmapImage = New-Object System.Windows.Media.Imaging.BitmapImage 167 | $objBitmapImage.BeginInit() 168 | $objBitmapImage.StreamSource = [System.IO.MemoryStream][System.Convert]::FromBase64String($imageBase64) 169 | $objBitmapImage.EndInit() 170 | $objBitmapImage.Freeze() 171 | return $objBitmapImage 172 | } 173 | 174 | 175 | function Get-ProfilePicture { 176 | param ( 177 | [Parameter(Mandatory = $true)] 178 | [String]$upn 179 | ) 180 | $path = "$global:Path\.tmp\$upn.png" 181 | 182 | if (-Not (Test-Path $path)) { 183 | Get-MgUserPhotoContent -UserId $upn -OutFile $path -ErrorAction SilentlyContinue 184 | } 185 | 186 | if (Test-Path $path) { 187 | try{ 188 | $iconButtonLogIn = [convert]::ToBase64String((get-content $path -encoding byte)) 189 | $WPFImgButtonLogIn.source = Get-DecodeBase64Image -ImageBase64 $iconButtonLogIn 190 | }catch{} 191 | } else { 192 | $defaultPicture = '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' 193 | $WPFImgButtonLogIn.source = Get-DecodeBase64Image -ImageBase64 $defaultPicture 194 | } 195 | } 196 | 197 | ### XAML ### 198 | function New-XamlScreen{ 199 | param ( 200 | [Parameter(Mandatory = $true)] 201 | [String]$xamlPath 202 | ) 203 | $inputXML = Get-Content $xamlPath 204 | [xml]$xaml = $inputXML -replace 'mc:Ignorable="d"', '' -replace "x:N", 'N' -replace '^