[CmdletBinding(SupportsShouldProcess = $true)] param( [switch]$Remove, [switch]$AllUsers, [switch]$StartNow ) Set-StrictMode -Version Latest $ErrorActionPreference = "Stop" $scriptDir = Split-Path -Parent $PSCommandPath $backendScript = Join-Path $scriptDir "start_backend.ps1" $vbsLauncher = Join-Path $scriptDir "start_backend_hidden.vbs" $shortcutName = "ScreenJob Backend.lnk" if (-not (Test-Path -LiteralPath $backendScript)) { throw "Backend launcher script not found: $backendScript" } if (-not (Test-Path -LiteralPath $vbsLauncher)) { throw "Hidden backend launcher file not found: $vbsLauncher" } function Test-IsAdministrator { $identity = [Security.Principal.WindowsIdentity]::GetCurrent() $principal = New-Object Security.Principal.WindowsPrincipal($identity) return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) } $legacyService = Get-Service -Name "ScreenJobBackend" -ErrorAction SilentlyContinue if ($null -ne $legacyService) { if (Test-IsAdministrator) { if ($PSCmdlet.ShouldProcess("ScreenJobBackend", "Remove legacy Windows service")) { if ($legacyService.Status -ne "Stopped") { Stop-Service -Name "ScreenJobBackend" -Force -ErrorAction Stop } & sc.exe delete ScreenJobBackend | Out-Null if ($LASTEXITCODE -ne 0) { throw "Failed to delete legacy service 'ScreenJobBackend' (sc.exe exit code $LASTEXITCODE)." } Write-Host "Removed legacy Windows service: ScreenJobBackend" } } else { Write-Warning "Legacy Windows service 'ScreenJobBackend' is still installed. Run uninstall_backend_service.ps1 from an elevated PowerShell session once to remove it." } } $startupFolder = if ($AllUsers) { [Environment]::GetFolderPath("CommonStartup") } else { [Environment]::GetFolderPath("Startup") } $shortcutPath = Join-Path $startupFolder $shortcutName if ($Remove) { if (Test-Path -LiteralPath $shortcutPath) { if ($PSCmdlet.ShouldProcess($shortcutPath, "Remove backend startup shortcut")) { Remove-Item -LiteralPath $shortcutPath -Force Write-Host "Removed backend startup shortcut: $shortcutPath" } } else { Write-Host "No backend startup shortcut found at: $shortcutPath" } return } if ($PSCmdlet.ShouldProcess($shortcutPath, "Create backend startup shortcut")) { $shell = New-Object -ComObject WScript.Shell $shortcut = $shell.CreateShortcut($shortcutPath) $shortcut.TargetPath = "$env:SystemRoot\System32\wscript.exe" $shortcut.Arguments = '"' + $vbsLauncher + '"' $shortcut.WorkingDirectory = $scriptDir $shortcut.Description = "Launch ScreenJob backend at sign-in in the current user session." $shortcut.Save() Write-Host "Created backend startup shortcut: $shortcutPath" } if ($StartNow) { Start-Process -FilePath "$env:SystemRoot\System32\wscript.exe" -ArgumentList @($vbsLauncher) -WorkingDirectory $scriptDir | Out-Null Write-Host "Started backend launcher now." }