xetup/scripts/09-pc-identity.ps1
X9 Dev af41dde33c fix: workflow audit - config parsing, step ordering, cleanup
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>
2026-04-17 12:21:41 +02:00

140 lines
5.4 KiB
PowerShell

<#
.SYNOPSIS
Sets PC identity: computer name, description, and creates C:\X9 folder structure.
.DESCRIPTION
Renames the computer if deployment.pcName is set in config.json. Sets the
computer description (visible in System properties and network neighborhood).
Creates C:\X9\ directory structure with subdirectories for logs, scripts and
assets. Copies X9 icon and creates Desktop.ini so the folder shows a custom
icon in Explorer. Computer rename requires a restart - this step runs last
before the final summary.
.ITEMS
rename-computer-dle-config-deployment-pcn: Renames the computer via Rename-Computer if config.json deployment.pcName is set and differs from the current name. Rename takes effect after restart. If pcName is empty, rename is skipped and the current name is preserved.
popis-pocitace-computer-description: Sets the computer description shown in System Properties and Network Neighborhood. Read from config.json deployment.pcDescription, default "X9 deployment". Written to HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\SrvComment.
vytvorit-cx9-adresar: Creates C:\X9\ with subdirectories Logs\, Scripts\, Assets\. Used for deployment logs, custom per-client scripts, and client-specific configuration assets.
cx9-vlastni-ikonka-desktop-ini: Copies X9-ikona.ico to C:\X9\ and creates Desktop.ini with IconResource entry. Sets System+Hidden attributes on Desktop.ini and ReadOnly on C:\X9\ so Explorer displays the custom folder icon.
#>
param(
[string]$ConfigPath,
[string]$LogFile
)
. "$PSScriptRoot\common.ps1"
$Config = Load-Config $ConfigPath
# -----------------------------------------------------------------------
# C:\X9 directory structure
# -----------------------------------------------------------------------
Write-Log "Creating C:\X9 directory structure" -Level INFO
$x9Root = "C:\X9"
$x9Dirs = @("$x9Root\Logs", "$x9Root\Scripts", "$x9Root\Assets")
foreach ($dir in $x9Dirs) {
try {
if (-not (Test-Path $dir)) {
New-Item -ItemType Directory -Path $dir -Force | Out-Null
}
Write-Log " Dir: $dir" -Level OK
}
catch {
Write-Log " Failed to create $dir - $_" -Level ERROR
}
}
# -----------------------------------------------------------------------
# Copy X9 icon and create Desktop.ini for custom folder appearance
# -----------------------------------------------------------------------
$assetsLogo = Join-Path $PSScriptRoot "..\assets\Logo"
$icoSrc = Get-ChildItem -Path $assetsLogo -Filter "*.ico" -ErrorAction SilentlyContinue |
Select-Object -First 1
if ($icoSrc) {
$icoDest = "$x9Root\X9-ikona.ico"
try {
Copy-Item -Path $icoSrc.FullName -Destination $icoDest -Force
Write-Log " Copied icon: $icoDest" -Level OK
}
catch {
Write-Log " Failed to copy icon: $_" -Level WARN
}
$desktopIni = "$x9Root\desktop.ini"
try {
@"
[.ShellClassInfo]
IconResource=X9-ikona.ico,0
[ViewState]
Mode=
Vid=
FolderType=Generic
"@ | Set-Content -Path $desktopIni -Encoding Unicode -Force
# desktop.ini must be System+Hidden; folder must be ReadOnly for Explorer to show the icon
(Get-Item $desktopIni -Force).Attributes = "System,Hidden"
(Get-Item $x9Root).Attributes = "ReadOnly,Directory"
Write-Log " Desktop.ini created for custom folder icon" -Level OK
}
catch {
Write-Log " Failed to create desktop.ini: $_" -Level WARN
}
} else {
Write-Log " No .ico found in assets\Logo - custom folder icon skipped" -Level WARN
}
# -----------------------------------------------------------------------
# Computer description
# -----------------------------------------------------------------------
$pcDesc = "X9 deployment"
if ($Config -and $Config.deployment -and $Config.deployment.pcDescription) {
$pcDesc = $Config.deployment.pcDescription
}
Write-Log "Setting computer description: $pcDesc" -Level INFO
try {
Set-ItemProperty `
-Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" `
-Name "SrvComment" -Value $pcDesc -Type String -Force
Write-Log " Computer description set" -Level OK
}
catch {
Write-Log " Failed to set computer description: $_" -Level ERROR
}
# -----------------------------------------------------------------------
# Rename computer (must be last - requires restart to take effect)
# -----------------------------------------------------------------------
$pcName = $null
if ($Config -and $Config.deployment -and $Config.deployment.pcName) {
$pcName = $Config.deployment.pcName.Trim()
}
$renamed = $false
if ($pcName -and $pcName -ne "") {
$currentName = $env:COMPUTERNAME
if ($currentName -eq $pcName) {
Write-Log "Computer name already '$pcName' - no rename needed" -Level OK
} else {
Write-Log "Renaming computer: '$currentName' -> '$pcName'" -Level INFO
try {
Rename-Computer -NewName $pcName -Force -ErrorAction Stop
Write-Log " Computer renamed to '$pcName' (restart required)" -Level OK
$renamed = $true
}
catch {
Write-Log " Failed to rename computer: $_" -Level ERROR
}
}
} else {
Write-Log "No pcName in config - computer rename skipped" -Level INFO
}
Write-Log "Step 9 complete" -Level OK
# Signal reboot only when rename actually happened
if ($renamed) {
Write-Log "Step 9 - reboot required for rename (exit 9)" -Level OK
exit 9
}