From 138c5de5d340a871de4c44eb6da8c1c6f5b45c71 Mon Sep 17 00:00:00 2001 From: Psyi Rius <99079175+psyirius@users.noreply.github.com> Date: Wed, 7 Aug 2024 14:27:53 -0700 Subject: [PATCH] EdgeRemoval optimization and refactor (from stream today: Techie Jack) (#2530) * Gracefully nuke Edge and all its associates completely. - me: same person from the stream chat today: Techie Jack (aka: Psyirius) - cleaner script - removes EdgeWebView - most programs install it, if it's needed and not found - removes EdgeUpdate (the updater) * removed local copy of the RegionPolicy - and Preprocessing refactor * Omit Webview from Uninstall --------- Co-authored-by: Chris Titus --- IntegratedServicesRegionPolicySet.json | 1 - config/tweaks.json | 6 +- edgeremoval.ps1 | 138 ------------- .../private/Uninstall-WinUtilEdgeBrowser.ps1 | 187 +++++++----------- 4 files changed, 71 insertions(+), 261 deletions(-) delete mode 100644 IntegratedServicesRegionPolicySet.json delete mode 100644 edgeremoval.ps1 diff --git a/IntegratedServicesRegionPolicySet.json b/IntegratedServicesRegionPolicySet.json deleted file mode 100644 index 393e992035..0000000000 --- a/IntegratedServicesRegionPolicySet.json +++ /dev/null @@ -1 +0,0 @@ - "enabled": ["AT", "BE", "BG", "CH", "CY", "CZ", "DE", "DK", "EE", "ES", "FI", "FR", "GF", "GP", "GR", "HR", "HU", "IE", "IS", "IT", "LI", "LT", "LU", "LV", "MT", "MQ", "NL", "NO", "PL", "PT", "RE", "RO", "SE", "SI", "SK", "YT"] diff --git a/config/tweaks.json b/config/tweaks.json index 98ae976330..8702322f50 100644 --- a/config/tweaks.json +++ b/config/tweaks.json @@ -2556,14 +2556,14 @@ }, "WPFTweaksRemoveEdge": { "Content": "Remove Microsoft Edge", - "Description": "Removes MS Edge when it gets reinstalled by updates. Credit: Techie Jack", + "Description": "Removes MS Edge when it gets reinstalled by updates. Credit: Psyirius", "category": "z__Advanced Tweaks - CAUTION", "panel": "1", "Order": "a029_", "InvokeScript": [ " - Uninstall-WinUtilEdgeBrowser - " + Uninstall-WinUtilEdgeBrowser + " ], "UndoScript": [ " diff --git a/edgeremoval.ps1 b/edgeremoval.ps1 deleted file mode 100644 index 362fe39621..0000000000 --- a/edgeremoval.ps1 +++ /dev/null @@ -1,138 +0,0 @@ -$msedgeProcess = Get-Process -Name "msedge" -ErrorAction SilentlyContinue -$widgetsProcess = Get-Process -Name "widgets" -ErrorAction SilentlyContinue -# Checking if Microsoft Edge is running -if ($msedgeProcess) { - Stop-Process -Name "msedge" -Force -} else { - Write-Output "msedge process is not running." -} -# Checking if Widgets is running -if ($widgetsProcess) { - Stop-Process -Name "widgets" -Force -} else { - Write-Output "widgets process is not running." -} - -function Uninstall-Process { - param ( - [Parameter(Mandatory = $true)] - [string]$Key - ) - - $originalNation = [microsoft.win32.registry]::GetValue('HKEY_USERS\.DEFAULT\Control Panel\International\Geo', 'Nation', [Microsoft.Win32.RegistryValueKind]::String) - - # Set Nation to 84 (France) temporarily - [microsoft.win32.registry]::SetValue('HKEY_USERS\.DEFAULT\Control Panel\International\Geo', 'Nation', 68, [Microsoft.Win32.RegistryValueKind]::String) | Out-Null - - # credits to he3als for the Acl commands - $fileName = "IntegratedServicesRegionPolicySet.json" - $pathISRPS = [Environment]::SystemDirectory + "\" + $fileName - $aclISRPS = Get-Acl -Path $pathISRPS - $aclISRPSBackup = [System.Security.AccessControl.FileSecurity]::new() - $aclISRPSBackup.SetSecurityDescriptorSddlForm($acl.Sddl) - if (Test-Path -Path $pathISRPS) { - try { - $admin = [System.Security.Principal.NTAccount]$(New-Object System.Security.Principal.SecurityIdentifier('S-1-5-32-544')).Translate([System.Security.Principal.NTAccount]).Value - - $aclISRPS.SetOwner($admin) - $rule = New-Object System.Security.AccessControl.FileSystemAccessRule($admin, 'FullControl', 'Allow') - $aclISRPS.AddAccessRule($rule) - Set-Acl -Path $pathISRPS -AclObject $aclISRPS - - Rename-Item -Path $pathISRPS -NewName ($fileName + '.bak') -Force - } - catch { - Write-Error "[$Mode] Failed to set owner for $pathISRPS" - } - } - - $baseKey = 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate' - $registryPath = $baseKey + '\ClientState\' + $Key - - if (!(Test-Path -Path $registryPath)) { - Write-Host "[$Mode] Registry key not found: $registryPath" - return - } - - Remove-ItemProperty -Path $registryPath -Name "experiment_control_labels" -ErrorAction SilentlyContinue | Out-Null - - $uninstallString = (Get-ItemProperty -Path $registryPath).UninstallString - $uninstallArguments = (Get-ItemProperty -Path $registryPath).UninstallArguments - - if ([string]::IsNullOrEmpty($uninstallString) -or [string]::IsNullOrEmpty($uninstallArguments)) { - Write-Host "[$Mode] Cannot find uninstall methods for $Mode" - return - } - - $uninstallArguments += " --force-uninstall --delete-profile" - - # $uninstallCommand = "`"$uninstallString`"" + $uninstallArguments - if (!(Test-Path -Path $uninstallString)) { - Write-Host "[$Mode] setup.exe not found at: $uninstallString" - return - } - Start-Process -FilePath $uninstallString -ArgumentList $uninstallArguments -Wait -NoNewWindow -Verbose - - # Restore Acl - if (Test-Path -Path ($pathISRPS + '.bak')) { - Rename-Item -Path ($pathISRPS + '.bak') -NewName $fileName -Force - Set-Acl -Path $pathISRPS -AclObject $aclISRPSBackup - } - - # Restore Nation - [microsoft.win32.registry]::SetValue('HKEY_USERS\.DEFAULT\Control Panel\International\Geo', 'Nation', $originalNation, [Microsoft.Win32.RegistryValueKind]::String) | Out-Null - - if ((Get-ItemProperty -Path $baseKey).IsEdgeStableUninstalled -eq 1) { - Write-Host "[$Mode] Edge Stable has been successfully uninstalled" - } -} - -function Uninstall-Edge { - Remove-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Edge" -Name "NoRemove" -ErrorAction SilentlyContinue | Out-Null - - [microsoft.win32.registry]::SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdateDev", "AllowUninstall", 1, [Microsoft.Win32.RegistryValueKind]::DWord) | Out-Null - - Uninstall-Process -Key '{56EB18F8-B008-4CBD-B6D2-8C97FE7E9062}' - - @( "$env:ProgramData\Microsoft\Windows\Start Menu\Programs", - "$env:PUBLIC\Desktop", - "$env:USERPROFILE\Desktop" ) | ForEach-Object { - $shortcutPath = Join-Path -Path $_ -ChildPath "Microsoft Edge.lnk" - if (Test-Path -Path $shortcutPath) { - Remove-Item -Path $shortcutPath -Force - } - } - -} - -function Uninstall-WebView { - Remove-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft EdgeWebView" -Name "NoRemove" -ErrorAction SilentlyContinue | Out-Null - - # Force to use system-wide WebView2 - # [microsoft.win32.registry]::SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge\WebView2\BrowserExecutableFolder", "*", "%%SystemRoot%%\System32\Microsoft-Edge-WebView") - - Uninstall-Process -Key '{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}' -} - -function Uninstall-EdgeUpdate { - Remove-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Edge Update" -Name "NoRemove" -ErrorAction SilentlyContinue | Out-Null - - $registryPath = 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate' - if (!(Test-Path -Path $registryPath)) { - Write-Host "Registry key not found: $registryPath" - return - } - $uninstallCmdLine = (Get-ItemProperty -Path $registryPath).UninstallCmdLine - - if ([string]::IsNullOrEmpty($uninstallCmdLine)) { - Write-Host "Cannot find uninstall methods for $Mode" - return - } - - Write-Output "Uninstalling: $uninstallCmdLine" - Start-Process cmd.exe "/c $uninstallCmdLine" -WindowStyle Hidden -Wait -} - -Uninstall-Edge - # "WebView" { Uninstall-WebView } - # "EdgeUpdate" { Uninstall-EdgeUpdate } diff --git a/functions/private/Uninstall-WinUtilEdgeBrowser.ps1 b/functions/private/Uninstall-WinUtilEdgeBrowser.ps1 index ccc22a9398..4d004f3904 100644 --- a/functions/private/Uninstall-WinUtilEdgeBrowser.ps1 +++ b/functions/private/Uninstall-WinUtilEdgeBrowser.ps1 @@ -1,152 +1,101 @@ Function Uninstall-WinUtilEdgeBrowser { - <# - .SYNOPSIS - This will uninstall edge by changing the region to Ireland and uninstalling edge the changing it back - + Uninstall the Edge Browser (Chromium) from the system in an elegant way. + .DESCRIPTION + This will switch up the region to one of the EEA countries temporarily and uninstall the Edge Browser (Chromium). #> -$msedgeProcess = Get-Process -Name "msedge" -ErrorAction SilentlyContinue -$widgetsProcess = Get-Process -Name "widgets" -ErrorAction SilentlyContinue -# Checking if Microsoft Edge is running -if ($msedgeProcess) { - Stop-Process -Name "msedge" -Force -} else { - Write-Output "msedge process is not running." -} -# Checking if Widgets is running -if ($widgetsProcess) { - Stop-Process -Name "widgets" -Force -} else { - Write-Output "widgets process is not running." -} + function Uninstall-EdgeClient { + param ( + [Parameter(Mandatory = $true)] + [string]$Key + ) -function Uninstall-Process { - param ( - [Parameter(Mandatory = $true)] - [string]$Key - ) - - $originalNation = [microsoft.win32.registry]::GetValue('HKEY_USERS\.DEFAULT\Control Panel\International\Geo', 'Nation', [Microsoft.Win32.RegistryValueKind]::String) - - # Set Nation to 84 (France) temporarily - [microsoft.win32.registry]::SetValue('HKEY_USERS\.DEFAULT\Control Panel\International\Geo', 'Nation', 68, [Microsoft.Win32.RegistryValueKind]::String) | Out-Null - - # credits to he3als for the Acl commands - $fileName = "IntegratedServicesRegionPolicySet.json" - $pathISRPS = [Environment]::SystemDirectory + "\" + $fileName - $aclISRPS = Get-Acl -Path $pathISRPS - $aclISRPSBackup = [System.Security.AccessControl.FileSecurity]::new() - $aclISRPSBackup.SetSecurityDescriptorSddlForm($acl.Sddl) - if (Test-Path -Path $pathISRPS) { - try { - $admin = [System.Security.Principal.NTAccount]$(New-Object System.Security.Principal.SecurityIdentifier('S-1-5-32-544')).Translate([System.Security.Principal.NTAccount]).Value - - $aclISRPS.SetOwner($admin) - $rule = New-Object System.Security.AccessControl.FileSystemAccessRule($admin, 'FullControl', 'Allow') - $aclISRPS.AddAccessRule($rule) - Set-Acl -Path $pathISRPS -AclObject $aclISRPS - - Rename-Item -Path $pathISRPS -NewName ($fileName + '.bak') -Force - } - catch { - Write-Error "[$Mode] Failed to set owner for $pathISRPS" - } - } + $originalNation = [microsoft.win32.registry]::GetValue('HKEY_USERS\.DEFAULT\Control Panel\International\Geo', 'Nation', [Microsoft.Win32.RegistryValueKind]::String) - $baseKey = 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate' - $registryPath = $baseKey + '\ClientState\' + $Key + # Set Nation to any of the EEA regions temporarily + # Refer: https://learn.microsoft.com/en-us/windows/win32/intl/table-of-geographical-locations + $tmpNation = 68 # Ireland + [microsoft.win32.registry]::SetValue('HKEY_USERS\.DEFAULT\Control Panel\International\Geo', 'Nation', $tmpNation, [Microsoft.Win32.RegistryValueKind]::String) | Out-Null - if (!(Test-Path -Path $registryPath)) { - Write-Host "[$Mode] Registry key not found: $registryPath" - return - } - - Remove-ItemProperty -Path $registryPath -Name "experiment_control_labels" -ErrorAction SilentlyContinue | Out-Null + $baseKey = 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate' + $registryPath = $baseKey + '\ClientState\' + $Key - $uninstallString = (Get-ItemProperty -Path $registryPath).UninstallString - $uninstallArguments = (Get-ItemProperty -Path $registryPath).UninstallArguments - - if ([string]::IsNullOrEmpty($uninstallString) -or [string]::IsNullOrEmpty($uninstallArguments)) { - Write-Host "[$Mode] Cannot find uninstall methods for $Mode" - return - } + if (!(Test-Path -Path $registryPath)) { + Write-Host "[$Mode] Registry key not found: $registryPath" + return + } - $uninstallArguments += " --force-uninstall --delete-profile" + # Remove the status flag + Remove-ItemProperty -Path $baseKey -Name "IsEdgeStableUninstalled" -ErrorAction SilentlyContinue | Out-Null - # $uninstallCommand = "`"$uninstallString`"" + $uninstallArguments - if (!(Test-Path -Path $uninstallString)) { - Write-Host "[$Mode] setup.exe not found at: $uninstallString" - return - } - Start-Process -FilePath $uninstallString -ArgumentList $uninstallArguments -Wait -NoNewWindow -Verbose + Remove-ItemProperty -Path $registryPath -Name "experiment_control_labels" -ErrorAction SilentlyContinue | Out-Null - # Restore Acl - if (Test-Path -Path ($pathISRPS + '.bak')) { - Rename-Item -Path ($pathISRPS + '.bak') -NewName $fileName -Force - Set-Acl -Path $pathISRPS -AclObject $aclISRPSBackup - } + $uninstallString = (Get-ItemProperty -Path $registryPath).UninstallString + $uninstallArguments = (Get-ItemProperty -Path $registryPath).UninstallArguments - # Restore Nation - [microsoft.win32.registry]::SetValue('HKEY_USERS\.DEFAULT\Control Panel\International\Geo', 'Nation', $originalNation, [Microsoft.Win32.RegistryValueKind]::String) | Out-Null - - if ((Get-ItemProperty -Path $baseKey).IsEdgeStableUninstalled -eq 1) { - Write-Host "[$Mode] Edge Stable has been successfully uninstalled" - } -} + if ([string]::IsNullOrEmpty($uninstallString) -or [string]::IsNullOrEmpty($uninstallArguments)) { + Write-Host "[$Mode] Cannot find uninstall methods for $Mode" + return + } -function Uninstall-Edge { - Remove-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Edge" -Name "NoRemove" -ErrorAction SilentlyContinue | Out-Null + # Extra arguments to nuke it + $uninstallArguments += " --force-uninstall --delete-profile" - [microsoft.win32.registry]::SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdateDev", "AllowUninstall", 1, [Microsoft.Win32.RegistryValueKind]::DWord) | Out-Null + # $uninstallCommand = "`"$uninstallString`"" + $uninstallArguments + if (!(Test-Path -Path $uninstallString)) { + Write-Host "[$Mode] setup.exe not found at: $uninstallString" + return + } + Start-Process -FilePath $uninstallString -ArgumentList $uninstallArguments -Wait -NoNewWindow -Verbose - Uninstall-Process -Key '{56EB18F8-B008-4CBD-B6D2-8C97FE7E9062}' + # Restore Nation back to the original + [microsoft.win32.registry]::SetValue('HKEY_USERS\.DEFAULT\Control Panel\International\Geo', 'Nation', $originalNation, [Microsoft.Win32.RegistryValueKind]::String) | Out-Null - @( "$env:ProgramData\Microsoft\Windows\Start Menu\Programs", - "$env:PUBLIC\Desktop", - "$env:USERPROFILE\Desktop" ) | ForEach-Object { - $shortcutPath = Join-Path -Path $_ -ChildPath "Microsoft Edge.lnk" - if (Test-Path -Path $shortcutPath) { - Remove-Item -Path $shortcutPath -Force + # might not exist in some cases + if ((Get-ItemProperty -Path $baseKey).IsEdgeStableUninstalled -eq 1) { + Write-Host "[$Mode] Edge Stable has been successfully uninstalled" } } -} - -function Uninstall-WebView { - Remove-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft EdgeWebView" -Name "NoRemove" -ErrorAction SilentlyContinue | Out-Null + function Uninstall-Edge { + Remove-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Edge" -Name "NoRemove" -ErrorAction SilentlyContinue | Out-Null - # Force to use system-wide WebView2 - # [microsoft.win32.registry]::SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge\WebView2\BrowserExecutableFolder", "*", "%%SystemRoot%%\System32\Microsoft-Edge-WebView") + [microsoft.win32.registry]::SetValue("HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdateDev", "AllowUninstall", 1, [Microsoft.Win32.RegistryValueKind]::DWord) | Out-Null - Uninstall-Process -Key '{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}' -} + Uninstall-EdgeClient -Key '{56EB18F8-B008-4CBD-B6D2-8C97FE7E9062}' + } -function Uninstall-EdgeUpdate { - Remove-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Edge Update" -Name "NoRemove" -ErrorAction SilentlyContinue | Out-Null + function Uninstall-WebView { + # FIXME: might not work on some systems - $registryPath = 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate' - if (!(Test-Path -Path $registryPath)) { - Write-Host "Registry key not found: $registryPath" - return - } - $uninstallCmdLine = (Get-ItemProperty -Path $registryPath).UninstallCmdLine + Remove-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft EdgeWebView" -Name "NoRemove" -ErrorAction SilentlyContinue | Out-Null - if ([string]::IsNullOrEmpty($uninstallCmdLine)) { - Write-Host "Cannot find uninstall methods for $Mode" - return + Uninstall-EdgeClient -Key '{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}' } - Write-Output "Uninstalling: $uninstallCmdLine" - Start-Process cmd.exe "/c $uninstallCmdLine" -WindowStyle Hidden -Wait -} + function Uninstall-EdgeUpdate { + # FIXME: might not work on some systems -Uninstall-Edge - # "WebView" { Uninstall-WebView } - # "EdgeUpdate" { Uninstall-EdgeUpdate } + Remove-ItemProperty -Path "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Edge Update" -Name "NoRemove" -ErrorAction SilentlyContinue | Out-Null + $registryPath = 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate' + if (!(Test-Path -Path $registryPath)) { + Write-Host "Registry key not found: $registryPath" + return + } + $uninstallCmdLine = (Get-ItemProperty -Path $registryPath).UninstallCmdLine + if ([string]::IsNullOrEmpty($uninstallCmdLine)) { + Write-Host "Cannot find uninstall methods for $Mode" + return + } + Start-Process cmd.exe "/c $uninstallCmdLine" -WindowStyle Hidden -Wait + } + Uninstall-Edge + # Uninstall-WebView - WebView is needed for Visual Studio and some MS Store Games like Forza + Uninstall-EdgeUpdate }