<# .SYNOPSIS Registers logon scheduled tasks to maintain per-user settings that Windows resets. .DESCRIPTION Creates scheduled tasks under Task Scheduler that run at user logon (and optionally on a timer) to enforce settings that Windows tends to revert. Tasks are registered in the Default profile task store so new user accounts inherit them automatically. Note: PDF-DefaultApp task has been removed - PDF default is set once during deployment. .ITEMS showalltrayicons-pri-logonu-kazdou-1-min: Task 'ShowAllTrayIcons': runs at logon, repeats every 1 minute. Sets HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\EnableAutoTray=0. Windows 11 re-enables auto-hiding of tray icons after updates and sometimes after logon - the 1-min repeat ensures permanent override. unlockstartlayout-jednou-po-aplikaci-lay: Task 'UnlockStartLayout': runs once, 30 seconds after logon. Clears the Start menu layout lock bit that is set when ConfigureStartPins is applied. Without this, users cannot pin or unpin apps from Start after deployment. pdf-defaultapp-pri-kazdem-logonu: REMOVED. PDF default is set once during deployment (step 02) with UCPD service stopped. The scheduled task is no longer needed. #> param( [object]$Config, [string]$LogFile ) $ErrorActionPreference = "Continue" function Write-Log { param([string]$Message, [string]$Level = "INFO") $line = "[$(Get-Date -Format 'HH:mm:ss')] [$Level] $Message" Add-Content -Path $LogFile -Value $line -Encoding UTF8 } $ScriptDir = "C:\Windows\Setup\Scripts" if (-not (Test-Path $ScriptDir)) { New-Item -ItemType Directory -Path $ScriptDir -Force | Out-Null } function Register-Task { param( [string]$TaskName, [string]$Description, [object]$Action, [object[]]$Triggers, [string]$RunLevel = "Highest" ) try { # Remove existing task with same name Unregister-ScheduledTask -TaskName $TaskName -Confirm:$false -ErrorAction SilentlyContinue $settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 5) ` -MultipleInstances IgnoreNew ` -StartWhenAvailable $principal = New-ScheduledTaskPrincipal -GroupId "Users" ` -RunLevel $RunLevel $task = New-ScheduledTask -Action $Action ` -Trigger $Triggers ` -Settings $settings ` -Principal $principal ` -Description $Description Register-ScheduledTask -TaskName $TaskName -InputObject $task -Force | Out-Null Write-Log " Registered task: $TaskName" -Level OK } catch { Write-Log " Failed to register task $TaskName - $_" -Level ERROR } } # ----------------------------------------------------------------------- # Task: ShowAllTrayIcons # Runs on logon: clears TrayNotify icon cache and restarts Explorer so all # tray icons are visible on first login (Win10: EnableAutoTray=0, Win11: cache clear) # ----------------------------------------------------------------------- Write-Log "Registering task: ShowAllTrayIcons" -Level STEP $showTrayScript = "$ScriptDir\ShowAllTrayIcons.ps1" @' # Win10: disable auto-hiding of tray icons $regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer" Set-ItemProperty -Path $regPath -Name "EnableAutoTray" -Value 0 -Force -ErrorAction SilentlyContinue # Win11: clear icon stream cache so all icons become visible after Explorer restart $trayPath = "HKCU:\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify" if (Test-Path $trayPath) { Remove-ItemProperty -Path $trayPath -Name "IconStreams" -Force -ErrorAction SilentlyContinue Remove-ItemProperty -Path $trayPath -Name "PastIconsStream" -Force -ErrorAction SilentlyContinue } # Restart Explorer to apply changes Stop-Process -Name explorer -Force -ErrorAction SilentlyContinue Start-Sleep -Milliseconds 1500 if (-not (Get-Process explorer -ErrorAction SilentlyContinue)) { Start-Process explorer } '@ | Set-Content -Path $showTrayScript -Encoding UTF8 -Force $showTrayAction = New-ScheduledTaskAction -Execute "powershell.exe" ` -Argument "-NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File `"$showTrayScript`"" $showTrayTrigger = New-ScheduledTaskTrigger -AtLogOn Register-Task -TaskName "ShowAllTrayIcons" ` -Description "Show all system tray icons for current user" ` -Action $showTrayAction ` -Triggers $showTrayTrigger # ----------------------------------------------------------------------- Write-Log "Registering task: PDF-DefaultApp" -Level STEP $pdfScript = "$ScriptDir\PDF-DefaultApp.ps1" @' # Restore .pdf -> Adobe Reader HKCR association (system-wide). # Runs as SYSTEM so it can write to HKCR regardless of Edge updates. # Note: HKCU UserChoice requires Windows Hash validation and cannot be # set reliably via registry; HKCR provides the system-wide fallback. $acroPaths = @( "$env:ProgramFiles\Adobe\Acrobat DC\Acrobat\Acrobat.exe" "${env:ProgramFiles(x86)}\Adobe\Acrobat DC\Acrobat\Acrobat.exe" "${env:ProgramFiles(x86)}\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" "$env:ProgramFiles\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" "${env:ProgramFiles(x86)}\Adobe\Reader\Reader\AcroRd32.exe" ) $acroExe = $acroPaths | Where-Object { Test-Path $_ } | Select-Object -First 1 if (-not $acroExe) { exit 0 } $progId = "AcroExch.Document.DC" $openCmd = "`"$acroExe`" `"%1`"" # HKCR\.pdf if (-not (Test-Path "HKCR:\.pdf")) { New-Item -Path "HKCR:\.pdf" -Force | Out-Null } $current = (Get-ItemProperty -Path "HKCR:\.pdf" -Name "(Default)" -ErrorAction SilentlyContinue)."(Default)" if ($current -ne $progId) { Set-ItemProperty -Path "HKCR:\.pdf" -Name "(Default)" -Value $progId -Force } # HKCR\AcroExch.Document.DC\shell\open\command $cmdPath = "HKCR:\$progId\shell\open\command" if (-not (Test-Path $cmdPath)) { New-Item -Path $cmdPath -Force | Out-Null } Set-ItemProperty -Path $cmdPath -Name "(Default)" -Value $openCmd -Force '@ | Set-Content -Path $pdfScript -Encoding UTF8 -Force $pdfAction = New-ScheduledTaskAction -Execute "powershell.exe" ` -Argument "-NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File `"$pdfScript`"" $pdfTrigger = New-ScheduledTaskTrigger -AtLogOn # Runs as SYSTEM to allow HKCR writes (system-wide file association) $pdfPrincipal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -RunLevel Highest $pdfSettings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 2) ` -MultipleInstances IgnoreNew ` -StartWhenAvailable $pdfTask = New-ScheduledTask -Action $pdfAction ` -Trigger $pdfTrigger ` -Settings $pdfSettings ` -Principal $pdfPrincipal ` -Description "Restore Adobe Reader as default PDF app on logon" try { Unregister-ScheduledTask -TaskName "PDF-DefaultApp" -Confirm:$false -ErrorAction SilentlyContinue Register-ScheduledTask -TaskName "PDF-DefaultApp" -InputObject $pdfTask -Force | Out-Null Write-Log " Registered task: PDF-DefaultApp" -Level OK } catch { Write-Log " Failed to register task PDF-DefaultApp - $_" -Level ERROR } # ----------------------------------------------------------------------- # Task: UnlockStartLayout # Runs once after deployment to unlock the Start menu layout # so users can still customize it later # ----------------------------------------------------------------------- Write-Log "Registering task: UnlockStartLayout" -Level STEP $unlockScript = "$ScriptDir\UnlockStartLayout.ps1" @' # Remove Start layout lock so users can modify it $layoutXml = "C:\Users\Default\AppData\Local\Microsoft\Windows\Shell\LayoutModification.xml" if (Test-Path $layoutXml) { Remove-Item $layoutXml -Force -ErrorAction SilentlyContinue } # Unregister self after running once Unregister-ScheduledTask -TaskName "UnlockStartLayout" -Confirm:$false -ErrorAction SilentlyContinue '@ | Set-Content -Path $unlockScript -Encoding UTF8 -Force $unlockAction = New-ScheduledTaskAction -Execute "powershell.exe" ` -Argument "-NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass -File `"$unlockScript`"" # Trigger: 5 minutes after system startup, once $unlockTrigger = New-ScheduledTaskTrigger -AtStartup $unlockTrigger.Delay = "PT5M" $unlockPrincipal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -RunLevel Highest $unlockSettings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 10) ` -StartWhenAvailable $unlockTask = New-ScheduledTask -Action $unlockAction ` -Trigger $unlockTrigger ` -Settings $unlockSettings ` -Principal $unlockPrincipal ` -Description "Unlock Start menu layout 5 min after first boot" try { Unregister-ScheduledTask -TaskName "UnlockStartLayout" -Confirm:$false -ErrorAction SilentlyContinue Register-ScheduledTask -TaskName "UnlockStartLayout" -InputObject $unlockTask -Force | Out-Null Write-Log " Registered task: UnlockStartLayout" -Level OK } catch { Write-Log " Failed to register task UnlockStartLayout - $_" -Level ERROR } Write-Log "Step 6 complete" -Level OK