Komplettes Skript um den Microsoft Store und alle Standard APPs zu deinstallieren (Win11)

Windows Powershell Skript
				
					#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
				
			

Teilen auf:

Facebook
Twitter
Pinterest
LinkedIn
Picture of Benjamin M. Tanner

Benjamin M. Tanner

Wirtschaftsinformatiker

Passend zum Thema...