02-software: add Atera RMM agent install (Invoke-WebRequest + msiexec /qn), stop UCPD driver before PDF association write, restart after; remove reference to PDF-DefaultApp scheduled task in header 03-system-registry: correct OneDrive uninstall description - intentional (pre-installed consumer version only, no policy key, M365 can reinstall) 04-default-profile: OneDrive RunOnce blocking removed, ShowRecent=0, ShowFrequent=0, FullPath=1 in CabinetState already added in prior session 06-scheduled-tasks: PDF-DefaultApp task removed - PDF set once in step 02 08-activation: add OA3/BIOS embedded key check via SoftwareLicensingService WMI; key priority: config.json > OA3 firmware > GVLK web/spec: update all status badges, remove mustfix flags, deduplicate OneDrive entries across steps 01/03/04, add OA3 row to step-08 web/data/descriptions.json: regenerated (65 items) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
205 lines
9.5 KiB
PowerShell
205 lines
9.5 KiB
PowerShell
<#
|
|
.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
|