#requires -version 5.1
<#
.SYNOPSIS
XBS Windows 11 Debloat Script
.DESCRIPTION
Entfernt ausgewählte, nicht benötigte vorinstallierte Windows-Apps
von Windows 11.
Das Skript arbeitet auf zwei Ebenen:
1. Bereits installierte Appx-Pakete
2. Provisionierte Appx-Pakete für zukünftige Benutzer
Systemkritische bzw. als NonRemovable gekennzeichnete Pakete
werden automatisch übersprungen.
Das Skript ist für den Einsatz auf Kunden-PCs und über RMM
vorgesehen.
.NOTES
Name: XBS Windows 11 Debloat Script
Version: 1.4
Author: XBS GmbH
Website: https://www.xbs.ch/
Datum: 02.09.2026
Voraussetzung:
Windows PowerShell 5.1
Administratorrechte
.EXITCODES
0 = Erfolgreich
1 = Allgemeiner Fehler
2 = Keine Administratorrechte
3 = Kein Windows 11
4 = Fehler bei einer oder mehreren Apps
#>
# ============================================================
# KONFIGURATION
# ============================================================
$Config = @{
# --------------------------------------------------------
# DryRun
#
# TRUE = nur anzeigen, nichts entfernen
# FALSE = tatsächlich entfernen
# --------------------------------------------------------
DryRun = $false
# --------------------------------------------------------
# Neustart nach Abschluss
#
# Das Skript führt standardmässig KEINEN Neustart durch.
# --------------------------------------------------------
RestartComputer = $false
# --------------------------------------------------------
# Logging
# --------------------------------------------------------
LogDirectory = "$env:ProgramData\XBS\Windows11Debloat"
# --------------------------------------------------------
# Consumer-Funktionen deaktivieren
#
# Diese Einstellungen sind bewusst getrennt von der
# App-Entfernung.
# --------------------------------------------------------
DisableConsumerFeatures = $true
# --------------------------------------------------------
# Entfernen provisionierter Apps
# --------------------------------------------------------
RemoveProvisionedPackages = $true
# --------------------------------------------------------
# Bereits installierte Apps entfernen
# --------------------------------------------------------
RemoveInstalledPackages = $true
}
# ============================================================
# APP-LISTE
# ============================================================
#
# Diese Liste enthält bewusst nur Apps, die auf einem typischen
# Business-PC nicht zwingend benötigt werden.
#
# NICHT enthalten:
#
# Microsoft Store
# Calculator
# Photos
# Camera
# Notepad
# Paint
# Terminal
# App Installer
# Windows Security
# VCLibs
# UI.Xaml
#
# ============================================================
$AppsToRemove = @(
# --------------------------------------------------------
# Microsoft Consumer Apps
# --------------------------------------------------------
"Microsoft.BingNews"
"Microsoft.BingWeather"
"Microsoft.GetHelp"
"Microsoft.Getstarted"
"Microsoft.MicrosoftOfficeHub"
"Microsoft.MicrosoftSolitaireCollection"
"Microsoft.People"
"Microsoft.WindowsAlarms"
"Microsoft.WindowsFeedbackHub"
"Microsoft.WindowsMaps"
"Microsoft.WindowsSoundRecorder"
"Microsoft.YourPhone"
# --------------------------------------------------------
# Xbox / Gaming
# --------------------------------------------------------
"Microsoft.GamingApp"
"Microsoft.Xbox.TCUI"
"Microsoft.XboxApp"
"Microsoft.XboxGamingOverlay"
"Microsoft.XboxSpeechToTextOverlay"
"Microsoft.GamingServices"
# --------------------------------------------------------
# Media / Entertainment
# --------------------------------------------------------
"Microsoft.ZuneMusic"
"Microsoft.ZuneVideo"
# --------------------------------------------------------
# Microsoft 365 Consumer
# --------------------------------------------------------
"Microsoft.MicrosoftOfficeHub"
# --------------------------------------------------------
# Drittanbieter / Consumer
# --------------------------------------------------------
"SpotifyAB.SpotifyMusic"
"Facebook.Facebook"
"Netflix"
"Disney"
"TikTok"
"Amazon"
"Dropbox"
"Twitter"
"LinkedIn"
)
# ============================================================
# LOGGING VORBEREITEN
# ============================================================
try {
if (-not (Test-Path $Config.LogDirectory)) {
New-Item `
-Path $Config.LogDirectory `
-ItemType Directory `
-Force `
-ErrorAction Stop |
Out-Null
}
}
catch {
Write-Error "Log-Verzeichnis konnte nicht erstellt werden."
exit 1
}
$TimeStamp = Get-Date -Format "yyyyMMdd-HHmmss"
$LogFile = Join-Path `
$Config.LogDirectory `
"XBS-Windows11-Debloat-$TimeStamp.log"
# ============================================================
# LOG-FUNKTION
# ============================================================
function Write-XBSLog {
param (
[Parameter(Mandatory = $true)]
[string]$Message,
[ValidateSet(
"INFO",
"SUCCESS",
"WARNING",
"ERROR",
"ACTION"
)]
[string]$Level = "INFO"
)
$Date = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$Line = "[$Date] [$Level] $Message"
Add-Content `
-Path $LogFile `
-Value $Line `
-Encoding UTF8
switch ($Level) {
"SUCCESS" {
Write-Host $Line -ForegroundColor Green
}
"WARNING" {
Write-Host $Line -ForegroundColor Yellow
}
"ERROR" {
Write-Host $Line -ForegroundColor Red
}
"ACTION" {
Write-Host $Line -ForegroundColor Cyan
}
default {
Write-Host $Line
}
}
}
# ============================================================
# START
# ============================================================
Write-XBSLog `
"============================================================"
Write-XBSLog `
"XBS Windows 11 Debloat Script gestartet"
Write-XBSLog `
"Version: 1.0"
Write-XBSLog `
"Computer: $env:COMPUTERNAME"
Write-XBSLog `
"Benutzer: $env:USERNAME"
Write-XBSLog `
"DryRun: $($Config.DryRun)"
Write-XBSLog `
"============================================================"
# ============================================================
# ADMINISTRATOR PRÜFEN
# ============================================================
$CurrentIdentity = `
[Security.Principal.WindowsIdentity]::GetCurrent()
$Principal = `
New-Object Security.Principal.WindowsPrincipal($CurrentIdentity)
if (
-not $Principal.IsInRole(
[Security.Principal.WindowsBuiltInRole]::Administrator
)
) {
Write-XBSLog `
"Das Skript wurde nicht als Administrator gestartet." `
"ERROR"
exit 2
}
Write-XBSLog `
"Administratorrechte vorhanden." `
"SUCCESS"
# ============================================================
# WINDOWS-VERSION PRÜFEN
# ============================================================
$OperatingSystem = Get-CimInstance `
Win32_OperatingSystem
Write-XBSLog `
"Betriebssystem: $($OperatingSystem.Caption)"
Write-XBSLog `
"Build: $($OperatingSystem.BuildNumber)"
if (
$OperatingSystem.Caption -notlike "*Windows 11*"
) {
Write-XBSLog `
"Das System ist kein Windows 11. Skript wird beendet." `
"ERROR"
exit 3
}
Write-XBSLog `
"Windows 11 erkannt." `
"SUCCESS"
# ============================================================
# POWERSHELL VERSION
# ============================================================
Write-XBSLog `
"PowerShell Version: $($PSVersionTable.PSVersion)"
if (
$PSVersionTable.PSVersion.Major -lt 5
) {
Write-XBSLog `
"PowerShell 5.1 oder neuer erforderlich." `
"ERROR"
exit 1
}
# ============================================================
# ZÄHLER
# ============================================================
$RemovedCount = 0
$SkippedCount = 0
$NotFoundCount = 0
$ErrorCount = 0
# ============================================================
# INSTALLIERTE APP ENTFERNEN
# ============================================================
function Remove-XBSInstalledApp {
param (
[Parameter(Mandatory = $true)]
[string]$AppName
)
Write-XBSLog `
"Suche installierte App: $AppName"
try {
$Packages = Get-AppxPackage `
-AllUsers `
-Name $AppName `
-ErrorAction SilentlyContinue
}
catch {
Write-XBSLog `
"Fehler beim Suchen von $AppName : $($_.Exception.Message)" `
"ERROR"
$script:ErrorCount++
return
}
if (-not $Packages) {
Write-XBSLog `
"$AppName ist nicht installiert." `
"INFO"
$script:NotFoundCount++
return
}
foreach ($Package in $Packages) {
Write-XBSLog `
"Gefunden: $($Package.Name) $($Package.Version)"
# ----------------------------------------------------
# NonRemovable prüfen
# ----------------------------------------------------
if ($Package.NonRemovable -eq $true) {
Write-XBSLog `
"$($Package.Name) ist als NonRemovable gekennzeichnet. Übersprungen." `
"WARNING"
$script:SkippedCount++
continue
}
# ----------------------------------------------------
# DryRun
# ----------------------------------------------------
if ($Config.DryRun) {
Write-XBSLog `
"DRY-RUN: Würde $($Package.PackageFullName) entfernen." `
"ACTION"
continue
}
# ----------------------------------------------------
# Entfernen
# ----------------------------------------------------
try {
Write-XBSLog `
"Entferne $($Package.PackageFullName) ..." `
"ACTION"
Remove-AppxPackage `
-Package $Package.PackageFullName `
-AllUsers `
-ErrorAction Stop
Write-XBSLog `
"$($Package.Name) erfolgreich entfernt." `
"SUCCESS"
$script:RemovedCount++
}
catch {
Write-XBSLog `
"Fehler beim Entfernen von $($Package.Name): $($_.Exception.Message)" `
"ERROR"
$script:ErrorCount++
}
}
}
# ============================================================
# PROVISIONIERTE APP ENTFERNEN
# ============================================================
function Remove-XBSProvisionedApp {
param (
[Parameter(Mandatory = $true)]
[string]$AppName
)
Write-XBSLog `
"Prüfe Provisionierung: $AppName"
try {
$ProvisionedPackages =
Get-AppxProvisionedPackage -Online |
Where-Object {
$_.DisplayName -like $AppName
}
}
catch {
Write-XBSLog `
"Fehler beim Lesen der Provisionierung: $($_.Exception.Message)" `
"ERROR"
$script:ErrorCount++
return
}
if (-not $ProvisionedPackages) {
Write-XBSLog `
"Keine Provisionierung für $AppName gefunden."
return
}
foreach ($ProvisionedPackage in $ProvisionedPackages) {
Write-XBSLog `
"Provisioniertes Paket gefunden: $($ProvisionedPackage.PackageName)"
if ($Config.DryRun) {
Write-XBSLog `
"DRY-RUN: Würde Provisionierung entfernen." `
"ACTION"
continue
}
try {
Remove-AppxProvisionedPackage `
-Online `
-PackageName $ProvisionedPackage.PackageName `
-ErrorAction Stop |
Out-Null
Write-XBSLog `
"Provisionierung erfolgreich entfernt." `
"SUCCESS"
}
catch {
Write-XBSLog `
"Fehler beim Entfernen der Provisionierung: $($_.Exception.Message)" `
"ERROR"
$script:ErrorCount++
}
}
}
# ============================================================
# APP-BEARBEITUNG
# ============================================================
Write-XBSLog ""
Write-XBSLog `
"============================================================"
Write-XBSLog `
"APP-ENTFERNUNG"
Write-XBSLog `
"============================================================"
foreach ($App in $AppsToRemove) {
Write-XBSLog ""
Write-XBSLog `
"------------------------------------------------------------"
Write-XBSLog `
"Bearbeite: $App"
Write-XBSLog `
"------------------------------------------------------------"
# --------------------------------------------------------
# Installierte Pakete
# --------------------------------------------------------
if ($Config.RemoveInstalledPackages) {
Remove-XBSInstalledApp `
-AppName $App
}
# --------------------------------------------------------
# Provisionierte Pakete
# --------------------------------------------------------
if ($Config.RemoveProvisionedPackages) {
Remove-XBSProvisionedApp `
-AppName $App
}
}
# ============================================================
# CONSUMER FEATURES
# ============================================================
if ($Config.DisableConsumerFeatures) {
Write-XBSLog ""
Write-XBSLog `
"============================================================"
Write-XBSLog `
"WINDOWS CONSUMER FEATURES"
Write-XBSLog `
"============================================================"
if ($Config.DryRun) {
Write-XBSLog `
"DRY-RUN: Consumer Features würden deaktiviert." `
"ACTION"
}
else {
try {
$CloudContentPath =
"HKLM:\SOFTWARE\Policies\Microsoft\Windows\CloudContent"
if (-not (Test-Path $CloudContentPath)) {
New-Item `
-Path $CloudContentPath `
-Force |
Out-Null
}
New-ItemProperty `
-Path $CloudContentPath `
-Name "DisableWindowsConsumerFeatures" `
-PropertyType DWord `
-Value 1 `
-Force |
Out-Null
Write-XBSLog `
"Windows Consumer Features deaktiviert." `
"SUCCESS"
}
catch {
Write-XBSLog `
"Consumer Features konnten nicht deaktiviert werden: $($_.Exception.Message)" `
"ERROR"
$ErrorCount++
}
}
}
# ============================================================
# ZUSAMMENFASSUNG
# ============================================================
Write-XBSLog ""
Write-XBSLog `
"============================================================"
Write-XBSLog `
"ZUSAMMENFASSUNG"
Write-XBSLog `
"============================================================"
Write-XBSLog `
"Entfernt: $RemovedCount"
Write-XBSLog `
"Übersprungen: $SkippedCount"
Write-XBSLog `
"Nicht gefunden: $NotFoundCount"
Write-XBSLog `
"Fehler: $ErrorCount"
Write-XBSLog `
"Logdatei: $LogFile"
# ============================================================
# ERGEBNIS
# ============================================================
if ($ErrorCount -gt 0) {
Write-XBSLog ""
Write-XBSLog `
"Das Skript wurde mit Fehlern abgeschlossen." `
"WARNING"
$ExitCode = 4
}
else {
Write-XBSLog ""
Write-XBSLog `
"XBS Windows 11 Debloat erfolgreich abgeschlossen." `
"SUCCESS"
$ExitCode = 0
}
# ============================================================
# NEUSTART
# ============================================================
if ($Config.RestartComputer) {
if ($Config.DryRun) {
Write-XBSLog `
"DRY-RUN: Computer würde neu gestartet."
}
else {
Write-XBSLog `
"Computer wird neu gestartet..." `
"WARNING"
Start-Sleep -Seconds 5
Restart-Computer -Force
}
}
# ============================================================
# ENDE
# ============================================================
Write-XBSLog ""
Write-XBSLog `
"XBS Windows 11 Debloat Script beendet."
exit $ExitCode












