win: fix latest Edge removal on Windows 10 #309

This commit introduces a placeholder ifle creation step necessary for
the uninstallation process of Microsoft Edge on Windows 10, as discussed
in #309. The file simulates the presence of Microsoft Edge (Legacy),
which newer uninstallers check for before proceeding with the
uninstallation.

This change resolves the observed issue where the uninstaller fails to
recognize the absence of Legacy Edge, hindering the uninstallation
process.

Changes:

- Add placeholder file creation/removal for legacy Edge.
- Update and improve the documentation.
This commit is contained in:
undergroundwires
2024-06-23 12:51:15 +02:00
parent 2f828735a8
commit e7031a3ae4

View File

@@ -19284,15 +19284,23 @@ actions:
- -
name: Remove Edge through official installer name: Remove Edge through official installer
docs: |- docs: |-
This script uninstalls the Microsoft Edge using the official installer. This script uninstalls Microsoft Edge using the official installer.
This script reliably uninstalls Microsoft Edge, even when direct removal is restricted by system settings.
1. **Enable Uninstallation**: The script modifies a specific registry key to allow the uninstallation of Microsoft Edge. This step is crucial 1. **Enable Uninstallation**:
because, starting from version 116 of Edge, you cannot uninstall it unless this registry key is set. The script modifies a registry key to permit the uninstallation of Microsoft Edge.
2. **Run Uninstaller**: The script then finds the Microsoft Edge installer (`setup.exe`) for every Microsoft Edge installation (it is possible This step is required because from version 116 onwards, Edge cannot be uninstalled without setting this registry key [1].
to have multiple versions) and executes it to perform a system-level uninstall. 2. **Mark Microsoft Edge (Legacy) as Installed**:
It creates a placeholder file to simulate the presence of the Legacy version of Microsoft Edge (Legacy).
This is necessary as the newer versions of the Edge installer check for Legacy Edge before allowing uninstallation [2].
3. **Run Uninstaller:**
The script finds and runs the Microsoft Edge installer (`setup.exe`) for each version of the browser installed on the system.
This guarantees the complete removal of all Microsoft Edge versions from the system [1].
There's no official documentation for the Edge installer or registry keys codes, which this script relies on. However, these have been verified **Note:** This script uses methods not officially documented but confirmed effective by community testing and support.
through testing and community support to work as expected.
[1]: https://archive.ph/2024.06.21-133029/https://github.com/undergroundwires/privacy.sexy/issues/236 "[BUG]: Edge Browser uninstall process no longer works · Issue #236 · undergroundwires/privacy.sexy | github.com"
[2]: https://archive.ph/2024.06.21-133037/https://github.com/undergroundwires/privacy.sexy/issues/309 "[BUG]: Microsoft Edge still alive after removal · Issue #309 · undergroundwires/privacy.sexy"
call: call:
- -
function: SetRegistryValue function: SetRegistryValue
@@ -19302,6 +19310,10 @@ actions:
dataType: REG_DWORD dataType: REG_DWORD
data: "1" data: "1"
deleteOnRevert: 'true' # Missing key since Windows 10 21H2, Windows 11 21H2 deleteOnRevert: 'true' # Missing key since Windows 10 21H2, Windows 11 21H2
-
function: CreatePlaceholderFile
parameters:
placeholderFilePath: '%SYSTEMROOT%\SystemApps\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\MicrosoftEdge.exe'
- -
function: RunPowerShell function: RunPowerShell
parameters: parameters:
@@ -22169,7 +22181,8 @@ functions:
function: RunPowerShell function: RunPowerShell
parameters: parameters:
# Marked: refactor-with-variables # Marked: refactor-with-variables
# Implementation of those should share similar code: `DisableService`, `StopService`, `StartService`, `DisableServiceInRegistry` # - Implementation of those should share similar code: `DisableService`, `StopService`, `StartService`, `DisableServiceInRegistry`
# - Creating the marker file is same as in script `CreatePlaceholderFile`
code: |- code: |-
$serviceName = '{{ $serviceName }}' $serviceName = '{{ $serviceName }}'
Write-Host "Stopping service: `"$serviceName`"." Write-Host "Stopping service: `"$serviceName`"."
@@ -22233,7 +22246,8 @@ functions:
function: RunPowerShell function: RunPowerShell
parameters: parameters:
# Marked: refactor-with-variables # Marked: refactor-with-variables
# Implementation of those should share similar code: `DisableService`, `StopService`, `StartService`, `DisableServiceInRegistry` # - Implementation of those should share similar code: `DisableService`, `StopService`, `StartService`, `DisableServiceInRegistry`
# - Removing the marker file is same as in script `CreatePlaceholderFile`
code: |- code: |-
$serviceName = '{{ $serviceName }}' $serviceName = '{{ $serviceName }}'
{{ with $serviceRestartStateFile }} {{ with $serviceRestartStateFile }}
@@ -24283,3 +24297,77 @@ functions:
function: BlockExecutablesFromRunningViaShell function: BlockExecutablesFromRunningViaShell
parameters: parameters:
executableNameWithExtension: '{{ $executableNameWithExtension }}' executableNameWithExtension: '{{ $executableNameWithExtension }}'
-
name: CreatePlaceholderFile
parameters:
- name: placeholderFilePath
call:
function: RunPowerShell
parameters:
codeComment: 'Create a placeholder file at "{{ $placeholderFilePath }}".'
code: |-
$filePath = '{{ $placeholderFilePath }}'
$expandedFilePath = [System.Environment]::ExpandEnvironmentVariables($filePath)
$placeholderText = 'privacy.sexy placeholder'
Write-Output "Creating placeholder file at `"$expandedFilePath`"."
$parentDirectory = [System.IO.Path]::GetDirectoryName($expandedFilePath)
if (Test-Path $expandedFilePath -PathType Leaf) {
Write-Host "Skipping file creation as `"$expandedFilePath`" already exists."
Exit 0
}
if (Test-Path $parentDirectory -PathType Container) {
Write-Host "Skipping parent directory creation as `"$parentDirectory`" already exists."
} else {
try {
New-Item `
-ItemType Directory `
-Path "$parentDirectory" `
-Force `
-ErrorAction Stop `
| Out-Null
Write-Output "Successfully created directory for placeholder file at `"$parentDirectory`"."
} catch {
Write-Error "Failed to create directory for placeholder at `"$parentDirectory`": $_"
Exit 1
}
}
try {
New-Item `
-ItemType File `
-Path $expandedFilePath `
-Value "$placeholderText" `
-Force `
-ErrorAction Stop `
| Out-Null
Write-Host "Successfully created a placeholder file at `"$expandedFilePath`"."
} catch {
Write-Error "Failed to create placeholder file at `"$expandedFilePath`": $_"
Exit 1
}
revertCodeComment: 'Remove the placeholder file at "{{ $placeholderFilePath }}".'
revertCode: |-
$filePath = '{{ $placeholderFilePath }}'
$expandedFilePath = [System.Environment]::ExpandEnvironmentVariables($filePath)
$placeholderText = 'privacy.sexy placeholder'
Write-Output "Attempting to remove placeholder file at `"$expandedFilePath`"."
if (-Not (Test-Path $expandedFilePath -PathType Leaf)) {
Write-Host "Skipping file removal as `"$expandedFilePath`" does not exist, no action needed."
Exit 0
}
$currentContent = Get-Content $expandedFilePath `
-ErrorAction SilentlyContinue
if ($currentContent -ne $placeholderText) {
Write-Output "Skipping removal as the file at `"$expandedFilePath`" was not created by privacy.sexy."
Exit 0
}
Write-Output "File contents match the placeholder content. Proceeding to remove the file."
try {
Remove-Item `
-Path $expandedFilePath `
-Force `
-ErrorAction Stop
Write-Host "Successfully removed the placeholder file at `"$expandedFilePath`"."
} catch {
Write-Error "Failed to delete the placeholder file at `"$expandedFilePath`": $_"
Exit 1
}