Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pull Request #2526

Merged
merged 3 commits into from
Aug 6, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
344 changes: 127 additions & 217 deletions edgeremoval.ps1
Original file line number Diff line number Diff line change
@@ -1,253 +1,163 @@
# Script Metadata
# Created by AveYo, source: https://raw.githubusercontent.com/AveYo/fox/main/Edge_Removal.bat
# Powershell Conversion and Refactor done by Chris Titus Tech
# Powershell Conversion and Refactor by Chris Titus Tech
# Updated By Taylor Christian Nesome 8/6/2024

# Initial Configuration
$host.ui.RawUI.WindowTitle = 'Edge Removal - Chris Titus Tech 2023.05.10'
$remove_win32 = @("Microsoft Edge", "Microsoft Edge Update")
$remove_appx = @("MicrosoftEdge")
$skip = @() # Optional: @("DevTools")

$also_remove_webview = 0
if ($also_remove_webview -eq 1) {
$remove_win32 += "Microsoft EdgeWebView"
$remove_appx += "WebExperience", "Win32WebViewHost"
}

# Administrative Privileges Check
$privileges = @(
'SeSecurityPrivilege',
'SeTakeOwnershipPrivilege',
'SeBackupPrivilege',
'SeRestorePrivilege'
)

foreach ($privilege in $privileges) {
[System.Diagnostics.Process]::SetPrivilege($privilege, 2)
}

# Edge Removal Procedures
$processesToShutdown = @(
'explorer', 'Widgets', 'widgetservice', 'msedgewebview2', 'MicrosoftEdge*', 'chredge',
'msedge', 'edge', 'msteams', 'msfamily', 'WebViewHost', 'Clipchamp'
)

Stop-Process -Name "explorer" -Force -ErrorAction SilentlyContinue
$processesToShutdown | ForEach-Object {
Stop-Process -Name $_ -Force -ErrorAction SilentlyContinue
}

$MS = ($env:ProgramFiles, ${env:ProgramFiles(x86)})[[Environment]::Is64BitOperatingSystem] + '\Microsoft\Edge\Application\msedge.exe'

Remove-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\msedge.exe" -Recurse -ErrorAction SilentlyContinue
Remove-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ie_to_edge_stub.exe" -Recurse -ErrorAction SilentlyContinue
Remove-Item -Path 'Registry::HKEY_Users\S-1-5-21*\Software\Classes\microsoft-edge' -Recurse -ErrorAction SilentlyContinue
Remove-Item -Path 'Registry::HKEY_Users\S-1-5-21*\Software\Classes\MSEdgeHTM' -Recurse -ErrorAction SilentlyContinue

New-Item -Path "HKLM:\SOFTWARE\Classes\microsoft-edge\shell\open\command" -Force -ErrorAction SilentlyContinue
Set-ItemProperty -Path "HKLM:\SOFTWARE\Classes\microsoft-edge\shell\open\command" -Name '(Default)' -Value "`"$MS`" --single-argument %%1" -Force -ErrorAction SilentlyContinue

New-Item -Path "HKLM:\SOFTWARE\Classes\MSEdgeHTM\shell\open\command" -Force -ErrorAction SilentlyContinue
Set-ItemProperty -Path "HKLM:\SOFTWARE\Classes\MSEdgeHTM\shell\open\command" -Name '(Default)' -Value "`"$MS`" --single-argument %%1" -Force -ErrorAction SilentlyContinue
# Define constants and initial configuration
<#
.SYNOPSIS
This script removes Microsoft Edge and related components from the system.

.DESCRIPTION
This script performs the following tasks:
- Terminates Edge-related processes.
- Removes registry entries associated with Microsoft Edge.
- Uninstalls Edge-related AppX packages.
- Cleans up shortcut files.
- Configures Edge policy settings to prevent reinstallation.

.NOTES
Updated by Taylor Christian Newsome
Version: 2024.08.06
#>

