Last active
January 24, 2025 19:13
-
-
Save DanGough/7ad3b9193ae66c0573fa5986c181c491 to your computer and use it in GitHub Desktop.
Stub script for launching PSADT with ServiceUI only if a specific exe (explorer.exe by default) is running
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<# | |
.SYNOPSIS | |
This is a helper script to launch Deploy-Application.exe via ServiceUI to force the process to become visible when deployed by Intune, or other deployment systems that run in session 0. | |
.DESCRIPTION | |
This will launch the toolkit silently if the chosent process (explorer.exe by default) is not running. If it is running, then it will launch the toolkit interactively, and use ServiceUI to do so if the current process is non-interactive. | |
An alternate ProcessName can be specified if you only want the toolkit to be visible when a specific application is running. | |
Download MDT here: https://www.microsoft.com/en-us/download/details.aspx?id=54259 | |
There are x86 and x64 builds of ServiceUI avaiable in MDT under 'Microsoft Deployment Toolkit\Templates\Distribution\Tools'. Rename these to ServiceUI_x86.exe and ServiceUI_x64.exe and place them with this script in the root of the toolkit next to Deploy-Application.exe. | |
.PARAMETER ProcessName | |
Specifies the name of the process check for to trigger the interactive installation. Default value is 'explorer'. Multiple values can be supplied such as 'app1','app2'. The .exe extension must be omitted. | |
.PARAMETER DeploymentType | |
Specifies the type of deployment. Valid values are 'Install', 'Uninstall', or 'Repair'. Default value is 'Install'. | |
.PARAMETER AllowRebootPassThru | |
Passthru of switch to Deploy-Application.exe, will instruct the toolkit to not to mask a 3010 return code with a 0. | |
.PARAMETER TerminalServerMode | |
Passthru of switch to Deploy-Application.exe to enable terminal server mode. | |
.PARAMETER DisableLogging | |
Passthru of switch to Deploy-Application.exe to disable logging. | |
.EXAMPLE | |
.\Invoke-ServiceUI.ps1 -ProcessName 'WinSCP' -DeploymentType 'Install' -AllowRebootPassThru | |
Invoking the script from the command line. | |
.EXAMPLE | |
%SystemRoot%\System32\WindowsPowerShell\v1.0\PowerShell.exe -ExecutionPolicy Bypass -NoProfile -File Invoke-ServiceUI.ps1 -DeploymentType Install -AllowRebootPassThru | |
An example command line to use in Intune. | |
#> | |
param ( | |
[string[]]$ProcessName = @('explorer'), | |
[ValidateSet('Install', 'Uninstall', 'Repair')] | |
[string]$DeploymentType = 'Install', | |
[switch]$AllowRebootPassThru, | |
[switch]$TerminalServerMode, | |
[switch]$DisableLogging | |
) | |
Push-Location $PSScriptRoot | |
if ($env:PROCESSOR_ARCHITECTURE -eq 'AMD64' -or $env:PROCESSOR_ARCHITEW6432 -eq 'AMD64') { | |
$Architecture = 'x64' | |
} else { | |
$Architecture = 'x86' | |
} | |
if (Get-Process -Name $ProcessName -ErrorAction SilentlyContinue) { | |
if ([Environment]::UserInteractive) { | |
# Start-Process is used here otherwise script does not wait for completion | |
$Process = Start-Process -FilePath '.\Deploy-Application.exe' -ArgumentList "-DeploymentType $DeploymentType -DeployMode Interactive -AllowRebootPassThru:`$$AllowRebootPassThru -TerminalServerMode:`$$TerminalServerMode -DisableLogging:`$$DisableLogging" -NoNewWindow -Wait -PassThru | |
$ExitCode = $Process.ExitCode | |
} else { | |
# Using Start-Process with ServiceUI results in Error Code 5 (Access Denied) | |
&".\ServiceUI_$Architecture.exe" -process:explorer.exe Deploy-Application.exe -DeploymentType $DeploymentType -DeployMode Interactive -AllowRebootPassThru:"`$$AllowRebootPassThru" -TerminalServerMode:"`$$TerminalServerMode" -DisableLogging:"`$$DisableLogging" | |
$ExitCode = $LastExitCode | |
} | |
} else { | |
$Process = Start-Process -FilePath '.\Deploy-Application.exe' -ArgumentList "-DeploymentType $DeploymentType -DeployMode Silent -AllowRebootPassThru:`$$AllowRebootPassThru -TerminalServerMode:`$$TerminalServerMode -DisableLogging:`$$DisableLogging" -NoNewWindow -Wait -PassThru | |
$ExitCode = $Process.ExitCode | |
} | |
Pop-Location | |
exit $ExitCode |
That is amazing, will give it a go shortly and report back.
I've just made a small tweak to use Push/Pop location instead of Set, so that running the script does not permanently change your current directory.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I did have an example command line to plug into Intune added, but I forgot to include here!
I used:
%SystemRoot%\System32\WindowsPowerShell\v1.0\PowerShell.exe -ExecutionPolicy Bypass -NoProfile -File Invoke-ServiceUI.ps1 -DeploymentType Install -AllowRebootPassThru
I’ll make sure there are a few examples like this in the final implementation/docs.