Add uninstallation process for ultimate

This commit is contained in:
Sander Declerck 2026-01-27 11:29:19 +01:00
parent dcebe734df
commit 53b7d9295c
No known key found for this signature in database
4 changed files with 167 additions and 12 deletions

View file

@ -9,6 +9,34 @@ import { downloadAgentToFile, getAgentVersion } from "./downloadAgent.js";
const WINDOWS_SERVICE_NAME = "SafeChainUltimate";
const WINDOWS_APP_NAME = "SafeChain Ultimate";
export async function uninstallOnWindows() {
if (!(await isRunningAsAdmin())) {
ui.writeError("Administrator privileges required.");
ui.writeInformation(
"Please run this command in an elevated terminal (Run as Administrator).",
);
return;
}
ui.emptyLine();
const productCode = getInstalledProductCode();
if (!productCode) {
ui.writeInformation("SafeChain Ultimate is not installed.");
return;
}
ui.writeInformation("⏹️ Stopping running service...");
await stopServiceIfRunning();
ui.writeInformation("🗑️ Uninstalling SafeChain Ultimate...");
await uninstallByProductCode(productCode);
ui.emptyLine();
ui.writeInformation("✅ SafeChain Ultimate has been uninstalled.");
ui.emptyLine();
}
export async function installOnWindows() {
if (!(await isRunningAsAdmin())) {
ui.writeError("Administrator privileges required.");
@ -64,7 +92,11 @@ async function isRunningAsAdmin() {
return result.status === 0 && result.stdout.trim() === "True";
}
async function uninstallIfInstalled() {
/**
* Returns the MSI product code for SafeChain Ultimate, or null if not installed.
* @returns {string | null}
*/
function getInstalledProductCode() {
// Query Win32_Product via WMI to find the installed SafeChain Agent.
// If found, outputs the product GUID (e.g., "{12345678-1234-...}") needed for msiexec uninstall.
ui.writeVerbose(`Finding product code with PowerShell`);
@ -76,15 +108,15 @@ async function uninstallIfInstalled() {
{ encoding: "utf8" },
).trim();
} catch {
ui.writeVerbose("No existing installation found (fresh install).");
return;
}
if (!productCode) {
ui.writeVerbose("No existing installation found (fresh install).");
return;
return null;
}
return productCode || null;
}
ui.writeInformation("🗑️ Removing previous installation...");
/**
* @param {string} productCode
*/
async function uninstallByProductCode(productCode) {
ui.writeVerbose(`Found product code: ${productCode}`);
// Use msiexec to run the msi installer quitely (https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/msiexec)
@ -103,6 +135,17 @@ async function uninstallIfInstalled() {
}
}
async function uninstallIfInstalled() {
const productCode = getInstalledProductCode();
if (!productCode) {
ui.writeVerbose("No existing installation found (fresh install).");
return;
}
ui.writeInformation("🗑️ Removing previous installation...");
await uninstallByProductCode(productCode);
}
/**
* @param {string} msiPath
*/