class Context { [string]$EntryPoint; [string]$RootDir; [string]$BackupName; [string]$UserName; [string]$AdminName = "Admin"; [string]$RunOnceName = "PortValhalla"; [string] BackupRoot() { if (-not $this.RootDir) { return Join-Path $PSScriptRoot ".." ".." ".." "backup" $this.BackupName; } else { return $this.RootDir; } } [string] ArchivePath($name) { return Join-Path $this.BackupRoot() "$name.7z"; } [string] FileArchivePath($name) { return $this.ArchivePath($(Join-Path "Files" $name)); } [string] SoftwareArchive([string]$softwareName) { return $this.ArchivePath($softwareName); } [void] Backup([string]$sourcePath, [string]$archivePath, [string[]]$arguments) { if (Test-Path $archivePath) { Remove-Item -Recurse $archivePath; } Start-Process -WorkingDirectory "$sourcePath" ` -FilePath "7z" ` -ArgumentList ( @( "a", "-xr!desktop.ini", "-xr!thumbs.db", "-xr!Thumbs.db", $archivePath) + $arguments) ` -Wait ` -NoNewWindow; } [void] Restore([string]$archivePath, [string]$destinationPath) { if (-not (Test-Path -PathType Container $destinationPath)) { New-Item -ItemType Directory "$destinationPath"; } Start-Process -WorkingDirectory "$destinationPath" ` -FilePath "7z" -ArgumentList "x" ` -Wait ` -NoNewWindow; } [string] GetTempDirectory() { $tempDir = Join-Path $([System.IO.Path]::GetTempPath()) $([System.IO.Path]::GetRandomFileName()); $null = New-Item -ItemType Directory $tempDir; return $tempDir; } [void] ProcessDefaultUserKey([System.Action[Microsoft.Win32.RegistryKey]] $action) { $root = "HKLM:\DefaultUser"; $hivePath = "$env:SystemRoot\Profiles\Default User\NTUSER.dat" $null = & reg load $root $hivePath; $action.Invoke((Get-Item $root)); } [Microsoft.Win32.RegistryKey] GetRunOnceKey() { return $this.GetRunOnceKey($null); } [Microsoft.Win32.RegistryKey] GetRunOnceKey([Microsoft.Win32.RegistryKey] $userKey) { if (-not $userKey) { $userKey = Get-Item "HKCU:\"; } Push-Location $userKey; $result = Get-Item "$userKey\Software\Microsoft\Windows\CurrentVersion\RunOnce"; Pop-Location; return $result; } [void] RegisterReboot() { $this.RegisterReboot($null); } [void] RegisterReboot([Microsoft.Win32.RegistryKey] $userKey) { $null = New-ItemProperty -Path $this.GetRunOnceKey($userKey) -Name $this.RunOnceName -Value "pwsh `"$($this.EntryPoint)`"" -PropertyType ExpandString; } [void] RegisterNewUserReboot() { $this.ProcessDefaultUserKey({ param ($root) $this.RegisterReboot($root); }); } [void] DeregisterNewUserReboot() { $this.ProcessDefaultUserKey({ param ($root) Remove-ItemProperty $this.GetRunOnceKey($root) -Name $this.RunOnceName }); } [void] Reboot() { Write-Host "Restarting Computer..."; $this.RegisterReboot(); Restart-Computer; } }