diff --git a/powershell/Remove-BuiltInApps.ps1 b/powershell/Remove-BuiltInApps.ps1 new file mode 100644 index 0000000..a0a10c5 --- /dev/null +++ b/powershell/Remove-BuiltInApps.ps1 @@ -0,0 +1,238 @@ +<# +.SYNOPSIS + Remove built-in apps (modern apps) from Windows 11 for All Users. + +.DESCRIPTION + This script will remove all built-in apps that are specified in the 'blacklistedapps' variable. + + ##WARNING## + Use with caution, restoring deleted provisioning packages is not a simple process. + + ##TIP## + If removing "MicrosoftTeams", also consider disabling the "Chat" icon on the taskbar, using INtune settingd catalog, as clicking this will re-install the appxpackage for the user. + +.NOTES + + Idea based on an original script for Windows 10 app removal / Credit to: Nickolaj Andersen @ MSEndpointMgr + Modifications to original script to Black list Appx instead of Whitelist + + FileName: Remove-Appx-AllUsers-CloudSourceList.ps1 + Author: Ben Whitmore + Contact: @byteben + Date: 27th June 2022 + +###### Windows 11 Apps###### + +Microsoft.549981C3F5F10 (Cortana Search) +Microsoft.BingNews +Microsoft.BingWeather +Microsoft.DesktopAppInstaller +Microsoft.GamingApp +Microsoft.GetHelp +Microsoft.Getstarted +Microsoft.HEIFImageExtension +Microsoft.MicrosoftEdge.Stable +Microsoft.MicrosoftOfficeHub +Microsoft.MicrosoftSolitaireCollection +Microsoft.MicrosoftStickyNotes +Microsoft.Paint +Microsoft.People +Microsoft.PowerAutomateDesktop +Microsoft.ScreenSketch +Microsoft.SecHealthUI +Microsoft.StorePurchaseApp +Microsoft.Todos +Microsoft.UI.Xaml.2.4 +Microsoft.VCLibs.140.00 +Microsoft.VP9VideoExtensions +Microsoft.WebMediaExtensions +Microsoft.WebpImageExtension +Microsoft.Windows.Photos +Microsoft.WindowsAlarms +Microsoft.WindowsCalculator +Microsoft.WindowsCamera +microsoft.windowscommunicationsapps +Microsoft.WindowsFeedbackHub +Microsoft.WindowsMaps +Microsoft.WindowsNotepad +Microsoft.WindowsSoundRecorder +Microsoft.WindowsStore +Microsoft.WindowsTerminal +Microsoft.Xbox.TCUI +Microsoft.XboxGameOverlay +Microsoft.XboxGamingOverlay +Microsoft.XboxIdentityProvider +Microsoft.XboxSpeechToTextOverlay +Microsoft.YourPhone +Microsoft.ZuneMusic +Microsoft.ZuneVideo +MicrosoftTeams +MicrosoftWindows.Client.WebExperience +#> + +Begin { + + #Log Function + function Write-LogEntry { + param ( + [parameter(Mandatory = $true)] + [ValidateNotNullOrEmpty()] + [string]$Value, + [parameter(Mandatory = $false)] + [ValidateNotNullOrEmpty()] + [string]$FileName = "AppXRemoval.log", + [switch]$Stamp + ) + + #Build Log File appending System Date/Time to output + $LogFile = Join-Path -Path $env:SystemRoot -ChildPath $("Temp\$FileName") + $Time = -join @((Get-Date -Format "HH:mm:ss.fff"), " ", (Get-WmiObject -Class Win32_TimeZone | Select-Object -ExpandProperty Bias)) + $Date = (Get-Date -Format "MM-dd-yyyy") + + If ($Stamp) { + $LogText = "<$($Value)> " + } + else { + $LogText = "$($Value)" + } + + Try { + Out-File -InputObject $LogText -Append -NoClobber -Encoding Default -FilePath $LogFile -ErrorAction Stop + } + Catch [System.Exception] { + Write-Warning -Message "Unable to add log entry to $LogFile.log file. Error message at line $($_.InvocationInfo.ScriptLineNumber): $($_.Exception.Message)" + } + } + + #Function to Remove AppxProvisionedPackage + Function Remove-AppxProvisionedPackageCustom { + + # Attempt to remove AppxProvisioningPackage + if (!([string]::IsNullOrEmpty($BlackListedApp))) { + try { + + # Get Package Name + $AppProvisioningPackageName = Get-AppxProvisionedPackage -Online | Where-Object { $_.DisplayName -like $BlackListedApp } | Select-Object -ExpandProperty PackageName -First 1 + Write-Host "$($BlackListedApp) found. Attempting removal ... " -NoNewline + Write-LogEntry -Value "$($BlackListedApp) found. Attempting removal ... " + + # Attempt removeal + $RemoveAppx = Remove-AppxProvisionedPackage -PackageName $AppProvisioningPackageName -Online -AllUsers + + #Re-check existence + $AppProvisioningPackageNameReCheck = Get-AppxProvisionedPackage -Online | Where-Object { $_.DisplayName -like $BlackListedApp } | Select-Object -ExpandProperty PackageName -First 1 + + If ([string]::IsNullOrEmpty($AppProvisioningPackageNameReCheck) -and ($RemoveAppx.Online -eq $true)) { + Write-Host @CheckIcon + Write-Host " (Removed)" + Write-LogEntry -Value "$($BlackListedApp) removed" + } + } + catch [System.Exception] { + Write-Host " (Failed)" + Write-LogEntry -Value "Failed to remove $($BlackListedApp)" + } + } + } + + Write-LogEntry -Value "##################################" + Write-LogEntry -Stamp -Value "Remove-Appx Started" + Write-LogEntry -Value "##################################" + + #OS Check + $OS = (Get-CimInstance -ClassName Win32_OperatingSystem).BuildNumber + Switch -Wildcard ( $OS ) { + '21*' { + $OSVer = "Windows 10" + Write-Warning "This script is intended for use on Windows 11 devices. $($OSVer) was detected..." + Write-LogEntry -Value "This script is intended for use on Windows 11 devices. $($OSVer) was detected..." + Exit 1 + } + } + # Black List of Appx Provisioned Packages to Remove for All Users + $BlackListedApps = $null + $BlackListedApps = New-Object -TypeName System.Collections.ArrayList + $BlackListedApps.AddRange(@( + "Microsoft.BingNews", + "Microsoft.GamingApp", + "Microsoft.MicrosoftSolitaireCollection", + "Microsoft.WindowsCommunicationsApps", + "Microsoft.WindowsFeedbackHub", + "Microsoft.XboxGameOverlay", + "Microsoft.XboxGamingOverlay", + "Microsoft.XboxIdentityProvider", + "Microsoft.XboxSpeechToTextOverlay", + "Microsoft.YourPhone", + "Microsoft.ZuneMusic", + "Microsoft.ZuneVideo", + "MicrosoftTeams" + )) + + #Define Icons + $CheckIcon = @{ + Object = [Char]8730 + ForegroundColor = 'Green' + NoNewLine = $true + } + + #Define App Count + [int]$AppCount = 0 + +} + +Process { + + If ($($BlackListedApps.Count) -ne 0) { + + Write-Output `n"The following $($BlackListedApps.Count) apps were targeted for removal from the device:-" + Write-LogEntry -Value "The following $($BlackListedApps.Count) apps were targeted for removal from the device:-" + Write-LogEntry -Value "Apps marked for removal:$($BlackListedApps)" + Write-Output "" + $BlackListedApps + + #Initialize list for apps not targeted + $AppNotTargetedList = New-Object -TypeName System.Collections.ArrayList + + # Get Appx Provisioned Packages + Write-Output `n"Gathering installed Appx Provisioned Packages..." + Write-LogEntry -Value "Gathering installed Appx Provisioned Packages..." + Write-Output "" + $AppArray = Get-AppxProvisionedPackage -Online | Select-Object -ExpandProperty DisplayName + + # Loop through each Provisioned Package + foreach ($BlackListedApp in $BlackListedApps) { + + # Function call to Remove Appx Provisioned Packages defined in the Black List + if (($BlackListedApp -in $AppArray)) { + $AppCount ++ + Try { + Remove-AppxProvisionedPackageCustom -BlackListedApp $BlackListedApp + } + Catch { + Write-Warning `n"There was an error while attempting to remove $($BlakListedApp)" + Write-LogEntry -Value "There was an error when attempting to remove $($BlakListedApp)" + } + } + else { + $AppNotTargetedList.AddRange(@($BlackListedApp)) + } + } + + #Update Output Information + If (!([string]::IsNullOrEmpty($AppNotTargetedList))) { + Write-Output `n"The following apps were not removed. Either they were already removed or the Package Name is invalid:-" + Write-LogEntry -Value "The following apps were not removed. Either they were already removed or the Package Name is invalid:-" + Write-LogEntry -Value "$($AppNotTargetedList)" + Write-Output "" + $AppNotTargetedList + } + If ($AppCount -eq 0) { + Write-Output `n"No apps were removed. Most likely reason is they had been removed previously." + Write-LogEntry -Value "No apps were removed. Most likely reason is they had been removed previously." + } + } + else { + Write-Output "No Black List Apps defined in array" + Write-LogEntry -Value "No Black List Apps defined in array" + } +} \ No newline at end of file