Files
oxmc d38cd32b82 Fix registry ownership/ACL and hang bugs in tiny11maker.ps1, plus build/setup script updates
Fixes several offline-hive build failures: TrustedInstaller-owned keys
(WindowsRuntime\ActivatableClassId, Explorer\Advanced, System\GameConfigStore, Search
SystemIndex) denying writes even to admin-owned processes, a PowerShell 5.1 quirk that drops
empty-string reg.exe arguments and can hang the build on a silent overwrite prompt, a
registry-handle leak that left hives locked and cascaded into DISM cleanup failures, and
relaxed the post-ResetBase health gate to accept 'Repairable' (only abort on
'NonRepairable') since ResetBase makes full repair impossible anyway - documented that
repairing the installed OS needs the original stock ISO, not the tweaked output. Also
rolls in in-progress updates to the other maker scripts and OEM setup/first-boot scripts.
2026-07-31 06:09:58 -07:00

123 lines
5.5 KiB
PowerShell

try {
Start-Transcript -Path "$env:WINDIR\OEM\setup\scripts\setup-user.log" -Append
}
catch {
# Transcript failing to start must not block the rest of setup
}
try {
# Check PowerShell version for use in path
if ($PSVersionTable.PSVersion.Major -ge 3) {
# Use new variable syntax in PowerShell 3 and above
$currentDir = $PSScriptRoot
}
else {
# Use old variable syntax in Windows PowerShell 3 and below
$currentDir = (Get-Item .).FullName
}
# Import script-helper.ps1
. "$currentDir\..\..\scripts\script-helper.ps1"
# Before doing ANYTHING, check if windows is activated
try {
if ((Get-WindowsVersionDetails).LicenseStatus -ne "Licensed") {
Write-Output "Windows not licensed - fetching activation script from get.activated.win..."
$activationScript = Invoke-RestMethod -Uri "https://get.activated.win" -TimeoutSec 15 -UseBasicParsing
& ([ScriptBlock]::Create($activationScript)) /HWID /HWID-NoEditionChange
}
}
catch {
Write-Warning "Activation step failed or timed out, continuing setup without activation: $($_.Exception.Message)"
}
#### Set cursor theme to Posys Cursor ####
$cursorkey = "HKCU:\Control Panel\Cursors"
$cursorSchemeStr = (Get-ItemProperty "HKCU:\Control Panel\Cursors\Schemes" -ErrorAction SilentlyContinue)."Posy's Cursor"
if ($cursorSchemeStr) {
$cursorscheme = $cursorSchemeStr -split ","
$cursorarray = "Arrow", "Help", "AppStarting", "Wait", "Crosshair", "IBeam", "NWPen", "No", "SizeNS", "SizeWE", "SizeNWSE", "SizeNESW", "SizeAll", "UpArrow", "Hand", "Pin", "Person"
if (-not (Test-Path $cursorkey)) { New-Item -Path $cursorkey -Force | Out-Null }
0..16 | ForEach-Object { Set-ItemProperty $cursorkey $cursorarray[$_] $cursorscheme[$_] }
Set-ItemProperty -Path $cursorkey -Name "(Default)" -Value "Posy's Cursor" -Type String
} else {
Write-Warning "Cursor scheme 'Posy's Cursor' not found in HKCU. Skipping cursor apply."
}
# Set dark mode and enable transparency - ensure the Personalize key exists
$PersonalizeKey = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize"
if (-not (Test-Path $PersonalizeKey)) {
New-Item -Path $PersonalizeKey -Force | Out-Null
}
Set-ItemProperty -Path $PersonalizeKey -Name "AppsUseLightTheme" -Value 0 -Type DWord
Set-ItemProperty -Path $PersonalizeKey -Name "SystemUsesLightTheme" -Value 0 -Type DWord
Set-ItemProperty -Path $PersonalizeKey -Name "EnableTransparency" -Value 1 -Type DWord
Set-ItemProperty -Path $PersonalizeKey -Name "ColorPrevalence" -Value 0 -Type DWord
# Set accent color - ensure the Explorer\Accent key exists
#$AccentKey = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Accent"
#if (-not (Test-Path $AccentKey)) {
# New-Item -Path $AccentKey -Force | Out-Null
#}
#Set-ItemProperty -Path $AccentKey -Name "StartColorSet" -Value 2 -Type DWord
#Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Accent" -Name "AccentColor" -Value 0x000000 -Type DWord
# Set wallpaper
$wallpaperPath = "$windowsDrive\Windows\Web\Wallpaper\Windows\flooded-city.jpg"
$desktopKey = "HKCU:\Control Panel\Desktop"
if (-not (Test-Path $desktopKey)) { New-Item -Path $desktopKey -Force | Out-Null }
Set-ItemProperty -Path $desktopKey -Name "WallPaper" -Value $wallpaperPath -Type String
Set-ItemProperty -Path $desktopKey -Name "TileWallpaper" -Value 0 -Type String
# Lock screen image is set system-wide in first-time-setup.ps1 via PersonalizationCSP (HKLM).
# HKCU Lock Screen keys (LandscapeAssetPath etc.) are Spotlight metadata - they do not set the background.
$explorerAdv = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced"
if (-not (Test-Path $explorerAdv)) { New-Item -Path $explorerAdv -Force | Out-Null }
# Align taskbar to the left
Set-ItemProperty -Path $explorerAdv -Name "TaskbarAl" -Value 0 -Type DWord
Set-ItemProperty -Path $explorerAdv -Name "LaunchTo" -Value 1 -Type DWord
# Disable widgets and task view
Set-ItemProperty -Path $explorerAdv -Name "TaskbarDa" -Value 0 -Type DWord
Set-ItemProperty -Path $explorerAdv -Name "ShowTaskViewButton" -Value 0 -Type DWord
# Refresh explorer to apply changes
RUNDLL32.EXE USER32.DLL, UpdatePerUserSystemParameters , 1 , True
# Restart Explorer gracefully so taskbar/wallpaper changes take effect without hard-killing the shell
$shell = New-Object -ComObject Shell.Application
$shell.Windows() | Out-Null # ensure COM is ready
Stop-Process -Name explorer -ErrorAction SilentlyContinue
Start-Sleep -Milliseconds 800
if (-not (Get-Process -Name explorer -ErrorAction SilentlyContinue)) {
Start-Process explorer.exe
}
#### Install Apps (User) ####
# Install UWP components (appx/msix/appinstaller) that need the user context (provisioned packages for all users and appinstaller for current user)
#Add-AppxPackage -AppInstallerFile "$uiPath\Files.appinstaller"
## Normnal app installations (Win32 apps, traditional installers, etc)
& "$windowsDrive\Windows\OEM\setup\scripts\install-apps-user.ps1"
## Install apps (modern windows apps, such as: store apps, winget, appx, msix, etc [appx/msix/others can be downloaded from url])
& "$windowsDrive\Windows\OEM\scripts\install-win-apps.ps1"
}
catch {
Write-Error "setup-user.ps1 failed: $($_.Exception.Message)"
Write-Output $_.ScriptStackTrace
}
finally {
try {
Stop-Transcript
}
catch {
# Nothing to stop, ignore
}
}
# Always exit 0 - a failure here must be logged and diagnosed via setup-user.log,
# not surfaced as an OOBE error dialog or left to hang FirstLogonCommands.
exit 0