# Specifikace & anotace

Verze: 0.6 Datum: 2026-04-28 x9/xetup Status: aktivni vyvoj
OK hotovo, v provozu Must fix zname chyby, nutno opravit TODO naplanovano, nerealizovano Open otevrena otazka Warn potencialni problem New nova feature Future dlouhodoby plan

Stavajici kroky (scripty)

00 Admin ucet (adminx9) OK

Vytvorit lokalni ucet `adminx9` | Hotovo
Pridat do skupiny Administrators | Hotovo
Skryt z login obrazovky (SpecialAccounts\UserList = 0) | Hotovo
Heslo nevypirsi, uzivatel nesmeni heslo | Hotovo
Zadne heslo (aktualne nastavovano z config.json) | Opraveno – prazdny SecureString, config.json heslo odstranen
FullName = "X9.cz s.r.o." (via ADSI) | Opraveno – ADSI SetInfo() po vytvoreni uctu

Proc bez hesla: Ucet je skryty pred uzivateli, slouzi pouze MSP adminstraci. Heslo v config.json by bylo ulozene citelne.
01 Bloatware removal OK

AppX balicky – odstraneni pro vsechny uzivatele a provisioned | Remove-AppxPackage -AllUsers + Remove-AppxProvisionedPackage
Zachovano: Microsoft.WindowsCalculator | Zamerny vyjimek
Zachovano: Microsoft.Windows.Photos | Zamerny vyjimek (vychozi prohlizec obrazku)
Windows Capabilities (Fax, IE, OpenSSH, WMP, WordPad, …) | Remove-WindowsCapability
Windows Optional Features (PS 2.0, MediaPlayback, Recall, …) | Disable-WindowsOptionalFeature
GUI prepinace: standardBloatware, removeNewOutlook, removeSnippingTool | Kazdy krok lze v GUI samostatne zaskrtnout/odskrtnout
Novy Outlook for Windows (Microsoft.OutlookForWindows) | Default odebran; klasicky Outlook z M365 (Win32) se nedotyka
Zachovano ve vychozim stavu: Vystrizky / Snipping Tool | ScreenSketch + legacy capability/feature; default OFF (jako Kalkulacka)

02 Software (winget) OK

7-Zip (`7zip.7zip`) | OK
Adobe Acrobat Reader 64-bit (`Adobe.Acrobat.Reader.64-bit`) | OK
OpenVPN Connect (`OpenVPNTechnologies.OpenVPNConnect`) | OK
Atera Agent install (pod SYSTEM) | Invoke-WebRequest + `msiexec /i /qn` spustene jako `NT AUTHORITY\SYSTEM` pres docasny scheduled task. Pod SYSTEM se agent registruje tise bez MFA okna – bez zasahu technika.
Adobe PDF default: .pdf -> AcroRd32 po instalaci | OK – UCPD stop/start kolem zapisu asociace
UCPD.sys (kernel driver, od Feb 2024) blokuje UserChoice | Stop-Service ucpd + 2s sleep + overeni zastaveni pred HKCR zapisem. Na Win11 24H2 je UCPD chranena sluzba a stop selze – logovano jako WARN (ne ERROR); HKCR zapis (system-wide) projde i tak.
Winget parallel joby: timeout 600s + kill zavislych | Wait-Job -Timeout 600; po vyprseni Kill + Remove zavislych jobu
Winget cesta explicitne predavana do parallel jobu | Opraveno – Start-Job nezdedi PATH; winget.exe fullpath preda jako argument. Exit 3010 (success+reboot) nyni vyhodnocen jako OK.
Winget: `--source winget` u kazde instalace | Field fix – fresh Win11 ISO ma App Installer se starym pinned certem, msstore source pada na `0x8a15005e` a instalaci prerusi. `--source winget` msstore obejde. Plati i pro krok 11 (Dell).
Atera: detekce pres sluzbu `Get-Service AteraAgent` | Field fix – agent se obcas instaluje do `C:\ProgramData\`; existence sluzby je spolehlivejsi nez kontrola souboru. Fallback na cesty vc. ProgramData.

Atera Agent URL:
`https://x9.servicedesk.atera.com/api/utils/agent-install/windows/?cid=31&aeid=50b72e7113e54a63ac76b96c54c7e337`
03 System Registry (HKLM) OK

