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...

lenovo-laptop-ideapad-3-15-intel-hero

Richtige Pflege und Wartung von Notebooks

Der Alltag meint es nicht gut mit Notebooks. Die elektronischen Helferlein sind immer mit dabei und müssen sich tagtäglich gegen Brotkrümel, Kaffeespritzer und lange Fingernägel