Add code for cleaning up after installations

This commit is contained in:
Manuel Thalmann 2024-09-03 22:15:15 +02:00
parent 2025fa8afd
commit 6e0de869d1
3 changed files with 66 additions and 16 deletions

View file

@ -5,6 +5,7 @@ using namespace System.Security.Principal;
enum WindowsInstallerStage { enum WindowsInstallerStage {
Initialize Initialize
Run Run
Cleanup
Completed Completed
} }

View file

@ -27,6 +27,33 @@ $null = New-Module {
Set-SetupOption $taskOption ([string]$Task); Set-SetupOption $taskOption ([string]$Task);
}; };
<#
.SYNOPSIS
Gets the PowerShell modules required for operating.
#>
function Get-RequiredModules {
$modules = @(
@("PSScriptAnalyzer")
) + (& {
if (-not $IsWindows) {
@()
} else {
@(
@("KnownFolders"),
@("PSWindowsUpdate"),
@("LocalAccounts", $true),
@("NuGet")
)
}
});
for ($i = 0; $i -lt $modules.Count; $i++) {
if ($modules[$i] -is [string]) {
$modules[$i] = @($modules[$i]);
}
}
}
function Start-Operation { function Start-Operation {
param( param(
[switch] $NonInteractive, [switch] $NonInteractive,
@ -215,22 +242,7 @@ $null = New-Module {
} }
Invoke-Hook "Install-PSModules" -Fallback { Invoke-Hook "Install-PSModules" -Fallback {
$modules = @( foreach ($module in (Get-RequiredModules)) {
@("PSScriptAnalyzer")
) + (& {
if (-not $IsWindows) {
@()
} else {
@(
@("KnownFolders"),
@("PSWindowsUpdate"),
@("LocalAccounts", $true),
@("NuGet")
)
}
});
foreach ($module in $modules) {
$parameters = @{ }; $parameters = @{ };
if ($module -is [string]) { if ($module -is [string]) {
@ -403,6 +415,13 @@ $null = New-Module {
function Clear-OperationResources { function Clear-OperationResources {
if ($IsWindows) { if ($IsWindows) {
Uninstall-WslDistribution; Uninstall-WslDistribution;
$null = Uninstall-Package Selenium.WebDriver -ErrorAction Continue;
Uninstall-ChocoPackage 7zip.portable gsudo selenium-gecko-driver yq;
Uninstall-WingetPackage AutoHotkey.AutoHotkey;
}
foreach ($module in (Get-RequiredModules)) {
Uninstall-Module -Force -Name $module[0];
} }
} }
}; };

View file

@ -20,6 +20,7 @@ $null = New-Module {
. "$PSScriptRoot/../Types/WindowsInstallerAction.ps1"; . "$PSScriptRoot/../Types/WindowsInstallerAction.ps1";
. "$PSScriptRoot/../../Common/Scripts/Config.ps1"; . "$PSScriptRoot/../../Common/Scripts/Config.ps1";
. "$PSScriptRoot/../../Common/Scripts/Operations.ps1"; . "$PSScriptRoot/../../Common/Scripts/Operations.ps1";
. "$PSScriptRoot/../../Common/Scripts/Scripting.ps1";
. "$PSScriptRoot/../../Common/Scripts/Software.ps1"; . "$PSScriptRoot/../../Common/Scripts/Software.ps1";
. "$PSScriptRoot/../../Common/Scripts/SoftwareManagement.ps1"; . "$PSScriptRoot/../../Common/Scripts/SoftwareManagement.ps1";
. "$PSScriptRoot/../../Common/Types/InstallerAction.ps1"; . "$PSScriptRoot/../../Common/Types/InstallerAction.ps1";
@ -129,7 +130,36 @@ $null = New-Module {
} }
} }
Set-Stage ([WindowsInstallerStage]::Cleanup);
break;
}
([WindowsInstallerStage]::Cleanup) {
$taskName = "PortValhalla Cleaner";
$setupUser = Get-SetupUser;
Clear-OperationResources;
Remove-Item -Recurse -Force "C:\ProgramData\PortValhalla";
Get-SetupConfigKey | Remove-Item -Recurse -Force;
Disable-Autologin;
Disable-LocalUser $setupUser;
$script = {
param(
$TaskName,
$UserName
)
$user = Get-LocalUser $UserName;
[string] $sid = $user.SID;
Remove-LocalUser $user;
Get-CimInstance Win32_UserProfile | Where-Object { $_.SID -eq $sid } | Remove-CimInstance;
Unregister-ScheduledTask -Confirm:$false $TaskName;
};
$trigger = New-ScheduledTaskTrigger -AtStartup;
$task = New-ScheduledTaskAction -Execute "pwsh" -Argument "-Command & { $script } $(ConvertTo-Injection $taskName) $(ConvertTo-Injection $setupUser)";
$null = Register-ScheduledTask -Force $taskName -Action $task -Trigger $trigger -RunLevel Highest -User "SYSTEM";
Set-Stage ([WindowsInstallerStage]::Completed); Set-Stage ([WindowsInstallerStage]::Completed);
Restart-Intermediate -NoRegister;
break; break;
} }
} }