<# .SYNOPSIS Interactive TUI for managing (list/create) Scheduled Tasks on local or remote servers under SYSTEM account. .DESCRIPTION - Menu-driven console interface - Always runs as SYSTEM (highest privilege) - Supports Once/Daily/Weekly/Monthly triggers - Custom actions, settings (start when available, wake to run, retry on failure) - Remote targeting via CIM session .PARAMETER RunTUI Launch the text-based UI. #> [CmdletBinding()] Param( [switch]$RunTUI ) function New-UniversalScheduledTask { [CmdletBinding()] Param( [string]$ServerName, [string]$TaskName, [string]$Description, [ValidateSet('Once','Daily','Weekly','Monthly')][string]$Frequency, [datetime]$At, [string[]]$DaysOfWeek, [string[]]$Months, [int[]]$DaysOfMonth, [string]$Command = 'powershell.exe', [string]$Arguments = '', [switch]$StartWhenAvailable, [switch]$WakeToRun, [int]$RestartIntervalMinutes = 0, [int]$RestartCount = 0 ) # Determine target $target = if ($ServerName) { $ServerName } else { 'local' } if ($ServerName) { Write-Host "Creating CIM session to $ServerName..." $CimSession = New-CimSession -ComputerName $ServerName } # Build trigger switch ($Frequency) { 'Once' { $trigger = New-ScheduledTaskTrigger -Once -At $At } 'Daily' { $trigger = New-ScheduledTaskTrigger -Daily -At $At.TimeOfDay } 'Weekly' { $trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek $DaysOfWeek -At $At.TimeOfDay } 'Monthly' { $trigger = New-ScheduledTaskTrigger -Monthly -MonthsOfYear $Months -DaysOfMonth $DaysOfMonth -At $At.TimeOfDay } } # Action and settings $action = New-ScheduledTaskAction -Execute $Command -Argument $Arguments $settings = New-ScheduledTaskSettingsSet -StartWhenAvailable:$StartWhenAvailable.IsPresent -WakeToRun:$WakeToRun.IsPresent if ($RestartIntervalMinutes -gt 0) { $interval = New-TimeSpan -Minutes $RestartIntervalMinutes $settings = $settings | Set-ScheduledTaskSettings -RestartOnFailureInterval $interval -RestartCount $RestartCount } # Register task Write-Host "Registering task '$TaskName' on $target" Register-ScheduledTask -TaskName $TaskName -Action $action -Trigger $trigger -Settings $settings -Description $Description -User 'NT AUTHORITY\\SYSTEM' -RunLevel Highest${($CimSession) ? ' -CimSession $CimSession' : ''} -Force Write-Host "Task '$TaskName' created successfully on $target." } function List-ScheduledTasks { [CmdletBinding()] Param([string]$ServerName) # Determine target $target = if ($ServerName) { $ServerName } else { 'local' } if ($ServerName) { Write-Host "Creating CIM session to $ServerName..." $CimSession = New-CimSession -ComputerName $ServerName } Write-Host "Listing tasks on $target" Get-ScheduledTask${($CimSession) ? ' -CimSession $CimSession' : ''} | Select-Object TaskName, State, Actions | Format-Table -AutoSize } function Show-Menu { Write-Host "=== Scheduled Task Manager ===" -ForegroundColor Cyan Write-Host "1) List Tasks" Write-Host "2) Create Task" Write-Host "3) Exit" return Read-Host 'Choose [1-3]' } function Prompt-TaskParameters { $p = @{} $p.ServerName = Read-Host 'Server (blank=local)' $p.TaskName = Read-Host 'Task Name' $p.Description = Read-Host 'Description' $p.Frequency = Read-Host 'Frequency (Once,Daily,Weekly,Monthly)' $p.At = [datetime](Read-Host 'Date/time (e.g. 2025-06-27 22:00)') if ($p.Frequency -eq 'Weekly') { $p.DaysOfWeek = (Read-Host 'DaysOfWeek (Monday,Tuesday)').Split(',') } if ($p.Frequency -eq 'Monthly') { $p.Months = (Read-Host 'Months (January,June)').Split(',') $p.DaysOfMonth = (Read-Host 'DaysOfMonth (1,15)').Split(',') | ForEach-Object {[int]$_} } $cmd = Read-Host 'Command (default=powershell.exe)' if ($cmd) { $p.Command = $cmd } $p.Arguments = Read-Host 'Arguments' if ((Read-Host 'Start when available? (Y/N)') -eq 'Y') { $p.StartWhenAvailable = $true } if ((Read-Host 'Wake to run? (Y/N)') -eq 'Y') { $p.WakeToRun = $true } $retry = [int](Read-Host 'Retry interval minutes (0=none)') if ($retry -gt 0) { $p.RestartIntervalMinutes = $retry $p.RestartCount = [int](Read-Host 'Retry count') } return $p } # Entry point if ($RunTUI) { do { switch (Show-Menu) { '1' { $srv = Read-Host 'Server to list (blank=local)' List-ScheduledTasks -ServerName $srv Write-Host 'Press Enter to continue...' Read-Host } '2' { $params = Prompt-TaskParameters New-UniversalScheduledTask @params Write-Host 'Press Enter to continue...' Read-Host } '3' { break } default { Write-Host 'Invalid choice.' -ForegroundColor Red } } } while ($true) return } Write-Host 'No action specified. Use -RunTUI to launch the console interface.' -ForegroundColor Yellow