Bypass NRO (OOBE\BypassNRO = 1) | OK
Zakaz auto-instalace Teams | ConfigureChatAutoInstall = 0
Zakaz Cloud Optimized Content | OK
Zakaz Widgets / News and Interests | OK
Hesla bez expirace (`net accounts /maxpwage:UNLIMITED`) | OK
Casova zona: Central Europe Standard Time | OK
Zakaz GameDVR | OK
Zakaz Smart App Control (Intelligent App Control) | HKLM\SYSTEM\CurrentControlSet\Control\CI\Policy\VerifiedAndReputablePolicyState = 0. Permanentni – bez reset OS nelze zapnout zpet.
Zakaz hibernace (`powercfg /hibernate off`) | Odstrani hiberfil.sys, predchazi problemum s power stavy pri deployi
Edge – Mandatory: zakaz First Run, telemetrie | HideFirstRunExperience=1, DefaultBrowserSettingEnabled=0, DiagnosticData=0, FeedbackSurveysEnabled=0. Uzivatel nemuze zmenit.
Edge – initial_preferences: UI defaults (uzivatel muze zmenit) | Zapise `C:\Program Files (x86)\Microsoft\Edge\Application\initial_preferences`. Edge precte jednou pri prvnim vytvoreni profilu. Nastavuje: oblibene vzdy viditelne, skryt Home, zakaz navrhu vyhledavani, cisty NTP, zakaz nakupniho asistenta, odmen a kolekci.
OneDrive uninstall (intentional) | OneDriveSetup.exe /uninstall – odstrani pre-installed verzi. M365 si nainstaluje vlastni.
Powercfg nastaveni (spotreba energie) | hibernate off; standby-ac 0, monitor-ac 60, standby-dc 30, monitor-dc 15
Proxy auto-detect zakaz (AutoDetect = 0) | HKLM\SOFTWARE\Policies\Microsoft\Windows\CurrentVersion\Internet Settings

04 Default Profile + Personalizace OK

Taskbar: zarovnat vlevo (TaskbarAl = 0) | Win11 default je center
Taskbar: skryt Search, Copilot, Task View, Widgets, Chat | OK
Taskbar: zobrazit vsechny ikonky v tray (EnableAutoTray = 0) | Win11 periodicky znovu skryva tray ikony po updatu
Taskbar: explicitni pinlist (TaskbarLayoutModification.xml) | default/user: Pruzkumnik + Edge; admin: Pruzkumnik + Edge + PowerShell. `PinListPlacement="Replace"` – prazdny seznam by dovoloval Windows pridat Store a dalsi vychozi. Pruzkumnik se pinuje pres AUMID `DesktopApplicationID="Microsoft.Windows.Explorer"`, ne vlastni .lnk – ten by spoustel druhy Explorer a slo by ho spatne odepnout.
Explorer: zobrazovat pripony souboru (HideFileExt = 0) | OK
Explorer: otevrit na This PC (LaunchTo = 1) | OK
Explorer: ShowRecent = 0, ShowFrequent = 0 | Skryt nedavne a caste soubory v Quick Access
Explorer: FullPath = 1 (CabinetState) | Zobrazovat plnou cestu v titulku okna Explorera
Start menu: vyprazdnit piny (Win11) | ConfigureStartPins = {"pinnedList":[]}
Start menu: zakaz Bing vyhledavani | DisableSearchBoxSuggestions = 1
Copilot: zakaz (TurnOffWindowsCopilot = 1) | OK
NumLock zapnout pri startu (InitialKeyboardIndicators = 2) | OK
Klavesnice: CZ primarni + US sekundarni | Field fix – Set-WinUserLanguageList (cs-CZ + en-US) pro aktualniho uzivatele; Preload (`1=00000405` CZ, `2=00000409` US) do Default hive i `HKU\.DEFAULT` (welcome screen + systemove ucty). Aplikuje se vzdy automaticky.
System tema (taskbar, Start): Dark | OK
Aplikacni tema: Light | OK
Accent barva: #223B47 (tmave modroseda) | AccentColor DWORD = 0xFF473B22 (ABGR) + AccentPalette (REG_BINARY, 8 odstinu). Bez AccentPalette Win11 vlastni accent na Startu/taskbaru ignoruje a spadne na default – proto se barvy „neaplikovaly vsude".
Accent barva na Start a taskbaru (ColorPrevalence = 1) | Themes\Personalize i DWM\ColorPrevalence = 1 (Start/taskbar i zahlavi a ohraniceni oken). Rezim Custom: tmavy system + svetle aplikace.
Motiv aplikovan ve vsech profilech | Default hive (novi uzivatele) + aktualni HKCU + `HKU\.DEFAULT` (lock/welcome screen, systemovy kontext).
Pruhlednost: vypnuta (EnableTransparency = 0) | OK
Tapeta: jednobarevna #223B47; Wallpaper="" v default hive | BackInfo prepise tapetu svym BMP; prazdny retezec = solid barva, ne cerna plocha
OneDrive RunOnce klic odstranen | Odstraneni branil reinstalaci pres M365 – klice smazany ze skriptu

