using namespace Microsoft.Win32; $null = New-Module { . "$PSScriptRoot/../../Common/Scripts/Config.ps1"; . "$PSScriptRoot/../../Common/Scripts/Scripting.ps1"; [RegistryKey] $key = $null; $runOncePath = "HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce"; $logonPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" $runOnceName = "PortValhalla"; $autologinOption = "AutoAdminLogon"; $domainOption = "DefaultDomainName"; $userOption = "DefaultUserName"; $passwordOption = "DefaultPassword"; <# .SYNOPSIS Gets the reghistry key containing the `RunOnce` commands. #> function Get-RunOnceKey { Get-Item $runOncePath; } <# .SYNOPSIS Registers a task to run the setup once after the next reboot. .PARAMETER UserKey The regtistry key of the user to register the task for. #> function Register-Setup { param( [RegistryKey] $UserKey ) $key = Get-RunOnceKey $UserKey; Set-ItemProperty -Path $key.PSPath -Name $runOnceName -Type "ExpandString" -Value ( "pwsh -Command " + (& { if ($env:PWSH_PATH) { "`$env:PWSH_PATH = $(ConvertTo-Injection $env:PWSH_PATH);" } else { "" } }) + "`$env:INSTALLER_SCRIPT = $(ConvertTo-Injection $env:INSTALLER_SCRIPT);" + "`$env:CONFIG_MODULE = $(ConvertTo-Injection $env:CONFIG_MODULE);" + "& `$env:INSTALLER_SCRIPT;" ); $key.Handle.Close(); } <# .SYNOPSIS Sets the user to login automatically on boot. .PARAMETER Name The name of the user to login automatically. #> function Set-AutologinUser { param( [string] $Name ) Set-ItemProperty $autologinOption -Name $autologinOption "1"; if (-not $Name) { $Name = Get-SetupUser; } $options = @{ $domainOption = ""; $userOption = $Name; $passwordOption = ""; }; foreach ($key in $options.Keys) { Set-ItemProperty -Name $key $displayName = Get-UserConfig -UserName $name "displayName"; $userArguments = @{ name = $name; }; if ($displayName) { $userArguments.fullName = $displayName; } -Value $options[$key]; } } <# .SYNOPSIS Disables the automatic login. #> function Disable-Autologin { Set-ItemProperty $logonPath -Name $autologinOption "0"; foreach ($key in @($domainOption, $userOption, $passwordOption)) { Remove-ItemProperty $logonPath -Name $key -ErrorAction SilentlyContinue; } } <# .SYNOPSIS Reboots the machine intermediately and restarts the setup after the next login. #> function Restart-Intermediate { Register-Setup; Restart-Computer -Force; } }