Add Remove-WindowsStoreAppsLocalScript.ps1

This commit is contained in:
2025-09-11 09:00:40 +00:00
commit 3f75ba3b24

View File

@ -0,0 +1,82 @@
[CmdletBinding(SupportsShouldProcess = $true)]
param(
# Packages to remove completely (per-user and provisioned)
[string[]] $Packages = @(
"Microsoft.Print3D",
"Microsoft.Microsoft3DViewer",
"Microsoft.WebMediaExtensions",
"Microsoft.VP9VideoExtensions",
"Microsoft.MSPaint",
"Microsoft.Winget.Source",
"Microsoft.HEIFImageExtension",
"MSTeams" # Microsoft Teams (AppX version from WindowsApps)
)
)
function Test-Admin {
$currentUser = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = New-Object Security.Principal.WindowsPrincipal($currentUser)
return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}
if (-not (Test-Admin)) {
Write-Error "This script must be run in an elevated PowerShell session (Run as Administrator)."
exit 1
}
Write-Verbose "Starting removal of Appx packages for all users and deprovisioning from the OS image..."
foreach ($name in $Packages) {
Write-Verbose "Processing package name: '$name'"
# 1) Remove per-user installs for ALL users
try {
$apps = Get-AppxPackage -AllUsers -Name $name -ErrorAction SilentlyContinue
if ($apps) {
foreach ($app in $apps) {
if ($PSCmdlet.ShouldProcess("$($app.PackageFullName)", "Remove-AppxPackage (per-user/all users)")) {
try {
Remove-AppxPackage -Package $app.PackageFullName -AllUsers -ErrorAction Stop
Write-Host "Removed per-user package: $($app.PackageFullName)"
} catch {
try {
Remove-AppxPackage -Package $app.PackageFullName -ErrorAction Stop
Write-Host "Removed package in current context: $($app.PackageFullName)"
} catch {
Write-Warning "Failed to remove per-user package $($app.PackageFullName): $($_.Exception.Message)"
}
}
}
}
} else {
Write-Verbose "No per-user installs found for '$name'."
}
} catch {
Write-Warning "Error enumerating per-user installs for '$name': $($_.Exception.Message)"
}
# 2) Deprovision from the image so NEW users don't get it
try {
$provMatches = Get-AppxProvisionedPackage -Online |
Where-Object { $_.DisplayName -eq $name }
if ($provMatches) {
foreach ($prov in $provMatches) {
if ($PSCmdlet.ShouldProcess("$($prov.PackageName)", "Remove-AppxProvisionedPackage -Online -AllUsers")) {
try {
Remove-AppxProvisionedPackage -Online -PackageName $prov.PackageName -AllUsers | Out-Null
Write-Host "Deprovisioned: $($prov.DisplayName) | $($prov.PackageName)"
} catch {
Write-Warning "Failed to deprovision $($prov.PackageName): $($_.Exception.Message)"
}
}
}
} else {
Write-Verbose "No provisioned package found for '$name'."
}
} catch {
Write-Warning "Error enumerating provisioned packages for '$name': $($_.Exception.Message)"
}
}
Write-Host "Done. A reboot is recommended to ensure all removals complete and shell caches refresh."