diff --git a/ee/maintained-apps/outputs/brave-browser/darwin.json b/ee/maintained-apps/outputs/brave-browser/darwin.json index fd66196359..7d377cbae6 100644 --- a/ee/maintained-apps/outputs/brave-browser/darwin.json +++ b/ee/maintained-apps/outputs/brave-browser/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "148.1.90.124", + "version": "148.1.90.128", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.brave.Browser';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.brave.Browser' AND version_compare(bundle_short_version, '148.1.90.124') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.brave.Browser' AND version_compare(bundle_short_version, '148.1.90.128') < 0);" }, - "installer_url": "https://updates-cdn.bravesoftware.com/sparkle/Brave-Browser/stable-arm64/190.124/Brave-Browser-arm64.dmg", + "installer_url": "https://updates-cdn.bravesoftware.com/sparkle/Brave-Browser/stable-arm64/190.128/Brave-Browser-arm64.dmg", "install_script_ref": "51f78f89", "uninstall_script_ref": "f700850a", - "sha256": "337fea224145b4ee610343af3a6b29a302b8a1cdcec5ae85782eebfdb1066d36", + "sha256": "08321ab43021a670536ec1ea74ce6bc0b7bfa1a85db38172ae62342b07bc7b37", "default_categories": [ "Browsers" ] diff --git a/ee/maintained-apps/outputs/camtasia/darwin.json b/ee/maintained-apps/outputs/camtasia/darwin.json index a213f059cf..bc4ff47156 100644 --- a/ee/maintained-apps/outputs/camtasia/darwin.json +++ b/ee/maintained-apps/outputs/camtasia/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "2026.1.0", + "version": "2026.1.2", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.techsmith.camtasia';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.techsmith.camtasia' AND version_compare(bundle_short_version, '2026.1.0') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.techsmith.camtasia' AND version_compare(bundle_short_version, '2026.1.2') < 0);" }, - "installer_url": "https://download.techsmith.com/camtasiamac/releases/2026.1.0/Camtasia.dmg", + "installer_url": "https://download.techsmith.com/camtasiamac/releases/2026.1.2/Camtasia.dmg", "install_script_ref": "2fda011f", "uninstall_script_ref": "252f6f0e", - "sha256": "edf947b8689dc9f6209059f05c29ea39f172b0f028b6f5fd9717754d9ceb64d5", + "sha256": "d934f04c905dda0f3d7bc11521156c27d295d46d89176111a5b4e335e0c90f0c", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/dialpad/darwin.json b/ee/maintained-apps/outputs/dialpad/darwin.json index d024cb017a..49a8b28b59 100644 --- a/ee/maintained-apps/outputs/dialpad/darwin.json +++ b/ee/maintained-apps/outputs/dialpad/darwin.json @@ -1,10 +1,10 @@ { "versions": [ { - "version": "2605.0.4", + "version": "2605.1.0", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.dialpad';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.dialpad' AND version_compare(bundle_short_version, '2605.0.4') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.dialpad' AND version_compare(bundle_short_version, '2605.1.0') < 0);" }, "installer_url": "https://download.dialpad.com/osx/arm64/dialpad.pkg", "install_script_ref": "49548b01", diff --git a/ee/maintained-apps/outputs/notepad++/windows.json b/ee/maintained-apps/outputs/notepad++/windows.json index 71f1c9039e..b6d7d9e5af 100644 --- a/ee/maintained-apps/outputs/notepad++/windows.json +++ b/ee/maintained-apps/outputs/notepad++/windows.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "8.9.5", + "version": "8.9.6", "queries": { "exists": "SELECT 1 FROM programs WHERE name = 'Notepad++' AND publisher = 'Notepad++ Team';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Notepad++' AND publisher = 'Notepad++ Team' AND version_compare(version, '8.9.5') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Notepad++' AND publisher = 'Notepad++ Team' AND version_compare(version, '8.9.6') < 0);" }, - "installer_url": "https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v8.9.5/npp.8.9.5.Installer.x64.exe", + "installer_url": "https://github.com/notepad-plus-plus/notepad-plus-plus/releases/download/v8.9.6/npp.8.9.6.Installer.x64.exe", "install_script_ref": "46c6fee6", "uninstall_script_ref": "642b4036", - "sha256": "62264a5a6774c8ad4110e78c81b42b98999b1acbd2b49eeb590473d15b0e3855", + "sha256": "2ff794611c96ebbeb116ecd1ca4b97183435287bf7c24eef96c4fe2b11e5b8a0", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/parallels/darwin.json b/ee/maintained-apps/outputs/parallels/darwin.json index b874464cf9..23915a5ddf 100644 --- a/ee/maintained-apps/outputs/parallels/darwin.json +++ b/ee/maintained-apps/outputs/parallels/darwin.json @@ -1,15 +1,15 @@ { "versions": [ { - "version": "26.3.2", + "version": "26.3.3", "queries": { "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.parallels.desktop.console';", - "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.parallels.desktop.console' AND version_compare(bundle_short_version, '26.3.2') < 0);" + "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.parallels.desktop.console' AND version_compare(bundle_short_version, '26.3.3') < 0);" }, - "installer_url": "https://download.parallels.com/desktop/v26/26.3.2-57398/ParallelsDesktop-26.3.2-57398.dmg", + "installer_url": "https://download.parallels.com/desktop/v26/26.3.3-57507/ParallelsDesktop-26.3.3-57507.dmg", "install_script_ref": "1142d1f5", "uninstall_script_ref": "9c10ac4b", - "sha256": "2636d7404b4f29f0ac80ea6e7df9868e66b2a554ff24adeac7dd87594149ed52", + "sha256": "417af3750e9e6378a4830303d75ff312461abbf5f49a69b6ba4e8ef76afcc35a", "default_categories": [ "Productivity" ] diff --git a/ee/maintained-apps/outputs/power-bi/windows.json b/ee/maintained-apps/outputs/power-bi/windows.json index b966310db7..75e3c671c5 100644 --- a/ee/maintained-apps/outputs/power-bi/windows.json +++ b/ee/maintained-apps/outputs/power-bi/windows.json @@ -7,8 +7,8 @@ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Microsoft Power BI Desktop (x64)' AND publisher = 'Microsoft Corporation' AND version_compare(version, '2.154.956.0') < 0);" }, "installer_url": "https://download.microsoft.com/download/8/8/0/880bca75-79dd-466a-927d-1abf1f5454b0/PBIDesktopSetup_x64.exe", - "install_script_ref": "4be62464", - "uninstall_script_ref": "201475bb", + "install_script_ref": "cc478c11", + "uninstall_script_ref": "abc3b459", "sha256": "f8a6665898af39d9ae4c28efa084821eb149e826c9f49af5415526e4db767364", "default_categories": [ "Productivity" @@ -16,7 +16,7 @@ } ], "refs": { - "201475bb": "# Power BI Desktop's EXE installer is a WiX \"Burn\" bundle. It registers TWO\n# uninstall entries:\n# * \"Microsoft PowerBI Desktop (x64)\" -> the bundle bootstrapper\n# (...\\Package Cache\\{afa18d15-...}\\PBIDesktopSetup_x64.exe)\n# * \"Microsoft Power BI Desktop (x64)\" -> the MSI the bundle installed\n# (MsiExec.exe /X{c7d2053f-...})\n#\n# Removing the MSI directly orphans the bundle: its uninstall then no-ops\n# (returns 0) and leaves the \"Microsoft PowerBI Desktop (x64)\" registration\n# behind, which is what Fleet's osquery-based validator keeps detecting.\n#\n# Correct approach: uninstall via the BUNDLE first. It removes both the MSI and\n# its own registration. Burn relaunches a cached copy of itself and spawns\n# msiexec asynchronously, so wait for those to finish.\n\n$ExpectedExitCodes = @(0, 1605, 1641, 3010)\n$exitCode = 0\n\n# Power BI's default install folder; used as a safety check before deleting any\n# stale registration that survives a successful uninstall.\n$installDirs = @(\n (Join-Path $env:ProgramFiles 'Microsoft Power BI Desktop'),\n (Join-Path ${env:ProgramFiles(x86)} 'Microsoft Power BI Desktop')\n)\n\nfunction Wait-ForProcessExit {\n param([string[]]$Names, [int]$TimeoutSeconds = 240)\n $elapsed = 0\n while ($elapsed -lt $TimeoutSeconds) {\n $running = $Names | Where-Object { Get-Process -Name $_ -ErrorAction SilentlyContinue }\n if (-not $running) { break }\n Start-Sleep -Seconds 3\n $elapsed += 3\n }\n}\n\nfunction Get-PowerBIEntries {\n param([string[]]$Roots)\n $list = @()\n foreach ($root in $Roots) {\n foreach ($sub in (Get-ChildItem -Path $root -ErrorAction SilentlyContinue)) {\n $key = Get-ItemProperty $sub.PSPath -ErrorAction SilentlyContinue\n if (-not $key.DisplayName) { continue }\n if (-not (($key.DisplayName -replace '\\s', '').ToLower().Contains(\"powerbidesktop\"))) { continue }\n $list += [PSCustomObject]@{\n DisplayName = $key.DisplayName\n KeyPath = $sub.PSPath\n KeyName = $sub.PSChildName\n Command = if ($key.QuietUninstallString) { $key.QuietUninstallString } else { $key.UninstallString }\n }\n }\n }\n return $list\n}\n\nfunction Get-ExePath {\n param([string]$Command)\n if ($Command -match '\"([^\"]+\\.exe)\"') { return $Matches[1] }\n if ($Command -match '(?i)([A-Z]:\\\\[^\"]+?\\.exe)') { return $Matches[1] }\n return $null\n}\n\ntry {\n\n # Uninstall roots across all hives (matches osquery's \"programs\" table).\n $roots = [System.Collections.Generic.List[string]]::new()\n $roots.Add('HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall')\n $roots.Add('HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall')\n foreach ($hive in (Get-ChildItem 'Registry::HKEY_USERS' -ErrorAction SilentlyContinue)) {\n if ($hive.Name -match '_Classes$') { continue }\n $roots.Add(\"Registry::$($hive.Name)\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\")\n $roots.Add(\"Registry::$($hive.Name)\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\")\n }\n\n $entries = Get-PowerBIEntries -Roots $roots\n if ($entries.Count -eq 0) {\n Write-Host \"No Power BI Desktop entries found (already removed).\"\n Exit 0\n }\n\n foreach ($proc in @(\"PBIDesktop\", \"msmdsrv\", \"Microsoft.Mashup.Container\")) {\n Stop-Process -Name $proc -Force -ErrorAction SilentlyContinue\n }\n\n # --- Phase 1: uninstall via the Burn bundle bootstrapper(s) FIRST. ---\n foreach ($e in ($entries | Where-Object { $_.Command -match \"(?i)PBIDesktopSetup.*\\.exe\" })) {\n $exe = Get-ExePath $e.Command\n if (-not $exe) { Write-Host \"Could not parse bundle exe from: $($e.Command)\"; continue }\n if (-not (Test-Path -LiteralPath $exe)) { Write-Host \"Bundle exe missing: $exe\"; continue }\n\n Write-Host \"Uninstalling bundle: '$($e.DisplayName)'\"\n Write-Host \" Command: $exe\"\n Write-Host \" Args: /uninstall /quiet /norestart\"\n $p = Start-Process -FilePath $exe -ArgumentList \"/uninstall /quiet /norestart\" -PassThru -Wait\n Write-Host \" Exit code: $($p.ExitCode)\"\n if (($ExpectedExitCodes -notcontains $p.ExitCode) -and ($exitCode -eq 0)) { $exitCode = $p.ExitCode }\n\n Wait-ForProcessExit -Names @(\"PBIDesktopSetup_x64\", \"PBIDesktopSetup\", \"msiexec\") -TimeoutSeconds 240\n }\n\n # --- Phase 2: remove any MSI entries the bundle didn't clean up. ---\n foreach ($e in (Get-PowerBIEntries -Roots $roots)) {\n $msiCode = $null\n if ($e.Command -match \"(?i)MsiExec\\.exe\\s+/[IX]\\s*(\\{[A-F0-9-]+\\})\") { $msiCode = $Matches[1] }\n elseif ($e.KeyName -match \"(?i)^\\{[A-F0-9-]+\\}$\") { $msiCode = $e.KeyName }\n if (-not $msiCode) { continue }\n\n Write-Host \"Removing leftover MSI: '$($e.DisplayName)' ($msiCode)\"\n $p = Start-Process -FilePath \"MsiExec.exe\" -ArgumentList \"/X $msiCode /qn /norestart\" -PassThru -Wait\n Write-Host \" Exit code: $($p.ExitCode)\"\n Wait-ForProcessExit -Names @(\"msiexec\") -TimeoutSeconds 180\n if (($ExpectedExitCodes -notcontains $p.ExitCode) -and ($exitCode -eq 0)) { $exitCode = $p.ExitCode }\n }\n\n # --- Phase 3: safety net. If the product files are gone but a stale ARP\n # registration lingers, remove the orphaned key so detection clears. Gated\n # on the install folder being absent so we never hide a real install. ---\n $productGone = -not ($installDirs | Where-Object { $_ -and (Test-Path -LiteralPath $_) })\n foreach ($e in (Get-PowerBIEntries -Roots $roots)) {\n $isMachineKey = $e.KeyPath -like 'Microsoft.PowerShell.Core\\Registry::HKEY_LOCAL_MACHINE\\*'\n if ($productGone -and $isMachineKey) {\n Write-Host \"Removing orphaned registration: '$($e.DisplayName)' ($($e.KeyPath))\"\n Remove-Item -Path $e.KeyPath -Recurse -Force -ErrorAction SilentlyContinue\n } else {\n Write-Host \"WARNING: entry still present and product files remain: '$($e.DisplayName)'\"\n if ($exitCode -eq 0) { $exitCode = 1 }\n }\n }\n\n} catch {\n Write-Host \"Error: $_\"\n $exitCode = 1\n}\n\nif ($ExpectedExitCodes -contains $exitCode) { Exit 0 } else { Exit $exitCode }\n", - "4be62464": "$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n\n# Add argument to install silently\n$processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/quiet\", \"/norestart\", \"ACCEPT_EULA=1\"\n PassThru = $true\n Wait = $true\n}\n\n# Start process and track exit code\n$process = Start-Process @processOptions\n$exitCode = $process.ExitCode\n\n# Prints the exit code\nWrite-Host \"Install exit code: $exitCode\"\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n" + "abc3b459": "# Power BI Desktop's EXE installer is a WiX \"Burn\" bundle. It registers TWO\n# uninstall entries:\n# * \"Microsoft PowerBI Desktop (x64)\" -> the bundle bootstrapper\n# (...\\Package Cache\\{afa18d15-...}\\PBIDesktopSetup_x64.exe)\n# * \"Microsoft Power BI Desktop (x64)\" -> the MSI the bundle installed\n# (MsiExec.exe /X{c7d2053f-...})\n#\n# Removing the MSI directly orphans the bundle: its uninstall then no-ops\n# (returns 0) and leaves the \"Microsoft PowerBI Desktop (x64)\" registration\n# behind, which is what Fleet's osquery-based validator keeps detecting.\n#\n# Correct approach: uninstall via the BUNDLE first. It removes both the MSI and\n# its own registration. Burn relaunches a cached copy of itself and spawns\n# msiexec asynchronously, so wait for those to finish.\n\n$ExpectedExitCodes = @(0, 1605, 1641, 3010)\n$exitCode = 0\n\n# Power BI's default install folder; used as a safety check before deleting any\n# stale registration that survives a successful uninstall.\n$installDirs = @(\n (Join-Path $env:ProgramFiles 'Microsoft Power BI Desktop'),\n (Join-Path ${env:ProgramFiles(x86)} 'Microsoft Power BI Desktop')\n)\n\nfunction Wait-ForProcessExit {\n param([string[]]$Names, [int]$TimeoutSeconds = 240)\n $elapsed = 0\n while ($elapsed -lt $TimeoutSeconds) {\n $running = $Names | Where-Object { Get-Process -Name $_ -ErrorAction SilentlyContinue }\n if (-not $running) { break }\n Start-Sleep -Seconds 3\n $elapsed += 3\n }\n}\n\nfunction Get-PowerBIEntries {\n param([string[]]$Roots)\n $list = @()\n foreach ($root in $Roots) {\n foreach ($sub in (Get-ChildItem -Path $root -ErrorAction SilentlyContinue)) {\n $key = Get-ItemProperty $sub.PSPath -ErrorAction SilentlyContinue\n if (-not $key.DisplayName) { continue }\n if (-not (($key.DisplayName -replace '\\s', '').ToLower().Contains(\"powerbidesktop\"))) { continue }\n $list += [PSCustomObject]@{\n DisplayName = $key.DisplayName\n KeyPath = $sub.PSPath\n KeyName = $sub.PSChildName\n Command = if ($key.QuietUninstallString) { $key.QuietUninstallString } else { $key.UninstallString }\n }\n }\n }\n return $list\n}\n\nfunction Get-ExePath {\n param([string]$Command)\n if ($Command -match '\"([^\"]+\\.exe)\"') { return $Matches[1] }\n if ($Command -match '(?i)([A-Z]:\\\\[^\"]+?\\.exe)') { return $Matches[1] }\n return $null\n}\n\ntry {\n\n # Uninstall roots across all hives (matches osquery's \"programs\" table).\n $roots = [System.Collections.Generic.List[string]]::new()\n $roots.Add('HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall')\n $roots.Add('HKLM:\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall')\n foreach ($hive in (Get-ChildItem 'Registry::HKEY_USERS' -ErrorAction SilentlyContinue)) {\n if ($hive.Name -match '_Classes$') { continue }\n $roots.Add(\"Registry::$($hive.Name)\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\")\n $roots.Add(\"Registry::$($hive.Name)\\SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\")\n }\n\n $entries = Get-PowerBIEntries -Roots $roots\n if ($entries.Count -eq 0) {\n Write-Host \"No Power BI Desktop entries found (already removed).\"\n Exit 0\n }\n\n foreach ($proc in @(\"PBIDesktop\", \"msmdsrv\", \"Microsoft.Mashup.Container\")) {\n Stop-Process -Name $proc -Force -ErrorAction SilentlyContinue\n }\n\n # --- Phase 1: uninstall via the Burn bundle bootstrapper(s) FIRST. ---\n foreach ($e in ($entries | Where-Object { $_.Command -match \"(?i)PBIDesktopSetup.*\\.exe\" })) {\n $exe = Get-ExePath $e.Command\n if (-not $exe) { Write-Host \"Could not parse bundle exe from: $($e.Command)\"; continue }\n if (-not (Test-Path -LiteralPath $exe)) { Write-Host \"Bundle exe missing: $exe\"; continue }\n\n Write-Host \"Uninstalling bundle: '$($e.DisplayName)'\"\n Write-Host \" Command: $exe\"\n Write-Host \" Args: /uninstall /quiet /norestart\"\n $p = Start-Process -FilePath $exe -ArgumentList \"/uninstall /quiet /norestart\" -PassThru -Wait\n Write-Host \" Exit code: $($p.ExitCode)\"\n if (($ExpectedExitCodes -notcontains $p.ExitCode) -and ($exitCode -eq 0)) { $exitCode = $p.ExitCode }\n\n Wait-ForProcessExit -Names @(\"PBIDesktopSetup_x64\", \"PBIDesktopSetup\", \"msiexec\") -TimeoutSeconds 240\n }\n\n # --- Phase 2: remove any MSI entries the bundle didn't clean up. ---\n foreach ($e in (Get-PowerBIEntries -Roots $roots)) {\n $msiCode = $null\n if ($e.Command -match \"(?i)MsiExec\\.exe\\s+/[IX]\\s*(\\{[A-F0-9-]+\\})\") { $msiCode = $Matches[1] }\n elseif ($e.KeyName -match \"(?i)^\\{[A-F0-9-]+\\}$\") { $msiCode = $e.KeyName }\n if (-not $msiCode) { continue }\n\n Write-Host \"Removing leftover MSI: '$($e.DisplayName)' ($msiCode)\"\n $p = Start-Process -FilePath \"MsiExec.exe\" -ArgumentList \"/X $msiCode /qn /norestart\" -PassThru -Wait\n Write-Host \" Exit code: $($p.ExitCode)\"\n Wait-ForProcessExit -Names @(\"msiexec\") -TimeoutSeconds 180\n if (($ExpectedExitCodes -notcontains $p.ExitCode) -and ($exitCode -eq 0)) { $exitCode = $p.ExitCode }\n }\n\n # --- Phase 3: safety net. If the product files are gone but a stale ARP\n # registration lingers, remove the orphaned key so detection clears. Gated\n # on the install folder being absent so we never hide a real install. ---\n $productGone = -not ($installDirs | Where-Object { $_ -and (Test-Path -LiteralPath $_) })\n foreach ($e in (Get-PowerBIEntries -Roots $roots)) {\n $isMachineKey = $e.KeyPath -like 'Microsoft.PowerShell.Core\\Registry::HKEY_LOCAL_MACHINE\\*'\n if ($productGone -and $isMachineKey) {\n Write-Host \"Removing orphaned registration: '$($e.DisplayName)' ($($e.KeyPath))\"\n Remove-Item -Path $e.KeyPath -Recurse -Force -ErrorAction SilentlyContinue\n } else {\n Write-Host \"WARNING: entry still present and product files remain: '$($e.DisplayName)'\"\n if ($exitCode -eq 0) { $exitCode = 1 }\n }\n }\n\n} catch {\n Write-Host \"Error: $_\"\n $exitCode = 1\n}\n\nif ($ExpectedExitCodes -contains $exitCode) { Exit 0 } else { Exit $exitCode }\n", + "cc478c11": "$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n\n# Add argument to install silently\n$processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/quiet\", \"/norestart\", \"ACCEPT_EULA=1\"\n PassThru = $true\n Wait = $true\n}\n\n# Start process and track exit code\n$process = Start-Process @processOptions\n$exitCode = $process.ExitCode\n\n# Prints the exit code\nWrite-Host \"Install exit code: $exitCode\"\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n" } }