- 02/11 winget: add --source winget to every install; fresh Win11 ISOs ship an App Installer with a stale pinned cert, so the msstore source fails with 0x8a15005e and aborts the install. Forcing the winget source bypasses msstore entirely. - 10 network: enable Network Discovery by -Group "@FirewallAPI.dll,-32752" (resource string) instead of -DisplayGroup "Network Discovery", which is localized and failed on Czech Windows. - 04 profile: set keyboard layout CZ primary + US secondary via Set-WinUserLanguageList (current user) and Preload in the Default hive and HKU\.DEFAULT (welcome screen / system accounts). Always applied. - 02 software: verify Atera via the AteraAgent service (Get-Service) with a path fallback incl. C:\ProgramData, since Atera no longer installs to a fixed location. - 12 windows-update: format Install-WindowsUpdate output via $_.Result/$_.Title instead of logging the raw object (was spamming "System.__ComObject"). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
142 lines
6 KiB
PowerShell
142 lines
6 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
|
|
|
|
# --source winget forces the winget community repo and bypasses the msstore
|
|
# source, which fails on fresh Win11 ISOs whose App Installer ships a stale
|
|
# pinned cert (0x8a15005e), aborting the install.
|
|
$wingetArgs = @(
|
|
"install",
|
|
"--id", "Dell.CommandUpdate.Universal",
|
|
"--source", "winget",
|
|
"--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
|