Metoda: `reg load HKU\DefaultProfile C:\Users\Default\NTUSER.DAT` → zapsat zmeny → `reg unload HKU\DefaultProfile`.
Personalizace (barvy, tapeta) je soucasti tohoto kroku – jeden hive load/unload, zadna kontigence s dalsimi skripty. BackInfo.exe (krok 07) prepise tapetu BMP pri kazdem logonu.
07 BackInfo (systemovy info na tapete) OK

`07-desktop-info.ps1` SMAZAT – stary pristup | Nahrazeno novym `07-backinfo.ps1`
Zkopirovat `assets/Backinfo/` do `C:\Program Files\Backinfo\` | Implementovano v 07-backinfo.ps1
Spustit `backinfo_W11.ps1` (detekce OS, registry, Startup) | Logika inlinovana v 07-backinfo.ps1
BackInfo.exe v assets/Backinfo/ k dispozici | Hotovo
BackInfo auto-start pri kazdem logonu via Startup shortcut | Shortcut do ProgramData\StartUp vytvori 07-backinfo.ps1
Pozadi #223B47 (`BackgroundColor = 4668194`) | BackInfo bere hodnotu jako COLORREF (`0x00BBGGRR`, BGR): B=71 G=59 R=34 = 4668194. Hodnota 2243399 (RGB) se cetla jako COLORREF, prohodila R/B a renderovala olivove hnedou (#473B22).
Desktopova barva pozadi #223B47 ve vsech profilech | BackInfo dela vystredenou bitmapu; kdyz je mensi nez obrazovka, okolo prosvita `Control Panel\Colors\Background`. Nastavuje se v Default hive, aktualnim HKCU, `HKU\.DEFAULT` i v kazdem existujicim profilu – jinak byl okraj cerny.

BackInfo.ini konfiguruje: hostname (velky, centrovan), uzivatelske jmeno, OS verze, HW info (CPU, RAM, disk), sitove informace (IP, hostname).
Proc BackInfo misto vlastniho PS: BackInfo.exe podporuje Win10 i Win11 bez specialnich hacku, je stabilni a uz je v assets.
08 Windows aktivace OK Open

OA3 BIOS/UEFI klic – kontrola embedded key | WMI: SoftwareLicensingService.OA3xOriginalProductKey
Klic z config.json (`activation.productKey`) | OK – priorita nad OA3 a GVLK
Fallback na GVLK (KMS client key) dle EditionID | Registry `EditionID` (nelokalizovany) misto Win32_OperatingSystem.Caption
Volitelny KMS server (`activation.kmsServer`) | OK
Preskocit pokud jiz aktivovano | OK
Typ klice: MAK vs KMS vs retail? | Zavisi na klientovi – otevrena otazka

09 PC identita – Rename + C:\X9 OK

Rename-Computer dle parametru z GUI nebo config.json | `deployment.pcName` v config.json; preskoci pokud neni nastaveno
Nastavit popis pocitace (Computer Description) | LanmanServer\Parameters\SrvComment; default "X9 deployment"
Vytvorit `C:\X9\` adresarovou strukturu | C:\X9\Logs, Scripts, Assets
Vlastni ikonka pro `C:\X9\` slozku | Desktop.ini + X9-ikona.ico z assets\Logo\

Rename-Computer vyzaduje restart. Tento krok bezi jako posledni pred finalnim shrnutim – po nem nasleduje automaticky odpocet a restart v GUI.
10 Network discovery + firewall OK

Nastavit sitovy profil jako Private (ne Public) | Set-NetConnectionProfile pro vsechny pripojene adaptery
Povolit ping (ICMP) pro diagnostiku | Enable-NetFirewallRule: FPS-ICMP4-ERQ-In + FPS-ICMP6-ERQ-In
Zapnout Network Discovery pro Private profil | Set-NetFirewallRule `-Group "@FirewallAPI.dll,-32752"` (resource string, nezavisly na jazyku) + netsh fallback. Field fix: drivejsi `-DisplayGroup "Network Discovery"` selhalo na ceske lokalizaci Win11.

11 Dell Command | Update OK

Detekce Dell hardware (`Win32_ComputerSystem`) | Non-Dell stroj krok preskoci bez chyby – stejny skript pro vsechny HW
Instalace Dell Command | Update via winget | `Dell.CommandUpdate.Universal` – silent, Win10 + Win11
Spusteni vsech aktualizaci: drivery, firmware, BIOS | `dcu-cli.exe /applyUpdates -silent -reboot=disable`
BIOS/firmware se staging – dokonci se pri restartu | Restart na konci deploymetu vse dokonci

Non-Dell stroje: krok se preskoci automaticky, zadna chyba. Dell Latitude, OptiPlex, Precision, Vostro, XPS – vsechny podporovane DCU Universal.
Casova narocnost: 5–20 minut podle poctu dostupnych aktualizaci a rychlosti sitoveho pripojeni.
12 Windows Update OK

Instalace NuGet providera + PSWindowsUpdate modulu ze PSGallery | Install-PackageProvider + Install-Module PSWindowsUpdate -Force
Prvni pruchod aktualizaci (bez rebootu) | Install-WindowsUpdate -AcceptAll -IgnoreReboot. Vystup formatovan pres `$_.Result` + `$_.Title` (drive log zaplaval radky "System.__ComObject").
Reboot cyklus (exit 9) – pokracovani pres xetup resume | Exit 9 = reboot needed; xetup ulozi stav, nastavi autologon + X9-Resume task, restartuje
Automaticky restart po skonceni deploymetu (GUI odpocet) | xetup.exe zobrazi 60s odpocet + tlacitka "Restartovat ted" / "Zrusit restart"

Windows Update typicky vyzaduje vice restartovacich kolu. Kazdy pruchod skonci exit 9 (dalsi updaty) nebo exit 0 (hotovo). xetup resume cyklus automaticky opakuje az do uplne aktualizace. Max 5 rebootu na krok (ochrana proti smycce).
Pozor: Prvni restart spusti jak Windows Update, tak Dell firmware staging (krok 11).
04+ Taskbar pinned apps (profily) OK Open

`-ProfileType` parametr: default / admin / user | Parametr GUI nebo config.json; predano do skriptu 04
XML layout pro "default" a "user": Pruzkumnik + Edge | `PinListPlacement="Replace"` – explicitni seznam zamezuje pridani Store a dalsich vychozich appek
XML layout pro "admin": Pruzkumnik + Edge + PowerShell | TaskbarLayoutModification.xml; PowerShell.lnk z System32
Win11 24H2 kompatibilita layoutu | 24H2 vyzaduje ProvisionedLayoutModification.xml – nutno otestovat na realne instalaci

Layout se pri aplikaci zamkne. UnlockStartLayout scheduled task (registrovany v kroku 04) ho odemkne 5 min po startu, aby uzivatel mohl dale upravovat.

Architektura

Arc xetup.exe – Go GUI (Walk / Win32) OK

Single binary (go:embed scripty + assets) | `embed.go` + `cmd/xetup/main.go`; ~5 MB .exe, zadne externi zavislosti
Walk GUI – Win32 nativni ovladky, bez OpenGL | Funguje na VMware ESXi / SVGA II (Fyne/OpenGL nefungovalo). `internal/gui/gui.go`
Formular: PC jmeno, popis, product key, profil | Faze 1 – config form pred spustenim
Checklist kroku (on/off per-feature) + nacist / ulozit config.json | Tlacitka "Nacist config..." a "Ulozit config..." pro per-klient presety
Live log + prubehovy strip kroku (0–12) | Barevne indikatory: · cekajici, ► bezici (modra), ✓ OK (zelena), ✗ chyba (cervena)
Summary s odpoctem a automatickym restartem | Faze 3 – 60s odpocet, tlacitka "Restartovat ted" / "Zrusit restart"
UAC requireAdministrator (app.manifest + rsrc) | Windows vyzada elevaci pri spusteni; ComCtl32 v6 + DPI awareness
PowerShell okno skryte na pozadi | SysProcAttr.HideWindow = true; PS chyby filtrovane (At line:, CategoryInfo atd.)
Watchdog timer: 30 min ticho = kill skriptu | time.AfterFunc s Reset pri kazdem vystupu – zabiji zavisly PS proces
Reboot loop ochrana: max 5 pokusu na krok | RetryCounts v state.json; po 5 restartech krok oznacen ERROR a preskocen
Atomicky zapis state.json (write tmp + rename) | Prevence korupce pri vypadku napajeni behem zapisu
E-mail report: 3 pokusy + lokalni HTML fallback | Backoff 0/1/5s; vzdy ulozi `C:\X9\report.html` bez ohledu na SMTP
Hive unload retry (5 pokusu, GC pred kazdym) | Prevence "hive in use" chyby pri reg unload ntuser.dat
Resume fix: StepsByIDs nyni nastavuje Enabled=true | Opravena kriticka chyba – resume mode preskakoval vsechny kroky
Code signing: Azure Trusted Signing (jsign) | CI podepise `xetup.exe` certem X9.cz s.r.o. + RFC3161 timestamp. Trusted Signing cert je kratkodoby (~3 dny) – timestamp udrzi podpis platny i po expiraci. SmartScreen/UAC pak ukaze overeneho vydavatele.
Self-update: stahnout novou verzi z xetup.x9.cz/dl | Overit hash pred spustenim
config.json: per-klient preset na USB | Jmeno PC prefix, SW seznam, klic – lezi vedle .exe

Struktura: `cmd/xetup/`, `internal/config/`, `internal/gui/`, `internal/runner/`
Go zavislosti: github.com/lxn/walk (Win32 GUI), golang.org/x/sys
Build: `CGO_ENABLED=1 CC=x86_64-w64-mingw32-gcc GOOS=windows GOARCH=amd64 go build -ldflags="-s -w -H windowsgui" ./cmd/xetup/`
CI (Forgejo Actions) sestavi, podepise (Azure Trusted Signing, cert X9.cz s.r.o. + RFC3161 timestamp pres jsign) a publikuje automaticky pri kazdem push na main.
Spolehlivost (v0.6): Watchdog zabiji zavisle skripty po 30 min ticha. Reboot-loop ochrana omezi opakovani kazdeho kroku na 5 restartu. State file se zapisuje atomicky (tmp+rename). E-mail report se zkusi 3x s backoff a vzdy ulozi lokalni HTML kopii.
Arc spec.yaml – single source of truth Future

Popis vsech kroku: id, label, script, default | xetup.exe cte spec.yaml pro TUI checklist
Pole "requires" (napr. activation vyzaduje productKey) | TUI upozorni pokud chybi
Auto-generovana dokumentace z spec.yaml | CI akce: spec.yaml → tato stranka
spec.yaml jako SSOT pro tuto stranku i deploy skripty | Idealni stav: stranka vzdy odpovida kodu

Navrh struktury spec.yaml:
`steps: - id: admin-account label: "Admin account (adminx9)" script: 00-admin-account.ps1 default: true - id: activation label: "Windows activation" script: 08-activation.ps1 default: true requires: [productKey]`

Nove nastaveni – pozadavky

+ Novy pozadavek na automatizaci Pozadavky

Chcete automatizovat neco, co skript zatim neresi? Napiste pozadavek sem – ulozi se do repozitare. Technicky tym ho projde a zaradi do planu.

Nacitam pozadavky...