$registryPaths = @('HKLM:\SOFTWARE\Policies', 'HKLM:\SOFTWARE', 'HKLM:\SOFTWARE\WOW6432Node')
$edgeProperties = @('InstallDefault', 'Install{56EB18F8-B008-4CBD-B6D2-8C97FE7E9062}', 'Install{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}')
foreach ($path in $registryPaths) {
foreach ($prop in $edgeProperties) {
Remove-ItemProperty -Path "$path\Microsoft\EdgeUpdate" -Name $prop -Force -ErrorAction SilentlyContinue
}
# Define constants and initial configuration
$ScriptVersion = "2024.08.06"
$EdgeProcessesToShutdown = @('explorer', 'Widgets', 'widgetservice', 'msedgewebview2', 'MicrosoftEdge*', 'chredge', 'msedge', 'edge', 'msteams', 'msfamily', 'WebViewHost', 'Clipchamp')
$EdgeRemovalOptions = @{
RemoveWin32 = @("Microsoft Edge", "Microsoft Edge Update")
RemoveAppx = @("MicrosoftEdge")
Skip = @() # Optional: @("DevTools")
AlsoRemoveWebView = $false
}

$edgeupdate = 'Microsoft\EdgeUpdate\Clients\{56EB18F8-B008-4CBD-B6D2-8C97FE7E9062}'
$webvupdate = 'Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}'
$on_actions = @('on-os-upgrade', 'on-logon', 'on-logon-autolaunch', 'on-logon-startup-boost')
$registryBases = @('HKLM:\SOFTWARE', 'HKLM:\SOFTWARE\Wow6432Node')
foreach ($base in $registryBases) {
foreach ($launch in $on_actions) {
Remove-Item -Path "$base\$edgeupdate\Commands\$launch" -Force -ErrorAction SilentlyContinue
Remove-Item -Path "$base\$webvupdate\Commands\$launch" -Force -ErrorAction SilentlyContinue
# Function to check if the script is running with administrative privileges
function Test-Admin {
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
Write-Error "The script must be run as an Administrator."
exit 1
}
}

$registryPaths = @('HKCU:', 'HKLM:')
$nodes = @('', '\Wow6432Node')
foreach ($regPath in $registryPaths) {
foreach ($node in $nodes) {
foreach ($i in $remove_win32) {
Remove-ItemProperty -Path "$regPath\SOFTWARE${node}\Microsoft\Windows\CurrentVersion\Uninstall\$i" -Name 'NoRemove' -Force -ErrorAction SilentlyContinue
New-Item -Path "$regPath\SOFTWARE${node}\Microsoft\EdgeUpdateDev" -Force | Out-Null
Set-ItemProperty -Path "$regPath\SOFTWARE${node}\Microsoft\EdgeUpdateDev" -Name 'AllowUninstall' -Value 1 -Type Dword -Force
# Function to stop Edge-related processes
function Stop-EdgeProcesses {
param([string[]]$ProcessesToStop)
foreach ($process in $ProcessesToStop) {
try {
Stop-Process -Name $process -Force -ErrorAction Stop
Write-Output "Successfully stopped process: $process"
} catch {
Write-Error "Failed to stop process: $process. $_"
}
}
}

$foldersToSearch = @('LocalApplicationData', 'ProgramFilesX86', 'ProgramFiles') | ForEach-Object {
[Environment]::GetFolderPath($_)
}

$edges = @()
$bhoFiles = @()

foreach ($folder in $foldersToSearch) {
$bhoFiles += Get-ChildItem -Path "$folder\Microsoft\Edge*\ie_to_edge_stub.exe" -Recurse -ErrorAction SilentlyContinue

$edges += Get-ChildItem -Path "$folder\Microsoft\Edge*\setup.exe" -Recurse -ErrorAction SilentlyContinue |
Where-Object { $_.FullName -notlike '*EdgeWebView*' }
}

$destinationDir = "$env:SystemDrive\Scripts"
New-Item -Path $destinationDir -ItemType Directory -ErrorAction SilentlyContinue | Out-Null

foreach ($bhoFile in $bhoFiles) {
if (Test-Path $bhoFile) {
# Function to remove registry entries related to Microsoft Edge
function Remove-EdgeRegistryEntries {
param([string[]]$RegistryPaths)
foreach ($path in $RegistryPaths) {
try {
Copy-Item -Path $bhoFile -Destination "$destinationDir\ie_to_edge_stub.exe" -Force
} catch { }
}
}

## Work on Appx Removals
$provisioned = Get-AppxProvisionedPackage -Online
$appxpackage = Get-AppxPackage -AllUsers
$eol = @()

$store = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Store'
$storeP = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Store\InstalledApplications'
foreach ($app in $appxpackage) {
$name = $app.Name
if ($app.Name -eq "Microsoft.Edge") {
$eol += $name
} elseif ($app.Name -eq "Microsoft.EdgeBeta" -or $app.Name -eq "Microsoft.EdgeDev" -or $app.Name -eq "Microsoft.EdgeCanary" -or $app.Name -eq "Microsoft.MicrosoftEdge") {
$eol += $name
Remove-Item -Path $path -Recurse -Force -ErrorAction Stop
Write-Output "Successfully removed registry path: $path"
} catch {
Write-Error "Failed to remove registry path: $path. $_"
}
}
}

$eolApps = $provisioned | Where-Object { $eol -contains $_.DisplayName }

foreach ($edge in $eolApps) {
$edgeName = $edge.DisplayName
if (-not ($skip -contains $edgeName)) {
# Function to remove Microsoft Edge AppX packages
function Remove-EdgeAppxPackages {
param([string[]]$AppxPackagesToRemove)
$provisionedPackages = Get-AppxProvisionedPackage -Online
foreach ($package in $AppxPackagesToRemove) {
try {
Remove-AppxProvisionedPackage -Online -PackageName $edgeName -ErrorAction SilentlyContinue
} catch { }
$packagesToRemove = $provisionedPackages | Where-Object { $_.DisplayName -like "*$package*" }
foreach ($pkg in $packagesToRemove) {
Remove-AppxProvisionedPackage -Online -PackageName $pkg.PackageName -ErrorAction Stop
Write-Output "Successfully removed provisioned package: $pkg.DisplayName"
}

$installedPackages = Get-AppxPackage -AllUsers | Where-Object { $_.PackageFullName -like "*$package*" }
foreach ($pkg in $installedPackages) {
Remove-AppxPackage -Package $pkg.PackageFullName -AllUsers -ErrorAction Stop
Write-Output "Successfully removed installed package: $pkg.PackageFullName"
}
} catch {
Write-Error "Failed to remove AppX package: $package. $_"
}
}
}

foreach ($edge in $appxpackage) {
$edgeName = $edge.Name
if ($eol -contains $edgeName) {
if (-not ($skip -contains $edgeName)) {
# Function to remove shortcuts related to Microsoft Edge
function Remove-EdgeShortcuts {
param([string[]]$ShortcutPaths)
foreach ($path in $ShortcutPaths) {
if (Test-Path $path) {
try {
Remove-AppxPackage -Package $edgeName -AllUsers -ErrorAction SilentlyContinue
} catch { }
Remove-Item -Path $path -Force -ErrorAction Stop
Write-Output "Successfully removed shortcut: $path"
} catch {
Write-Error "Failed to remove shortcut: $path. $_"
}
}
}
}

## Redirect shortcuts
$shortcut_path = "$env:Public\Desktop"
$shortcut_file = 'Microsoft Edge.lnk'
$full_path = Join-Path -Path $shortcut_path -ChildPath $shortcut_file

if (Test-Path $full_path) {
Remove-Item -Path $full_path -Force -ErrorAction SilentlyContinue
}

$shortcut_path = "$env:ProgramData\Microsoft\Windows\Start Menu\Programs"
$shortcut_file = 'Microsoft Edge.lnk'
$full_path = Join-Path -Path $shortcut_path -ChildPath $shortcut_file

if (Test-Path $full_path) {
Remove-Item -Path $full_path -Force -ErrorAction SilentlyContinue
}

$edgePolicy = 'HKLM:\SOFTWARE\Policies\Microsoft\Edge'
if (-not (Test-Path $edgePolicy)) {
New-Item -Path $edgePolicy -Force | Out-Null
}

$edgePrefs = @{
'Dword' = @{
'BrowserReplacementEnabled' = 1
'HideFirstRunExperience' = 1
'HideImportEdgeFavoritesPrompt' = 1
'HideSyncSetupExperience' = 1
'FavoritesBarVisibility' = 1
}
'String' = @{
'AutoplayAllowed' = 'AllowOnce'
# Function to configure Edge policy settings
function Configure-EdgePolicy {
param([hashtable]$PolicySettings)
$edgePolicyPath = 'HKLM:\SOFTWARE\Policies\Microsoft\Edge'
if (-not (Test-Path $edgePolicyPath)) {
try {
New-Item -Path $edgePolicyPath -Force | Out-Null
Write-Output "Created Edge policy registry path: $edgePolicyPath"
} catch {
Write-Error "Failed to create Edge policy registry path: $edgePolicyPath. $_"
}
}
}

foreach ($entryType in $edgePrefs.Keys) {
foreach ($prefName in $edgePrefs[$entryType].Keys) {
Set-ItemProperty -Path $edgePolicy -Name $prefName -Value $edgePrefs[$entryType][$prefName] -Type $entryType -Force
foreach ($entryType in $PolicySettings.Keys) {
foreach ($prefName in $PolicySettings[$entryType].Keys) {
try {
Set-ItemProperty -Path $edgePolicyPath -Name $prefName -Value $PolicySettings[$entryType][$prefName] -Type $entryType -Force
Write-Output "Successfully set Edge policy: $prefName = $($PolicySettings[$entryType][$prefName])"
} catch {
Write-Error "Failed to set Edge policy: $prefName. $_"
}
}
}
}

# Output Results
Write-Host "Edge Removal Complete" -ForegroundColor Green

# Define constants and initial configuration
$ScriptVersion = "2023.05.10"
$EdgeProcessesToShutdown = @('explorer', 'Widgets', 'widgetservice', 'msedgewebview2', 'MicrosoftEdge*', 'chredge', 'msedge', 'edge', 'msteams', 'msfamily', 'WebViewHost', 'Clipchamp')
$EdgeRemovalOptions = @{
RemoveWin32 = @("Microsoft Edge", "Microsoft Edge Update")
RemoveAppx = @("MicrosoftEdge")
Skip = @() # Optional: @("DevTools")
AlsoRemoveWebView = $false
}

# Define main function to remove Microsoft Edge components
function Remove-MicrosoftEdge {
[CmdletBinding()]
param()

# Function to shutdown processes related to Microsoft Edge
function Stop-EdgeProcesses {
$EdgeProcessesToShutdown | ForEach-Object {
Stop-Process -Name $_ -Force -ErrorAction SilentlyContinue
# Main execution
try {
Test-Admin
Stop-EdgeProcesses -ProcessesToStop $EdgeProcessesToShutdown
Remove-EdgeRegistryEntries -RegistryPaths @(
"HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\msedge.exe",
"HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ie_to_edge_stub.exe",
"Registry::HKEY_Users\S-1-5-21*\Software\Classes\microsoft-edge",
"Registry::HKEY_Users\S-1-5-21*\Software\Classes\MSEdgeHTM"
)
Remove-EdgeAppxPackages -AppxPackagesToRemove $EdgeRemovalOptions.RemoveAppx
Remove-EdgeShortcuts -ShortcutPaths @(
"$env:Public\Desktop\Microsoft Edge.lnk",
"$env:ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Edge.lnk"
)
Configure-EdgePolicy -PolicySettings @{
'Dword' = @{
'BrowserReplacementEnabled' = 1
'HideFirstRunExperience' = 1
'HideImportEdgeFavoritesPrompt' = 1
'HideSyncSetupExperience' = 1
'FavoritesBarVisibility' = 1
}
}

# Function to remove registry entries related to Microsoft Edge
function Remove-EdgeRegistryEntries {
# Clean up certain registry entries
Remove-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\msedge.exe" -Recurse -ErrorAction SilentlyContinue
Remove-Item -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ie_to_edge_stub.exe" -Recurse -ErrorAction SilentlyContinue
Remove-Item -Path 'Registry::HKEY_Users\S-1-5-21*\Software\Classes\microsoft-edge' -Recurse -ErrorAction SilentlyContinue
Remove-Item -Path 'Registry::HKEY_Users\S-1-5-21*\Software\Classes\MSEdgeHTM' -Recurse -ErrorAction SilentlyContinue

# Create new registry entries
$EdgeExecutablePath = ($env:ProgramFiles, ${env:ProgramFiles(x86)})[[Environment]::Is64BitOperatingSystem] + '\Microsoft\Edge\Application\msedge.exe'
New-Item -Path "HKLM:\SOFTWARE\Classes\microsoft-edge\shell\open\command" -Force -ErrorAction SilentlyContinue
Set-ItemProperty -Path "HKLM:\SOFTWARE\Classes\microsoft-edge\shell\open\command" -Name '(Default)' -Value "`"$EdgeExecutablePath`" --single-argument %%1" -Force -ErrorAction SilentlyContinue

New-Item -Path "HKLM:\SOFTWARE\Classes\MSEdgeHTM\shell\open\command" -Force -ErrorAction SilentlyContinue
Set-ItemProperty -Path "HKLM:\SOFTWARE\Classes\MSEdgeHTM\shell\open\command" -Name '(Default)' -Value "`"$EdgeExecutablePath`" --single-argument %%1" -Force -ErrorAction SilentlyContinue
}

# Function to remove Microsoft Edge AppX packages
function Remove-EdgeAppxPackages {
$EdgeRemovalOptions.RemoveAppx | ForEach-Object {
# Remove provisioned packages
Get-AppxProvisionedPackage -Online | Where-Object { $_.PackageName -like "*$_*" -and $EdgeRemovalOptions.Skip -notcontains $_.PackageName } | Remove-AppxProvisionedPackage -Online -AllUsers -ErrorAction SilentlyContinue

# Remove installed packages
Get-AppxPackage -AllUsers | Where-Object { $_.PackageFullName -like "*$_*" -and $EdgeRemovalOptions.Skip -notcontains $_.PackageFullName } | Remove-AppxPackage -AllUsers -ErrorAction SilentlyContinue
'String' = @{
'AutoplayAllowed' = 'AllowOnce'
}
}

# Function to remove Microsoft Edge processes, registry entries, and AppX packages
try {
Stop-EdgeProcesses
Remove-EdgeRegistryEntries
Remove-EdgeAppxPackages
Write-Output "Microsoft Edge components have been successfully removed."
} catch {
Write-Error "Failed to remove Microsoft Edge components: $_"
}
Write-Output "Microsoft Edge components have been successfully removed."
} catch {
Write-Error "An error occurred during execution: $_"
}

# Execute the main function
Remove-MicrosoftEdge
Remove-MicrosoftEdge
Loading