From b4e0ed7db87b207ecf0361d54e76cb788f23c0af Mon Sep 17 00:00:00 2001 From: Manuel Thalmann Date: Tue, 27 Aug 2024 14:05:16 +0200 Subject: [PATCH] Execute OneShot tasks in any operation --- scripts/Common/Scripts/Config.ps1 | 4 +- scripts/Common/Scripts/Operations.ps1 | 47 +- scripts/Windows/OS/Install.ps1 | 832 +++++++++++++------------- 3 files changed, 438 insertions(+), 445 deletions(-) diff --git a/scripts/Common/Scripts/Config.ps1 b/scripts/Common/Scripts/Config.ps1 index 0e4eae53..9fd6db22 100644 --- a/scripts/Common/Scripts/Config.ps1 +++ b/scripts/Common/Scripts/Config.ps1 @@ -3,8 +3,6 @@ using namespace System.Security.AccessControl; using namespace System.Security.Principal; enum SetupStage { - Idle - OneShot Configure Install CreateUser @@ -389,7 +387,7 @@ $null = New-Module { Gets a value indicating whether the setup has finished. #> function Get-IsFinished { - return [bool] (((Get-Stage) -eq ([SetupStage]::Idle)) -or (Get-SetupOption $finishedOption)); + return [bool](Get-SetupOption $finishedOption); } <# diff --git a/scripts/Common/Scripts/Operations.ps1 b/scripts/Common/Scripts/Operations.ps1 index e8c71856..5a1134d6 100644 --- a/scripts/Common/Scripts/Operations.ps1 +++ b/scripts/Common/Scripts/Operations.ps1 @@ -29,18 +29,24 @@ $null = New-Module { function Start-Operation { param( - [switch] $NonInteractive = ((Get-Stage) -eq ([SetupStage]::OneShot)), + [switch] $NonInteractive, [switch] $NoImplicitCleanup, [scriptblock] $Action ) $cleanup = { }; + $taskPending = $false; if (-not $Global:InOperation) { if ($env:DEBUG) { Set-PSDebug -Trace 1; } + if ($null -ne (Get-OneShotTask)) { + $taskPending = $true; + [switch] $NonInteractive = $true; + } + $Global:InOperation = $true; $Global:ErrorActionPreference = $NonInteractive.IsPresent ? 'Continue' : 'Inquire'; @@ -229,7 +235,12 @@ $null = New-Module { } } - & $Action; + if ($taskPending) { + Start-OneShot; + } else { + & $Action; + } + & $cleanup; } @@ -238,7 +249,13 @@ $null = New-Module { Gets the current OneShot task. #> function Get-OneShotTask { - [OneShotTask](Get-SetupOption $taskOption); + $task = Get-SetupOption $taskOption; + + if ($task) { + return [OneShotTask]$task; + } else { + return $null; + } } <# @@ -291,8 +308,6 @@ $null = New-Module { [OneShotTask] $Task ) - $currentStage = Get-Stage; - Set-Stage ([SetupStage]::OneShot); & $taskSetter $Task; & { @@ -321,8 +336,6 @@ $null = New-Module { } }; - Set-Stage $currentStage; - if (Test-Path $errorPath) { $errorMessage = Get-Content $errorPath; Remove-Item $errorPath; @@ -340,23 +353,27 @@ $null = New-Module { Executes the specified action and notifies the OneShot task executor. #> function Start-OneShot { - param( - [scriptblock] $Action - ) - try { - Start-Operation -NonInteractive @PSBoundParameters; + Write-Host "Running OneShot task ``$(Get-OneShotTask)``"; + + switch (Get-OneShotTask) { + ([OneShotTask]::InitializeMSAccount) { + Initialize-UserCreation; + } + ([OneShotTask]::DisableUAC) { + Disable-UAC; + Register-Setup; + } + } } catch { Set-Content -Path $errorPath -Value $Error; Set-UserPermissions $errorPath; } finally { - Set-Stage ([SetupStage]::Idle); + & $taskSetter $null; Write-EventLog -LogName $logName -Source $logName -EventId $oneShotTrigger -Message "The OneShot task ``$(Get-OneShotTask)`` finished."; } - - exit; } <# diff --git a/scripts/Windows/OS/Install.ps1 b/scripts/Windows/OS/Install.ps1 index 9de37dc0..b46f9bb2 100644 --- a/scripts/Windows/OS/Install.ps1 +++ b/scripts/Windows/OS/Install.ps1 @@ -9,7 +9,6 @@ using namespace System.Security.Principal; . "$PSScriptRoot/../Scripts/WSL.ps1"; . "$PSScriptRoot/../Software/Firefox/Install.ps1"; . "$PSScriptRoot/../../Common/Scripts/Context.ps1"; -. "$PSScriptRoot/../../Common/Types/OneShotTask.ps1"; $null = New-Module { . "$PSScriptRoot/../Scripts/Hooks.ps1"; @@ -23,7 +22,6 @@ $null = New-Module { . "$PSScriptRoot/../../Common/Scripts/Software.ps1"; . "$PSScriptRoot/../../Common/Scripts/SoftwareManagement.ps1"; . "$PSScriptRoot/../../Common/Types/InstallerAction.ps1"; - . "$PSScriptRoot/../../Common/Types/OneShotTask.ps1"; <# .SYNOPSIS @@ -41,452 +39,432 @@ $null = New-Module { #> function Start-InstallationLoop { while (-not (Get-IsFinished)) { + if (Test-Admin) { + $null = Import-Module PSWindowsUpdate; + + Invoke-Hook "Invoke-WindowsUpdate" -Fallback { + Update-WindowsInstallation; + }; + + if ((Get-WURebootStatus -Silent)) { + Restart-Intermediate; + return; + } + } + + <# + .SYNOPSIS + Deploys an action for each software. + + .PARAMETER Action + The action to execute by default. + #> + function Deploy-SoftwareAction { + param( + [Nullable[InstallerAction]] $Action = $null + ) + + [bool] $install = $false; + $arguments = [hashtable]@{ }; + + if ($null -ne $Action) { + $install = ($Action -eq ([InstallerAction]::Install)); + $null = $arguments.Add("action", $Action); + } else { + $install = $true; + } + + # Drivers + & { + $driverPath = "$PSScriptRoot/../Drivers"; + $mbPath = "$driverPath/ROG Zenith Extreme Alpha"; + + if ($install) { + if (Get-Config "valhalla.hardware.elgatoWave") { + if (-not (Test-ChocoPackage wavelink)) { + Install-ChocoPackage wavelink -ArgumentList '--install-arguments="/norestart"'; + Remove-DesktopIcon "*Wave Link*"; + Restart-Intermediate; + exit; + } + } + } + + foreach ($component in (Get-Config "valhalla.hardware.components")) { + switch ($component) { + ("ROG Zenith Extreme Alpha") { + & "$mbPath/MarvellEthernet/Manage.ps1" @arguments; + & "$mbPath/IntelWiFi/Manage.ps1" @arguments; + & "$mbPath/IntelBluetooth/Manage.ps1" @arguments; + & "$mbPath/AMDChipsetX399/Manage.ps1" @arguments; + & "$driverPath/AMDChipsetX399/Manage.ps1" @arguments; + } + ("Predator Z301C") { + & "$driverPath/Predator Z301C/Manage.ps1" @arguments; + } + } + } + + if ($install) { + if (Get-Config "valhalla.hardware.amdCPU") { + Install-ChocoPackage amd-ryzen-master; + # ToDo: backup Ryzen energy saving plan + } + + if (Get-Config "valhalla.hardware.nvidiaGPU") { + Install-ChocoPackage geforce-game-ready-driver; + Remove-DesktopIcon "*Geforce*"; + } + + if (Get-Config "valhalla.hardware.corsairDevice") { + Install-ChocoPackage icue; + } + } + + if (Get-Config "valhalla.hardware.eyeX") { + & "$driverPath/Tobii EyeX/Manage.ps1" @arguments; + } + }; + + & { + # Windows Config + $softwarePath = "$PSScriptRoot/../Software"; + $commonSoftware = "$PSScriptRoot/../../Common/Software"; + & "$softwarePath/Windows/Manage.ps1" @arguments; + + if (Get-Config "valhalla.hardware.logitechG") { + & "$softwarePath/LGHub/Manage.ps1" @arguments; + } + + if (Test-Collection "essential") { + # Essentials + & "$softwarePath/aliae/Main.ps1" @arguments; + & "$softwarePath/git/Manage.ps1" @arguments; + & "$softwarePath/OpenSSH/Manage.ps1" @arguments; + & "$softwarePath/PowerShell/Manage.ps1" @arguments; + & "$softwarePath/chocolatey/Manage.ps1" @arguments; + & "$softwarePath/zoxide/Manage.ps1" @arguments; + & "$commonSoftware/posh-git/Manage.ps1" @arguments; + & "$commonSoftware/Terminal-Icons/Manage.ps1" @arguments; + & "$softwarePath/Oh My Posh/Manage.ps1" @arguments; + + if (Get-Config "valhalla.windows.dualboot") { + & "$softwarePath/Ext4Fsd/Main.ps1" @arguments; + } + + if ($install) { + Install-ChocoPackage ` + procexp ` + procmon ` + ; + + Install-WingetPackage ` + KDE.KDEConnect ` + ; + } + } + + if (Test-Collection "common") { + # Common Software + & "$softwarePath/WinSCP/Manage.ps1" @arguments; + & "$softwarePath/Thunderbird/Manage.ps1" @arguments; + & "$softwarePath/PuTTY/Manage.ps1" @arguments; + + if ($install) { + Install-ChocoPackage ` + 7zip ` + chocolateygui ` + DefaultProgramsEditor ` + bitwarden ` + keepass ` + ; + + Install-WingetPackage ` + SomePythonThings.WingetUIStore ` + ; + + Remove-DesktopIcon "UniGetUI*"; + } + } + + if (Test-Collection "desktopExperience") { + if ($install) { + # Fonts + Install-ChocoPackage nerd-fonts-CascadiaCode; + + # Internet Access + Install-WingetPackage Brave.Brave kamranahmedse.pennywise; + Remove-DesktopIcon "*Brave*"; + Remove-TaskbarItem "*Brave*"; + Remove-DesktopIcon "Pennywise*"; + + # Tools + Install-SetupPackage -Source "https://github.com/mRemoteNG/mRemoteNG/releases/download/2023.03.03-v1.77.3-nb/mRemoteNG-Installer-1.77.3.nb-1784.msi" -ArgumentList "/Quiet"; + Remove-DesktopIcon "mRemoteNG*"; + + Install-ChocoPackage ` + gimp ` + gpu-z ` + windirstat ` + winmerge ` + handbrake ` + hwmonitor ` + qbittorrent ` + imgburn ` + inkscape ` + krita ` + MetaX ` + obs-studio ` + ; + + Remove-DesktopIcon "GIMP*"; + Remove-DesktopIcon "GPU-Z*"; + Remove-DesktopIcon "WinDirStat*"; + Remove-DesktopIcon "*HWMonitor*"; + Remove-DesktopIcon "ImgBurn*"; + Remove-DesktopIcon "InkScape*"; + Remove-DesktopIcon "Krita*"; + Remove-DesktopIcon "MetaX*"; + Remove-DesktopIcon "OBS Studio*"; + + Install-WingetPackage ` + AntSoftware.AntRenamer ` + AppWork.JDownloader; + + Remove-DesktopIcon "JDownloader*"; + } + + # ToDo: Consider hiding behind own config? + & "$softwarePath/Ubiquiti UniFi Controller/Manage.ps1" @arguments; + + # Internet Access + & "$softwarePath/Firefox/Manage.ps1" @arguments; + & "$softwarePath/MSEdgeRedirect/Manage.ps1" @arguments; + + if (Test-Collection "fileSync") { + & "$softwarePath/Nextcloud/Main.ps1" @arguments; + } + } + + if (Test-Collection "socialMedia") { + if ($install) { + Install-ChocoPackage ` + signal ` + threema-desktop ` + element-desktop ` + teamspeak ` + ; + + Remove-DesktopIcon "*Element*"; + Remove-DesktopIcon "*TeamSpeak*"; + + Install-WingetPackage Discord.Discord; + Remove-DesktopIcon "*Discord*"; + } + } + + if (Test-Collection "media") { + if ($install) { + Install-ChocoPackage ` + k-litecodecpackmega ` + vlc ` + ; + + Remove-DesktopIcon "VLC*"; + Install-ChocoPackage jellyfin-media-player -ArgumentList "--install-args","/norestart"; + Remove-DesktopIcon "Jellyfin Media Player*"; + Install-WingetPackage Ytmdesktop.Ytmdesktop; + Remove-DesktopIcon "Youtube Music*"; + } + } + + if (Test-Collection "coding") { + if ($install) { + + Install-ChocoPackage ` + gh ` + github-desktop ` + ida-free ` + HxD ` + docker-desktop ` + imhex ` + dotpeek ` + ; + + Remove-DesktopIcon "IDA *"; + Remove-DesktopIcon "GitHub*"; + Remove-DesktopIcon "Docker*"; + } + + & "$softwarePath/vscode/Main.ps1" @arguments; + & "$softwarePath/VisualStudio/Manage.ps1" @arguments; + + # Node.js + & "$softwarePath/NVS/Manage.ps1" @arguments; + } + + if (Test-Collection "gaming") { + # Gaming + if ($install) { + Install-ChocoPackage ` + goggalaxy ` + epicgameslauncher ` + rayman-controlpanel ` + ppsspp ` + ; + + Remove-DesktopIcon "*Epic Games*"; + Remove-DesktopIcon "*PPSSPP *-Bit*"; + + Install-ChocoPackage ` + steam ` + ubisoft-connect ` + -ArgumentList "--ignore-checksums" ` + ; + + Remove-DesktopIcon "*Steam*"; + Remove-DesktopIcon "*Ubisoft Connect*"; + + Install-WingetPackage ElectronicArts.EADesktop; + Remove-DesktopIcon "EA.*"; + } + + & "$softwarePath/TrackMania Nations Forever/Manage.ps1" @arguments; + & "$softwarePath/TrackMania United Forever/Manage.ps1" @arguments; + & "$softwarePath/ManiaPlanet/Manage.ps1" @arguments; + & "$softwarePath/osu!/Manage.ps1" @arguments; + & "$softwarePath/osu!lazer/Manage.ps1" @arguments; + & "$softwarePath/RetroArch/Manage.ps1" @arguments; + & "$softwarePath/reWASD/Manage.ps1" @arguments; + } + }; + } + switch (Get-Stage) { ($null) { Set-Stage ([SetupStage]::Configure); break; } - ([SetupStage]::OneShot) { - Write-Host "Running OneShot task ``$(Get-OneShotTask)``"; - - Start-OneShot { - switch (Get-OneShotTask) { - ([OneShotTask]::InitializeMSAccount) { - Initialize-UserCreation; - } - ([OneShotTask]::DisableUAC) { - Disable-UAC; - Register-Setup; - } + ([SetupStage]::Configure) { + if (Get-Config "valhalla.windows.dualboot.enable") { + if (-not (Test-Qemu)) { + # Fix synchronization between Linux and Windows clocks. + Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\TimeZoneInformation" -Name "RealTimeIsUniversal" -Value 1 -Type "DWord"; } - }; - break; + # Force time resynchronization + $timeZoneOption = "Start"; + $timeZoneKey = "HKLM:\SYSTEM\CurrentControlSet\Services\tzautoupdate"; + $service = Get-Service W32Time; + $autoUpdate = (Get-Item $timeZoneKey).GetValue($timeZoneOption); + $stopped = ($service.Status -eq "Stopped"); + + $setUpdate = { param([int] $Value) Set-ItemProperty $timeZoneKey -Name $timeZoneOption $Value }; + & $setUpdate 3; + Start-Service $service; + w32tm /resync /force; + & $setUpdate $autoUpdate; + + if ($stopped) { + Stop-Service $service; + } + } + + Set-Stage ([SetupStage]::Install); } - default { - if (Test-Admin) { - $null = Import-Module PSWindowsUpdate; + ([SetupStage]::Install) { + Write-Host "Entering install phase"; + Deploy-SoftwareAction; + Set-Stage ([SetupStage]::CreateUser); + } + ([SetupStage]::CreateUser) { + $users = @(Get-Users); + $i = Get-CurrentUser; - Invoke-Hook "Invoke-WindowsUpdate" -Fallback { - Update-WindowsInstallation; - }; + for (; $i -lt $users.Count; $i++) { + $name = $users[$i]; + $msAccount = Get-UserConfig -UserName $name "microsoftAccount"; + Set-CurrentUser $i; - if ((Get-WURebootStatus -Silent)) { - Restart-Intermediate; - return; - } - } - - <# - .SYNOPSIS - Deploys an action for each software. - - .PARAMETER Action - The action to execute by default. - #> - function Deploy-SoftwareAction { - param( - [Nullable[InstallerAction]] $Action = $null - ) - - [bool] $install = $false; - $arguments = [hashtable]@{ }; - - if ($null -ne $Action) { - $install = ($Action -eq ([InstallerAction]::Install)); - $null = $arguments.Add("action", $Action); - } else { - $install = $true; + if (Test-Admin) { + Disable-BootMessage; } - # Drivers - & { - $driverPath = "$PSScriptRoot/../Drivers"; - $mbPath = "$driverPath/ROG Zenith Extreme Alpha"; - - if ($install) { - if (Get-Config "valhalla.hardware.elgatoWave") { - if (-not (Test-ChocoPackage wavelink)) { - Install-ChocoPackage wavelink -ArgumentList '--install-arguments="/norestart"'; - Remove-DesktopIcon "*Wave Link*"; - Restart-Intermediate; - exit; - } + while ((Get-UserStage) -ne ([UserStage]::Completed)) { + switch (Get-UserStage) { + ($null) { + Set-UserStage ([UserStage]::Create); + continue; } - } + ([UserStage]::Create) { + if ($env:UserName -ne $name) { + New-ValhallaUser $name; - foreach ($component in (Get-Config "valhalla.hardware.components")) { - switch ($component) { - ("ROG Zenith Extreme Alpha") { - & "$mbPath/MarvellEthernet/Manage.ps1" @arguments; - & "$mbPath/IntelWiFi/Manage.ps1" @arguments; - & "$mbPath/IntelBluetooth/Manage.ps1" @arguments; - & "$mbPath/AMDChipsetX399/Manage.ps1" @arguments; - & "$driverPath/AMDChipsetX399/Manage.ps1" @arguments; - } - ("Predator Z301C") { - & "$driverPath/Predator Z301C/Manage.ps1" @arguments; - } - } - } - - if ($install) { - if (Get-Config "valhalla.hardware.amdCPU") { - Install-ChocoPackage amd-ryzen-master; - # ToDo: backup Ryzen energy saving plan - } - - if (Get-Config "valhalla.hardware.nvidiaGPU") { - Install-ChocoPackage geforce-game-ready-driver; - Remove-DesktopIcon "*Geforce*"; - } - - if (Get-Config "valhalla.hardware.corsairDevice") { - Install-ChocoPackage icue; - } - } - - if (Get-Config "valhalla.hardware.eyeX") { - & "$driverPath/Tobii EyeX/Manage.ps1" @arguments; - } - }; - - & { - # Windows Config - $softwarePath = "$PSScriptRoot/../Software"; - $commonSoftware = "$PSScriptRoot/../../Common/Software"; - & "$softwarePath/Windows/Manage.ps1" @arguments; - - if (Get-Config "valhalla.hardware.logitechG") { - & "$softwarePath/LGHub/Manage.ps1" @arguments; - } - - if (Test-Collection "essential") { - # Essentials - & "$softwarePath/aliae/Main.ps1" @arguments; - & "$softwarePath/git/Manage.ps1" @arguments; - & "$softwarePath/OpenSSH/Manage.ps1" @arguments; - & "$softwarePath/PowerShell/Manage.ps1" @arguments; - & "$softwarePath/chocolatey/Manage.ps1" @arguments; - & "$softwarePath/zoxide/Manage.ps1" @arguments; - & "$commonSoftware/posh-git/Manage.ps1" @arguments; - & "$commonSoftware/Terminal-Icons/Manage.ps1" @arguments; - & "$softwarePath/Oh My Posh/Manage.ps1" @arguments; - - if (Get-Config "valhalla.windows.dualboot") { - & "$softwarePath/Ext4Fsd/Main.ps1" @arguments; - } - - if ($install) { - Install-ChocoPackage ` - procexp ` - procmon ` - ; - - Install-WingetPackage ` - KDE.KDEConnect ` - ; - } - } - - if (Test-Collection "common") { - # Common Software - & "$softwarePath/WinSCP/Manage.ps1" @arguments; - & "$softwarePath/Thunderbird/Manage.ps1" @arguments; - & "$softwarePath/PuTTY/Manage.ps1" @arguments; - - if ($install) { - Install-ChocoPackage ` - 7zip ` - chocolateygui ` - DefaultProgramsEditor ` - bitwarden ` - keepass ` - ; - - Install-WingetPackage ` - SomePythonThings.WingetUIStore ` - ; - - Remove-DesktopIcon "UniGetUI*"; - } - } - - if (Test-Collection "desktopExperience") { - if ($install) { - # Fonts - Install-ChocoPackage nerd-fonts-CascadiaCode; - - # Internet Access - Install-WingetPackage Brave.Brave kamranahmedse.pennywise; - Remove-DesktopIcon "*Brave*"; - Remove-TaskbarItem "*Brave*"; - Remove-DesktopIcon "Pennywise*"; - - # Tools - Install-SetupPackage -Source "https://github.com/mRemoteNG/mRemoteNG/releases/download/2023.03.03-v1.77.3-nb/mRemoteNG-Installer-1.77.3.nb-1784.msi" -ArgumentList "/Quiet"; - Remove-DesktopIcon "mRemoteNG*"; - - Install-ChocoPackage ` - gimp ` - gpu-z ` - windirstat ` - winmerge ` - handbrake ` - hwmonitor ` - qbittorrent ` - imgburn ` - inkscape ` - krita ` - MetaX ` - obs-studio ` - ; - - Remove-DesktopIcon "GIMP*"; - Remove-DesktopIcon "GPU-Z*"; - Remove-DesktopIcon "WinDirStat*"; - Remove-DesktopIcon "*HWMonitor*"; - Remove-DesktopIcon "ImgBurn*"; - Remove-DesktopIcon "InkScape*"; - Remove-DesktopIcon "Krita*"; - Remove-DesktopIcon "MetaX*"; - Remove-DesktopIcon "OBS Studio*"; - - Install-WingetPackage ` - AntSoftware.AntRenamer ` - AppWork.JDownloader; - - Remove-DesktopIcon "JDownloader*"; - } - - # ToDo: Consider hiding behind own config? - & "$softwarePath/Ubiquiti UniFi Controller/Manage.ps1" @arguments; - - # Internet Access - & "$softwarePath/Firefox/Manage.ps1" @arguments; - & "$softwarePath/MSEdgeRedirect/Manage.ps1" @arguments; - - if (Test-Collection "fileSync") { - & "$softwarePath/Nextcloud/Main.ps1" @arguments; - } - } - - if (Test-Collection "socialMedia") { - if ($install) { - Install-ChocoPackage ` - signal ` - threema-desktop ` - element-desktop ` - teamspeak ` - ; - - Remove-DesktopIcon "*Element*"; - Remove-DesktopIcon "*TeamSpeak*"; - - Install-WingetPackage Discord.Discord; - Remove-DesktopIcon "*Discord*"; - } - } - - if (Test-Collection "media") { - if ($install) { - Install-ChocoPackage ` - k-litecodecpackmega ` - vlc ` - ; - - Remove-DesktopIcon "VLC*"; - Install-ChocoPackage jellyfin-media-player -ArgumentList "--install-args","/norestart"; - Remove-DesktopIcon "Jellyfin Media Player*"; - Install-WingetPackage Ytmdesktop.Ytmdesktop; - Remove-DesktopIcon "Youtube Music*"; - } - } - - if (Test-Collection "coding") { - if ($install) { - Install-ChocoPackage ` - gh ` - github-desktop ` - ida-free ` - HxD ` - docker-desktop ` - imhex ` - dotpeek ` - ; - - Remove-DesktopIcon "IDA *"; - Remove-DesktopIcon "GitHub*"; - Remove-DesktopIcon "Docker*"; - } - - & "$softwarePath/vscode/Main.ps1" @arguments; - & "$softwarePath/VisualStudio/Manage.ps1" @arguments; - - # Node.js - & "$softwarePath/NVS/Manage.ps1" @arguments; - } - - if (Test-Collection "gaming") { - # Gaming - if ($install) { - Install-ChocoPackage ` - goggalaxy ` - epicgameslauncher ` - rayman-controlpanel ` - ppsspp ` - ; - - Remove-DesktopIcon "*Epic Games*"; - Remove-DesktopIcon "*PPSSPP *-Bit*"; - - Install-ChocoPackage ` - steam ` - ubisoft-connect ` - -ArgumentList "--ignore-checksums" ` - ; - - Remove-DesktopIcon "*Steam*"; - Remove-DesktopIcon "*Ubisoft Connect*"; - - Install-WingetPackage ElectronicArts.EADesktop; - Remove-DesktopIcon "EA.*"; - } - - & "$softwarePath/TrackMania Nations Forever/Manage.ps1" @arguments; - & "$softwarePath/TrackMania United Forever/Manage.ps1" @arguments; - & "$softwarePath/ManiaPlanet/Manage.ps1" @arguments; - & "$softwarePath/osu!/Manage.ps1" @arguments; - & "$softwarePath/osu!lazer/Manage.ps1" @arguments; - & "$softwarePath/RetroArch/Manage.ps1" @arguments; - & "$softwarePath/reWASD/Manage.ps1" @arguments; - } - }; - } - - switch ($_) { - ([SetupStage]::Configure) { - if (Get-Config "valhalla.windows.dualboot.enable") { - if (-not (Test-Qemu)) { - # Fix synchronization between Linux and Windows clocks. - Set-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\TimeZoneInformation" -Name "RealTimeIsUniversal" -Value 1 -Type "DWord"; - } - - # Force time resynchronization - $timeZoneOption = "Start"; - $timeZoneKey = "HKLM:\SYSTEM\CurrentControlSet\Services\tzautoupdate"; - $service = Get-Service W32Time; - $autoUpdate = (Get-Item $timeZoneKey).GetValue($timeZoneOption); - $stopped = ($service.Status -eq "Stopped"); - - $setUpdate = { param([int] $Value) Set-ItemProperty $timeZoneKey -Name $timeZoneOption $Value }; - & $setUpdate 3; - Start-Service $service; - w32tm /resync /force; - & $setUpdate $autoUpdate; - - if ($stopped) { - Stop-Service $service; - } - } - - Set-Stage ([SetupStage]::Install); - } - ([SetupStage]::Install) { - Write-Host "Entering install phase"; - Deploy-SoftwareAction; - Set-Stage ([SetupStage]::CreateUser); - } - ([SetupStage]::CreateUser) { - $users = @(Get-Users); - $i = Get-CurrentUser; - - for (; $i -lt $users.Count; $i++) { - $name = $users[$i]; - $msAccount = Get-UserConfig -UserName $name "microsoftAccount"; - Set-CurrentUser $i; - - if (Test-Admin) { - Disable-BootMessage; - } - - while ((Get-UserStage) -ne ([UserStage]::Completed)) { - switch (Get-UserStage) { - ($null) { - Set-UserStage ([UserStage]::Create); - continue; - } - ([UserStage]::Create) { - if ($env:UserName -ne $name) { - New-ValhallaUser $name; - - if ($msAccount) { - logoff; - } else { - Restart-Intermediate; - exit; - } - - exit; - } else { - if ($msAccount) { - if (-not (Test-Admin)) { - Invoke-OneShot DisableUAC; - Restart-Intermediate -NoRegister; - return; - } - - Clear-SetupRegistration; - Disable-OneShotListener; - } - - Set-UserStage ([UserStage]::Configure); - } - } - (([UserStage]::Configure)) { - $displayName = Get-UserConfig -UserName $name "displayName"; - - $userArguments = @{ - name = $name; - }; - - if ($displayName) { - $userArguments.fullName = $displayName; - } - - $adminGroup = @{ - SID = [SecurityIdentifier]::new([WellKnownSidType]::BuiltinAdministratorsSid, $null); - }; - - Set-LocalUser @userArguments; - Deploy-SoftwareAction -Action ([InstallerAction]::ConfigureUser); - Remove-LocalGroupMember -Member $name @adminGroup -ErrorAction SilentlyContinue; - - foreach ($group in Get-UserConfig -UserName $name "groups") { - Add-LocalGroupMember -Member $name -Name "$group"; - } - - if (-not $msAccount) { - net user $name /logonpasswordchg:yes; - } - - Set-UserStage ([UserStage]::Cleanup); - } - ([UserStage]::Cleanup) { - $user = Get-SetupUser; - Enable-LocalUser $user; - Set-AutologinUser $user; - Unregister-WslDistribution; - Set-UserStage ([UserStage]::Completed); + if ($msAccount) { + logoff; + } else { Restart-Intermediate; } + + exit; + } else { + if ($msAccount) { + if (-not (Test-Admin)) { + Invoke-OneShot DisableUAC; + Restart-Intermediate -NoRegister; + return; + } + + Clear-SetupRegistration; + Disable-OneShotListener; + } + + Set-UserStage ([UserStage]::Configure); } } - } + (([UserStage]::Configure)) { + $displayName = Get-UserConfig -UserName $name "displayName"; - Set-IsFinished $true; + $userArguments = @{ + name = $name; + }; + + if ($displayName) { + $userArguments.fullName = $displayName; + } + + $adminGroup = @{ + SID = [SecurityIdentifier]::new([WellKnownSidType]::BuiltinAdministratorsSid, $null); + }; + + Set-LocalUser @userArguments; + Deploy-SoftwareAction -Action ([InstallerAction]::ConfigureUser); + Remove-LocalGroupMember -Member "$name" @adminGroup -ErrorAction SilentlyContinue; + + foreach ($group in Get-UserConfig -UserName "$name" "groups") { + Add-LocalGroupMember -Member "$name" -Name "$group"; + } + + if (-not $msAccount) { + net user $name /logonpasswordchg:yes; + } + + Set-UserStage ([UserStage]::Cleanup); + } + ([UserStage]::Cleanup) { + $user = Get-SetupUser; + Enable-LocalUser $user; + Set-AutologinUser $user; + Unregister-WslDistribution; + Set-UserStage ([UserStage]::Completed); + Restart-Intermediate; + exit; + } + } } } + + Set-IsFinished $true; } } }