Root cause fix: runner.go passed config as unevaluated PS expression via -File mode - scripts received a literal string instead of parsed object. Changed to -ConfigPath; scripts load JSON themselves via shared common.ps1 (Write-Log, Get-Feature, Load-Config). GUI now regenerates runtime config before run so user selections actually reach the scripts. Merged 04-default-profile + 05-personalization into single script (one hive load/unload, no Explorer restart, no hive contention). Deleted Deploy-Windows.ps1 (xetup.exe is sole entry point), 06-scheduled-tasks.ps1 (tasks caused more harm than good), 07-desktop-info.ps1 (replaced by BackInfo long ago). Step ordering: activation moved early, pcIdentity before WU (exit 9 on rename only when rename actually happened). Edge policies split into mandatory (telemetry, first-run) vs recommended (UI preferences user can override). Atera install uses Start-Process -Wait instead of fragile sleep. Updated config.json, tests, DefaultConfig to match current state. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
138 lines
5.8 KiB
PowerShell
138 lines
5.8 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
Detects Dell hardware, installs Dell Command | Update, and applies all available updates.
|
|
|
|
.DESCRIPTION
|
|
Checks Win32_ComputerSystem.Manufacturer - if not Dell, the step exits silently without
|
|
error so the same deployment script works on any hardware. On Dell machines, installs
|
|
Dell Command | Update (Universal) via winget and immediately runs /applyUpdates with
|
|
-reboot=disable. This covers drivers, firmware, and BIOS. BIOS and firmware updates are
|
|
staged at this point and finalize automatically during the restart that closes the
|
|
deployment. The operator does not need to run a separate update pass after setup.
|
|
|
|
.ITEMS
|
|
detekce-dell-hw-win32-computersystem: Reads Win32_ComputerSystem.Manufacturer. If the string does not contain "Dell", the entire step is skipped without error. The deployment continues normally on HP, Lenovo, or any other brand.
|
|
instalace-dell-command-update-via-winget: Installs Dell.CommandUpdate.Universal silently via winget. This is the current DCU generation (v5+) that supports Latitude, OptiPlex, Precision, Vostro, and XPS on Win10 and Win11.
|
|
spusteni-vsech-aktualizaci-drivery-firmware-bios: Runs dcu-cli.exe /applyUpdates -silent -reboot=disable. Covers driver, firmware, and BIOS categories in a single pass. The -reboot=disable flag prevents DCU from rebooting mid-deployment.
|
|
bios-firmware-staging-reboot: BIOS and firmware updates are staged by DCU and finalize on the next system restart. The deployment already ends with a restart (step 09 - computer rename), so no extra reboot is needed.
|
|
#>
|
|
param(
|
|
[string]$ConfigPath,
|
|
[string]$LogFile
|
|
)
|
|
|
|
. "$PSScriptRoot\common.ps1"
|
|
$Config = Load-Config $ConfigPath
|
|
|
|
# -----------------------------------------------------------------------
|
|
# Detect Dell hardware
|
|
# -----------------------------------------------------------------------
|
|
Write-Log "Checking hardware manufacturer" -Level INFO
|
|
|
|
try {
|
|
$cs = Get-CimInstance -ClassName Win32_ComputerSystem -ErrorAction Stop
|
|
$manufacturer = $cs.Manufacturer
|
|
$model = $cs.Model
|
|
Write-Log " Manufacturer: $manufacturer Model: $model" -Level INFO
|
|
}
|
|
catch {
|
|
Write-Log " Failed to query Win32_ComputerSystem: $_" -Level ERROR
|
|
return
|
|
}
|
|
|
|
if ($manufacturer -notmatch "Dell") {
|
|
Write-Log "Not a Dell machine ($manufacturer) - step skipped" -Level WARN
|
|
return
|
|
}
|
|
|
|
Write-Log "Dell confirmed: $model" -Level OK
|
|
|
|
# -----------------------------------------------------------------------
|
|
# Install Dell Command | Update via winget
|
|
# -----------------------------------------------------------------------
|
|
Write-Log "Installing Dell Command | Update (Universal)..." -Level STEP
|
|
|
|
$wingetArgs = @(
|
|
"install",
|
|
"--id", "Dell.CommandUpdate.Universal",
|
|
"--silent",
|
|
"--accept-package-agreements",
|
|
"--accept-source-agreements"
|
|
)
|
|
|
|
$wingetOutput = & winget @wingetArgs 2>&1
|
|
$wingetExit = $LASTEXITCODE
|
|
$wingetOutput | ForEach-Object { Write-Log " [winget] $_" -Level INFO }
|
|
|
|
if ($wingetExit -ne 0 -and $wingetExit -ne 1638) { # 1638 = already installed
|
|
Write-Log " winget exit code $wingetExit - checking if DCU is already present" -Level WARN
|
|
}
|
|
|
|
# Locate dcu-cli.exe (path is the same for x64 and Universal edition)
|
|
$dcuCandidates = @(
|
|
"C:\Program Files\Dell\CommandUpdate\dcu-cli.exe",
|
|
"C:\Program Files (x86)\Dell\CommandUpdate\dcu-cli.exe"
|
|
)
|
|
$dcuCli = $dcuCandidates | Where-Object { Test-Path $_ } | Select-Object -First 1
|
|
|
|
if (-not $dcuCli) {
|
|
Write-Log " dcu-cli.exe not found - cannot run updates" -Level ERROR
|
|
return
|
|
}
|
|
|
|
Write-Log " dcu-cli.exe found: $dcuCli" -Level OK
|
|
|
|
# -----------------------------------------------------------------------
|
|
# Run updates - categories controlled by feature flags
|
|
# -reboot=disable -> no mid-deployment reboot; BIOS/firmware staged for next restart
|
|
# -----------------------------------------------------------------------
|
|
$runDrivers = Get-Feature $Config "dellUpdate" "drivers"
|
|
$runBios = Get-Feature $Config "dellUpdate" "bios"
|
|
|
|
if (-not $runDrivers -and -not $runBios) {
|
|
Write-Log "Both drivers and bios features disabled - skipping update run" -Level INFO
|
|
} else {
|
|
# Build update type list from enabled features
|
|
$updateTypes = @()
|
|
if ($runDrivers) {
|
|
$updateTypes += "driver"
|
|
$updateTypes += "firmware"
|
|
}
|
|
if ($runBios) {
|
|
$updateTypes += "bios"
|
|
}
|
|
$updateTypeArg = $updateTypes -join ","
|
|
|
|
Write-Log "Running Dell Command | Update (updateType=$updateTypeArg, no auto-reboot)..." -Level STEP
|
|
Write-Log " This may take several minutes depending on available updates" -Level INFO
|
|
|
|
$dcuOutput = & $dcuCli /applyUpdates -silent -reboot=disable "-updateType=$updateTypeArg" 2>&1
|
|
$exitCode = $LASTEXITCODE
|
|
$dcuOutput | ForEach-Object { Write-Log " [DCU] $_" -Level INFO }
|
|
|
|
Write-Log " DCU exit code: $exitCode" -Level INFO
|
|
|
|
# Dell Command | Update exit codes:
|
|
# 0 = completed, no updates required or updates applied (no reboot needed)
|
|
# 1 = updates applied, reboot required to finalize BIOS/firmware
|
|
# 5 = no applicable updates found for this system
|
|
# others = error or partial failure
|
|
switch ($exitCode) {
|
|
0 {
|
|
Write-Log "Dell Command | Update: complete (no reboot required)" -Level OK
|
|
}
|
|
1 {
|
|
Write-Log "Dell Command | Update: updates staged - BIOS/firmware will finalize on restart" -Level OK
|
|
Write-Log "Step 11 complete - signalling reboot needed (exit 9)" -Level OK
|
|
exit 9
|
|
}
|
|
5 {
|
|
Write-Log "Dell Command | Update: no applicable updates for this model" -Level OK
|
|
}
|
|
default {
|
|
Write-Log "Dell Command | Update: exit code $exitCode - review DCU log in C:\ProgramData\Dell\UpdateService\Logs" -Level WARN
|
|
}
|
|
}
|
|
}
|
|
|
|
Write-Log "Step 11 complete" -Level OK
|