diff --git a/playbook/shopfloor-setup/Shopfloor/06-OrganizeDesktop.ps1 b/playbook/shopfloor-setup/Shopfloor/06-OrganizeDesktop.ps1 index 7d9ca9f..732c485 100644 --- a/playbook/shopfloor-setup/Shopfloor/06-OrganizeDesktop.ps1 +++ b/playbook/shopfloor-setup/Shopfloor/06-OrganizeDesktop.ps1 @@ -488,15 +488,83 @@ Write-Host "=== Phase 2: populate Shopfloor Tools with app shortcuts ===" Add-ShopfloorToolsApps Write-Host "" -Write-Host "=== Phase 3: remove empty category folders ===" +Write-Host "=== Phase 3: auto-apply startup items from PC profile ===" +# Creates .lnk files in AllUsers Startup folder based on the profile's +# startupItems. This is the auto-apply step that eliminates the need +# for Configure-PC to ask about startup items during the imaging chain. +# Configure-PC.bat on the desktop still lets the tech modify them later. +$startupDir = 'C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup' + +$cfgStartup = if ($pcProfile -and $pcProfile.startupItems) { $pcProfile.startupItems } + elseif ($siteConfig -and $siteConfig.startupItems) { $siteConfig.startupItems } + else { $null } + +if ($cfgStartup -and $cfgStartup.Count -gt 0) { + if (-not (Test-Path $startupDir)) { + New-Item -ItemType Directory -Path $startupDir -Force | Out-Null + } + $edgePath = @( + 'C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe', + 'C:\Program Files\Microsoft\Edge\Application\msedge.exe' + ) | Where-Object { Test-Path -LiteralPath $_ } | Select-Object -First 1 + + foreach ($si in $cfgStartup) { + $lnkPath = Join-Path $startupDir "$($si.label).lnk" + # Skip if already exists (idempotent - don't overwrite user changes) + if (Test-Path -LiteralPath $lnkPath) { + Write-Host " exists: $($si.label)" + continue + } + switch ($si.type) { + 'exe' { + if (Test-Path -LiteralPath $si.target) { + if (New-ShopfloorLnk -Path $lnkPath -Target $si.target) { + Write-Host " added: $($si.label)" + } + } else { + Write-Host " skip: $($si.label) - target not installed" -ForegroundColor DarkGray + } + } + 'existing' { + $src = Find-ExistingLnk $si.sourceLnk + if ($src) { + try { + Copy-Item -LiteralPath $src -Destination $lnkPath -Force + Write-Host " added: $($si.label)" + } catch { Write-Warning " failed: $($si.label) - $_" } + } else { + Write-Host " skip: $($si.label) - source not found" -ForegroundColor DarkGray + } + } + 'url' { + $url = $null + if ($si.urlKey -and $siteConfig -and $siteConfig.urls) { + $url = $siteConfig.urls.$($si.urlKey) + } + if ($url -and $edgePath) { + if (New-ShopfloorLnk -Path $lnkPath -Target $edgePath -Arguments "--new-window `"$url`"") { + Write-Host " added: $($si.label)" + } + } else { + Write-Host " skip: $($si.label) - URL or Edge not available" -ForegroundColor DarkGray + } + } + } + } +} else { + Write-Host " (no startup items in profile)" +} + +Write-Host "" +Write-Host "=== Phase 4: remove empty category folders ===" Remove-EmptyCategoryFolders Write-Host "" -Write-Host "=== Phase 4: Edge default browser + startup tabs ===" +Write-Host "=== Phase 5: Edge default browser + startup tabs ===" Invoke-EdgeDefaultBrowser Write-Host "" -Write-Host "=== Phase 5: register logon sweeper scheduled task ===" +Write-Host "=== Phase 6: register logon sweeper scheduled task ===" Register-SweepScheduledTask -ScriptPath $scriptPath exit 0 diff --git a/playbook/shopfloor-setup/Shopfloor/Configure-PC.ps1 b/playbook/shopfloor-setup/Shopfloor/Configure-PC.ps1 index dc9cf85..cc2f9fd 100644 --- a/playbook/shopfloor-setup/Shopfloor/Configure-PC.ps1 +++ b/playbook/shopfloor-setup/Shopfloor/Configure-PC.ps1 @@ -15,6 +15,13 @@ # # Run via Configure-PC.bat on the SupportUser desktop. +param( + # When set, only show the machine number section (skip startup items). + # Used by sync_intune -AsTask after completion -- startup items are + # already auto-applied by 06-OrganizeDesktop from the PC profile. + [switch]$MachineNumberOnly +) + $ErrorActionPreference = 'Continue' # --- Transcript logging --- @@ -307,6 +314,9 @@ if ($needsMachineNumber) { } # --- Section 2: Startup items + machine-number logon task --- +# Skipped when -MachineNumberOnly (called from sync_intune -AsTask after +# completion -- startup items already auto-applied by 06-OrganizeDesktop). +if (-not $MachineNumberOnly) { Write-Host "" Write-Host " AUTO-STARTUP ITEMS" -ForegroundColor Yellow Write-Host " ----------------------------------------" @@ -423,6 +433,8 @@ if ($selection) { Write-Host " No changes." -ForegroundColor DarkGray } +} # end if (-not $MachineNumberOnly) + # --- Summary --- Write-Host "" Write-Host " CURRENT STATE" -ForegroundColor Cyan diff --git a/playbook/shopfloor-setup/Shopfloor/lib/Monitor-IntuneProgress.ps1 b/playbook/shopfloor-setup/Shopfloor/lib/Monitor-IntuneProgress.ps1 index 1d61f85..470e50d 100644 --- a/playbook/shopfloor-setup/Shopfloor/lib/Monitor-IntuneProgress.ps1 +++ b/playbook/shopfloor-setup/Shopfloor/lib/Monitor-IntuneProgress.ps1 @@ -560,15 +560,17 @@ function Invoke-SetupComplete { Write-Host "The post-reboot DSC install phase is finished. The device is ready." if ($AsTask) { - # Task mode: unregister our own scheduled task, launch Configure-PC + # Task mode: unregister our own scheduled task Write-Host "Unregistering sync task..." -ForegroundColor Cyan try { Unregister-ScheduledTask -TaskName 'Shopfloor Intune Sync' -Confirm:$false -ErrorAction SilentlyContinue } catch {} + # Machine number prompt only (startup items are auto-applied by + # 06-OrganizeDesktop from the PC profile). Tech can re-open + # sync_intune.bat manually to see QR code for inventory. if ($ConfigureScript -and (Test-Path -LiteralPath $ConfigureScript)) { - Write-Host "Launching Configure-PC..." -ForegroundColor Cyan - try { & $ConfigureScript } catch { Write-Warning "Configure-PC failed: $_" } + try { & $ConfigureScript -MachineNumberOnly } catch { Write-Warning "Configure-PC failed: $_" } } exit 0 }