**Related issue:** N/A — part of the ongoing Windows Fleet-maintained apps (FMA) parity workstream (letter H). ## What this does Adds **5** Windows Fleet-maintained apps for the letter-H batch, each with a winget-sourced input, generated output manifest, and a first-party catalog icon. - **HashTools** — Inno Setup, machine, x64. File-checksum utility (Binary Fortress). Has an evergreen WebView2 dependency (present on virtually all fleets; core hashing works without it). - **HeidiSQL** — Inno Setup, machine, x64. Custom install passes `/ALLUSERS` for machine scope (the ingester doesn't forward manifest `Custom` switches). - **HWMonitor** — Inno Setup, machine, x86. ARP DisplayName is `CPUID HWMonitor`; installs a kernel driver removed by its uninstaller. - **HP Prime Virtual Calculator** — WiX burn bundle, machine, x64. Uses a name-only exists query (the ARP publisher is MORAVIA Consulting, not the manifest's "HP"). - **Huddle** — InstallShield exe (`/exenoui /quiet`), machine, x86. Uninstall via the MSI UpgradeCode (`uninstall_type: msi`); `ignore_hash` for the non-versioned installer URL. ## Dropped from this batch (recorded in the workstream tracker) - **HandBrake** — the GUI declares an unbundled `Microsoft.DotNet.DesktopRuntime.10` dependency (won't run without it); the CLI is a portable zip with no Add/Remove Programs entry to detect. - **HiPIN** (`KPN.HIPIN`) — unbundled VCRedist + WebView2 dependencies, a non-versioned "latest" URL, and no ARP DisplayName/ProductCode. The `binbat.whipinto` candidate is an unrelated WebRTC tool (mismatch). ## Notes - **Huddle** uses a non-versioned `HuddleSetup.exe` URL — if the vendor ships past 4.8.0.0, osquery version detection may drift (same pattern that failed GoodSync in letter G). Flagging for the validator; will drop if it can't match. - Verification (winget manifest identity, installer type/scope/arch, ProductCode/UpgradeCode, silent switches, dependencies, URL stability) was done per the `new-fma` skill against the winget-pkgs manifests. ## Testing - [ ] FMA CI validator (install → detect → uninstall) on the SYSTEM-context Windows runner — pending. - Generated outputs verified locally: all 5 produce valid manifests; exists/patched queries reviewed; Huddle's MSI UpgradeCode uninstall auto-generated correctly.
68 lines
2.2 KiB
PowerShell
68 lines
2.2 KiB
PowerShell
# Uninstalls HeidiSQL (Inno Setup). Locates the ARP entry by exact
|
|
# DisplayName and runs its (Quiet)UninstallString with the Inno silent flags.
|
|
$softwareName = "HeidiSQL"
|
|
|
|
$uninstallArgs = "/VERYSILENT /SUPPRESSMSGBOXES /NORESTART"
|
|
|
|
$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
|
|
$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
|
|
|
|
$exitCode = 0
|
|
|
|
try {
|
|
|
|
[array]$uninstallKeys = Get-ChildItem `
|
|
-Path @($machineKey, $machineKey32on64) `
|
|
-ErrorAction SilentlyContinue |
|
|
ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }
|
|
|
|
$foundUninstaller = $false
|
|
foreach ($key in $uninstallKeys) {
|
|
if ($key.DisplayName -like "$softwareName*") {
|
|
$foundUninstaller = $true
|
|
$uninstallCommand = if ($key.QuietUninstallString) {
|
|
$key.QuietUninstallString
|
|
} else {
|
|
$key.UninstallString
|
|
}
|
|
|
|
# Split the command from its args (command is usually quoted).
|
|
$splitArgs = $uninstallCommand.Split('"')
|
|
if ($splitArgs.Length -gt 1) {
|
|
if ($splitArgs.Length -eq 3) {
|
|
$uninstallArgs = "$( $splitArgs[2] ) $uninstallArgs".Trim()
|
|
} elseif ($splitArgs.Length -gt 3) {
|
|
Throw "Uninstall command contains multiple quoted strings. Update the script.`nUninstall command: $uninstallCommand"
|
|
}
|
|
$uninstallCommand = $splitArgs[1]
|
|
}
|
|
Write-Host "Uninstall command: $uninstallCommand"
|
|
Write-Host "Uninstall args: $uninstallArgs"
|
|
|
|
$processOptions = @{
|
|
FilePath = $uninstallCommand
|
|
PassThru = $true
|
|
Wait = $true
|
|
}
|
|
if ($uninstallArgs -ne '') { $processOptions.ArgumentList = "$uninstallArgs" }
|
|
|
|
$process = Start-Process @processOptions
|
|
$exitCode = $process.ExitCode
|
|
Write-Host "Uninstall exit code: $exitCode"
|
|
break
|
|
}
|
|
}
|
|
|
|
if (-not $foundUninstaller) {
|
|
Write-Host "Uninstaller for '$softwareName' not found."
|
|
$exitCode = 1
|
|
}
|
|
|
|
} catch {
|
|
Write-Host "Error: $_"
|
|
$exitCode = 1
|
|
}
|
|
|
|
if ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }
|
|
Exit $exitCode
|