Back to Resources
Level
Script
General
Many Windows devices come preloaded with unnecessary applications (bloatware) that consume storage, clutter the Start menu, and sometimes run in the background, impacting system performance. Manually removing these apps can be time-consuming and error-prone, with the risk of accidentally uninstalling critical components.
This PowerShell script automates the removal of pre-installed and unwanted Microsoft Store applications while ensuring essential business and system-critical apps remain untouched. It leverages a predefined whitelist to protect necessary applications and allows users to extend this list with custom entries.
The script works in two main stages:
It also creates a dedicated folder (C:\ProgramData\Debloat) for logging, ensuring an audit trail of every removal operation.
<#
This resource is provided as a convenience for Level users. We cannot
guarantee it will work in all environments. Please test before deploying
to your production environment. We welcome contributions to our community
library
Level Library
https://level.io/library/script-remove-bloatware-windows-powershell
#>
param (
[string[]]$customwhitelist
)
#no errors throughout
$ErrorActionPreference = 'silentlycontinue'
#Create Folder
$DebloatFolder = "C:\ProgramData\Debloat"
If (Test-Path $DebloatFolder) {
Write-Output "$DebloatFolder exists. Skipping."
}
Else {
Write-Output "The folder '$DebloatFolder' doesn't exist. This folder will be used for storing logs created after the script runs. Creating now."
Start-Sleep 1
New-Item -Path "$DebloatFolder" -ItemType Directory
Write-Output "The folder $DebloatFolder was successfully created."
}
Start-Transcript -Path "C:\ProgramData\Debloat\Debloat.log"
############################################################################################################
# Remove AppX Packages #
############################################################################################################
$WhitelistedApps = @(
'Microsoft.WindowsNotepad',
'Microsoft.CompanyPortal',
'Microsoft.ScreenSketch',
'Microsoft.Paint3D',
'Microsoft.WindowsCalculator',
'Microsoft.WindowsStore',
'Microsoft.Windows.Photos',
'CanonicalGroupLimited.UbuntuonWindows',
'Microsoft.MicrosoftStickyNotes',
'Microsoft.MSPaint',
'Microsoft.WindowsCamera',
'.NET Framework',
'Microsoft.HEIFImageExtension',
'Microsoft.ScreenSketch',
'Microsoft.StorePurchaseApp',
'Microsoft.VP9VideoExtensions',
'Microsoft.WebMediaExtensions',
'Microsoft.WebpImageExtension',
'Microsoft.DesktopAppInstaller',
'WindSynthBerry',
'MIDIBerry',
'Slack',
'Microsoft.SecHealthUI',
'WavesAudio.MaxxAudioProforDell2019',
'Dell Optimizer Core',
'Dell SupportAssist Remediation',
'Dell SupportAssist OS Recovery Plugin for Dell Update',
'Dell Pair',
'Dell Display Manager 2.0',
'Dell Display Manager 2.1',
'Dell Display Manager 2.2',
'Dell Peripheral Manager',
'MSTeams',
'Microsoft.Paint',
'Microsoft.OutlookForWindows',
'Microsoft.WindowsTerminal',
'Microsoft.MicrosoftEdge.Stable'
)
##If $customwhitelist is set, split on the comma and add to whitelist
if ($customwhitelist) {
$customWhitelistApps = $customwhitelist -split ","
foreach ($whitelistapp in $customwhitelistapps) {
##Add to the array
$WhitelistedApps += $whitelistapp
}
}
$NonRemovable = @(
'1527c705-839a-4832-9118-54d4Bd6a0c89',
'c5e2524a-ea46-4f67-841f-6a9465d9d515',
'E2A4F912-2574-4A75-9BB0-0D023378592B',
'F46D4000-FD22-4DB4-AC8E-4E1DDDE828FE',
'InputApp',
'Microsoft.AAD.BrokerPlugin',
'Microsoft.AccountsControl',
'Microsoft.BioEnrollment',
'Microsoft.CredDialogHost',
'Microsoft.ECApp',
'Microsoft.LockApp',
'Microsoft.MicrosoftEdgeDevToolsClient',
'Microsoft.MicrosoftEdge',
'Microsoft.PPIProjection',
'Microsoft.Win32WebViewHost',
'Microsoft.Windows.Apprep.ChxApp',
'Microsoft.Windows.AssignedAccessLockApp',
'Microsoft.Windows.CapturePicker',
'Microsoft.Windows.CloudExperienceHost',
'Microsoft.Windows.ContentDeliveryManager',
'Microsoft.Windows.Cortana',
'Microsoft.Windows.NarratorQuickStart',
'Microsoft.Windows.ParentalControls',
'Microsoft.Windows.PeopleExperienceHost',
'Microsoft.Windows.PinningConfirmationDialog',
'Microsoft.Windows.SecHealthUI',
'Microsoft.Windows.SecureAssessmentBrowser',
'Microsoft.Windows.ShellExperienceHost',
'Microsoft.Windows.XGpuEjectDialog',
'Microsoft.XboxGameCallableUI',
'Windows.CBSPreview',
'windows.immersivecontrolpanel',
'Windows.PrintDialog',
'Microsoft.VCLibs.140.00',
'Microsoft.Services.Store.Engagement',
'Microsoft.UI.Xaml.2.0',
'Microsoft.AsyncTextService',
'Microsoft.UI.Xaml.CBS',
'Microsoft.Windows.CallingShellApp',
'Microsoft.Windows.OOBENetworkConnectionFlow',
'Microsoft.Windows.PrintQueueActionCenter',
'Microsoft.Windows.StartMenuExperienceHost',
'MicrosoftWindows.Client.CBS',
'MicrosoftWindows.Client.Core',
'MicrosoftWindows.UndockedDevKit',
'NcsiUwpApp',
'Microsoft.NET.Native.Runtime.2.2',
'Microsoft.NET.Native.Framework.2.2',
'Microsoft.UI.Xaml.2.8',
'Microsoft.UI.Xaml.2.7',
'Microsoft.UI.Xaml.2.3',
'Microsoft.UI.Xaml.2.4',
'Microsoft.UI.Xaml.2.1',
'Microsoft.UI.Xaml.2.2',
'Microsoft.UI.Xaml.2.5',
'Microsoft.UI.Xaml.2.6',
'Microsoft.VCLibs.140.00.UWPDesktop',
'MicrosoftWindows.Client.LKG',
'MicrosoftWindows.Client.FileExp',
'Microsoft.WindowsAppRuntime.1.5',
'Microsoft.WindowsAppRuntime.1.3',
'Microsoft.WindowsAppRuntime.1.1',
'Microsoft.WindowsAppRuntime.1.2',
'Microsoft.WindowsAppRuntime.1.4',
'Microsoft.Windows.OOBENetworkCaptivePortal',
'Microsoft.Windows.Search'
)
$appstoignore = $WhitelistedApps += $NonRemovable
$Bloatware = @("*ActiproSoftwareLLC*", "*AdobeSystemsIncorporated.AdobePhotoshopExpress*", "*BubbleWitch3Saga*", "*CandyCrush*", "*DevHome*", "*Disney*", "*Dolby*", "*Duolingo-LearnLanguagesforFree*", "*EclipseManager*", "*Facebook*", "*Flipboard*", "*gaming*", "*Minecraft*", "*Office*", "*PandoraMediaInc*", "*Royal Revolt*", "*Speed Test*", "*Spotify*", "*Sway*", "*Twitter*", "*Wunderlist*", "AD2F1837.HPPrinterControl", "AppUp.IntelGraphicsExperience", "C27EB4BA.DropboxOEM*", "Disney.37853FC22B2CE", "DolbyLaboratories.DolbyAccess", "DolbyLaboratories.DolbyAudio", "E0469640.SmartAppearance", "Microsoft.549981C3F5F10", "Microsoft.AV1VideoExtension", "Microsoft.BingNews", "Microsoft.BingSearch", "Microsoft.BingWeather", "Microsoft.GetHelp", "Microsoft.Getstarted", "Microsoft.GamingApp", "Microsoft.HEVCVideoExtension", "Microsoft.Messaging", "Microsoft.Microsoft3DViewer", "Microsoft.MicrosoftEdge.Stable", "Microsoft.MicrosoftJournal", "Microsoft.MicrosoftOfficeHub", "Microsoft.MicrosoftSolitaireCollection", "Microsoft.MixedReality.Portal", "Microsoft.MPEG2VideoExtension", "Microsoft.News", "Microsoft.Office.Lens", "Microsoft.Office.OneNote", "Microsoft.Office.Sway", "Microsoft.OneConnect", "Microsoft.OneDriveSync", "Microsoft.People", "Microsoft.PowerAutomateDesktop", "Microsoft.PowerAutomateDesktopCopilotPlugin", "Microsoft.Print3D", "Microsoft.RemoteDesktop", "Microsoft.SkypeApp", "Microsoft.StorePurchaseApp", "Microsoft.SysinternalsSuite", "Microsoft.Teams", "Microsoft.Todos", "Microsoft.Whiteboard", "Microsoft.Windows.DevHome", "Microsoft.WindowsAlarms", "Microsoft.WindowsCamera", "Microsoft.windowscommunicationsapps", "Microsoft.WindowsFeedbackHub", "Microsoft.WindowsMaps", "Microsoft.WindowsSoundRecorder", "Microsoft.WindowsStore", "Microsoft.Xbox.TCUI", "Microsoft.XboxApp", "Microsoft.XboxGameOverlay", "Microsoft.XboxGamingOverlay", "Microsoft.XboxGamingOverlay_5.721.10202.0_neutral_~_8wekyb3d8bbwe", "Microsoft.XboxIdentityProvider", "Microsoft.XboxSpeechToTextOverlay", "Microsoft.YourPhone", "Microsoft.ZuneMusic", "Microsoft.ZuneVideo", "MicrosoftCorporationII.MicrosoftFamily", "MicrosoftCorporationII.QuickAssist", "MicrosoftWindows.Client.WebExperience", "MicrosoftWindows.CrossDevice", "MirametrixInc.GlancebyMirametrix", "MSTeams", "RealtimeboardInc.RealtimeBoard", "SpotifyAB.SpotifyMusic")
$provisioned = Get-AppxProvisionedPackage -Online | Where-Object { $_.DisplayName -in $Bloatware -and $_.DisplayName -notin $appstoignore -and $_.DisplayName -notlike 'MicrosoftWindows.Voice*' -and $_.DisplayName -notlike 'Microsoft.LanguageExperiencePack*' -and $_.DisplayName -notlike 'MicrosoftWindows.Speech*' }
foreach ($appxprov in $provisioned) {
$packagename = $appxprov.PackageName
$displayname = $appxprov.DisplayName
write-output "Removing $displayname AppX Provisioning Package"
try {
Remove-AppxProvisionedPackage -PackageName $packagename -Online -ErrorAction SilentlyContinue
write-output "Removed $displayname AppX Provisioning Package"
}
catch {
write-output "Unable to remove $displayname AppX Provisioning Package"
}
}
$appxs = Get-AppxPackage -AllUsers | Where-Object { $_.Name -in $Bloatware -and $_.Name -notin $appstoignore -and $_.Name -notlike 'MicrosoftWindows.Voice*' -and $_.Name -notlike 'Microsoft.LanguageExperiencePack*' -and $_.Name -notlike 'MicrosoftWindows.Speech*' }
foreach ($appx in $appxs) {
$packagename = $appx.PackageFullName
$displayname = $appx.Name
write-output "Removing $displayname AppX Package"
try {
Remove-AppxPackage -Package $packagename -AllUsers -ErrorAction SilentlyContinue
write-output "Removed $displayname AppX Package"
}
catch {
write-output "Unable to remove $displayname AppX Package"
}
}
############################################################################################################
# End of AppX Packages Removal #
############################################################################################################
Stop-Transcript
Remove Bloatware on Windows
Remove unnecessary apps on Windows while preserving essential packages. This script uses a whitelist, logs every step at C:\ProgramData\Debloat, and reduces clutter with minimal effort. Use the custom whitelist to tailor removal.
PowerShell
500
Local system
Explore more automations, scripts, and policies to further enhance your IT operations.