**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.
49 lines
1.8 KiB
PowerShell
49 lines
1.8 KiB
PowerShell
# Uninstalls HP Prime Virtual Calculator (WiX Burn bundle). Runs the cached
|
|
# bundle's QuietUninstallString (/uninstall /quiet).
|
|
|
|
$softwareName = "HP Prime Virtual Calculator"
|
|
|
|
$machineKey = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*'
|
|
$machineKey32on64 = 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
|
|
|
|
$exitCode = $null
|
|
|
|
try {
|
|
|
|
[array]$uninstallKeys = Get-ChildItem `
|
|
-Path @($machineKey, $machineKey32on64) `
|
|
-ErrorAction SilentlyContinue |
|
|
ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }
|
|
|
|
$selected = $uninstallKeys | Where-Object { $_.DisplayName -eq $softwareName } | Select-Object -First 1
|
|
if (-not $selected -or -not $selected.UninstallString) {
|
|
Write-Host "Uninstall entry not found for '$softwareName'."
|
|
Exit 1
|
|
}
|
|
|
|
$raw = if ($selected.QuietUninstallString) { $selected.QuietUninstallString } else { $selected.UninstallString }
|
|
if ($raw -match '^\s*"([^"]+)"\s*(.*)$') {
|
|
$exe = $matches[1]; $exeArgs = $matches[2].Trim()
|
|
} elseif ($raw -match '(?i)^\s*(.+?\.exe)\s*(.*)$') {
|
|
$exe = $matches[1]; $exeArgs = $matches[2].Trim()
|
|
} else {
|
|
$exe = $raw; $exeArgs = ""
|
|
}
|
|
if ($exeArgs -notmatch '(?i)(^|\s)/uninstall(\s|$)') { $exeArgs = "/uninstall $exeArgs".Trim() }
|
|
if ($exeArgs -notmatch '(?i)(^|\s)/quiet(\s|$)') { $exeArgs = "$exeArgs /quiet".Trim() }
|
|
if ($exeArgs -notmatch '(?i)/norestart') { $exeArgs = "$exeArgs /norestart".Trim() }
|
|
|
|
Write-Host "Uninstall command: $exe"
|
|
Write-Host "Uninstall args: $exeArgs"
|
|
$process = Start-Process -FilePath $exe -ArgumentList $exeArgs -PassThru -Wait
|
|
$exitCode = $process.ExitCode
|
|
Write-Host "Uninstall exit code: $exitCode"
|
|
|
|
} catch {
|
|
Write-Host "Error: $_"
|
|
Exit 1
|
|
}
|
|
|
|
if ($exitCode -eq 0 -or $exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }
|
|
Exit $exitCode
|