Microsoft stellt seit einiger Zeit offizielle ISO-Abbilder von Windows 10/11 bereit. Spannend sind die Möglichkeiten, welche bei proprietärer Software verbleiben, um das Abbild verändern zu können. Den besten Grund dazu hat Microsoft selbst geliefert: Blotware. Windows wird mit immer mehr Dingen zugemüllt, die es unnötig aufblähen – die Größe einer DVD hat es längst überschritten.
Während das bei heutigen USB-Sticks und externen SSDs kein Problem mehr ist, stört nicht nur die Verschwendung mit einer potenziell größeren Angriffsfläche. Teile der Bloatware nervt zudem, etwa im Startmenü. Dieser Beitrag zeigt die Grundlagen dafür, um Windows Installationsmedien anpassen zu können.
Das brauchst du
Neben einem Installationsabbild (ISO Datei) der jeweiligen Windows-Version benötigst du zudem eine laufende Windows-Installation. Abbilder können seit Windows 10 von Microsoft heruntergeladen werden.12 Es kommen mehrere hauseigene Werkzeuge von Microsoft zum Einsatz, die unter GNU/Linux oder anderen Betriebssystemen nicht laufen. Eine VM reicht völlig aus. Allerdings solltest du hier beim Testen nicht vergessen, sie nach dem Neu-Erstellen einer ISO aus- und wieder einzuschalten.
Darüber hinaus ist das Windows Assessment and Deployment Kit (Windows ADK) nötig.3 Zwar befinden sich die meisten Module im DISM-Paket und sind damit vorinstalliert. Um am Ende nach unseren Anpassungen eine neue ISO-Datei zu erstellen, müssen wir jedoch das ADK installieren. Es enthält hierfür das Werkzeug oscdimg
. Achtung: Es existieren verschiedene ADK-Versionen für unterschiedliche Windows-Editionen!
Hardwareseitig solltest du auf dem Arbeitssystem zur Durchführung der Anpassungen genügend freien Speicherplatz besitzen: Grob überschlagen wird mindestens die 3,5 fache Größe des ISO Abbilds benötigt, siehe den folgenden Abschnitt für die Hintergründe. An vielen Stellen unterstützt Microsoft übrigens keine Netzlaufwerke. Lediglich das neu erstellte Abbild erlaubt der Konzern auf externe Laufwerke zu schreiben. Ich habe die VM daher großzügig mit 100 GB Plattenspeicher ausgestattet.
Was du zum Aufbau einer Windows-ISO wissen solltest
Bei ISO-Dateien handelt es sich um Abbilder einer CD oder DVD. Die Zeiten physischer Scheiben sind zwar vorbei. Doch ISO-Abbilder sind geblieben, um stattdessen auf USB-Sticks und anderen Medien alle notwendigen Dateien (über 900 bei Windows 10 22H2) in einem Container zu bündeln. Durch die Entstehung als 1:1 Kopie lassen sich Abbilder – im Gegensatz zu Archiven – nicht nachträglich verändern. Nach dem Einhängen der ISO-Datei muss daher zuerst deren Inhalt in ein temporäres Verzeichnis auf der lokalen Festplatte kopiert werden. Damit liegen wir schon bei über 12 GB.
In diesem Abbild liegen wiederum weitere Abbilder von Windows, wofür Microsoft das WIM-Format (Windows Image Format) verwendet.4 Seit Windows Vista kopiert der Installations-Assistent hauptsächlich eines dieser Abbilder auf das lokale System, sie liegen in sources\install.wim
. Mit ca. 5 GB ist es die größte Datei, das Archivprogramm 7-Zip kann sie lesend öffnen.
Die Nummern stehen für verschiedene Editionen von Windows: 1 entspricht Windows 10 Home, 2 die gleichnamige N-Edition – jede Edition existiert mit und ohne N. Es folgen Education (3 & 4), Pro (5 & 6) sowie weitere. Bei Windows 10 22H2 sind es insgesamt 10 Stück. Jeder der Ordner enthält die bekannte Verzeichnisstruktur einer abgeschlossenen Windows-Installation. Für Anpassungen ist es erforderlich, den jeweiligen Index anzugeben. Die Änderungen gelten somit nur für die jeweilige Edition, etwa Windows 10/11 Pro.
Wer die Installations-Umgebung anpassen möchte, wird in sources\boot.wim
fündig. Sie ist deutlich kleiner, da es sich um ein abgespecktes Windows PE handelt. Mehrere Editionen gibt es davon nicht, hier ist immer Index 2 zu verwenden.
Einhängen: Wie lassen sich diese Abbilder anpassen?
Ein WIM-Abbild lässt sich zum Schreiben öffnen. Dafür muss man dessen Inhalt an einen frei wählbaren, leeren Ordner einhängen. Das Konzept erinnert stark an GNU/Linux, wobei es dort systemweit angewendet wird, sodass Laufwerksbuchstaben entfallen können. Bei Windows hingegen können keine Partitionen an beliebiger Stelle eingehängt werden – das ist auf WIM-Dateien beschränkt.
Sie lassen sich mit DISM und den dazugehörigen PowerShell Cmd-Lets einhängen. Das DISM-Syntax ist am gruseligsten, daher verwende ich lieber die PS. Grundsätzlich ist der Einhängepfad zwar frei wählbar. Da wir jedoch an verschiedenen Stellen Änderungen vornehmen, empfehle ich ein Arbeitsverzeichnis zu erstellen. Darin legt ihr das vanilla Windows ISO Abbild ab und wechselt in der PS dort hinein. Ein paar Variablen machen das Arbeiten damit zudem weniger schmerzhaft:
mkdir ul_win-iso
cd ul_win-iso
$cwd = (Get-Item -Path ".\" -Verbose).FullName
$iso = $cwd + "\Win10_22H2_German_x64v1.iso"
$mount = "$cwd\iso_mount"
mkdir $mount
Da die Windows-Werkzeuge an einigen Stellen nur absolute Pfade akzeptieren, was schnell zu Unübersichtlichkeit und nervigem C&P führt, enthält $cwd
den absoluten Pfad zu unserem Arbeitsverzeichnis, in dem wir uns befinden. $iso
ist unser Vanilla-Abbild und $mount
bekommt eine (scheibbare) Kopie des ISO-Inhalts. Dafür muss zuvor die ISO-Datei (lesend) eingehängt werden. Windows sucht automatisch nach einem freien Laufwerksbuchstaben, den wir uns in $drive
merken.
$isoMount = mount-diskimage $iso -PassThru
$drive = ($isoMount | get-volume).DriveLetter
xcopy /E /I /H /R /Y /J ${drive}: $mount
Unabhängig davon, ob wir die Installationsumgebung (boot.wim
) oder das später installierte Windows (install.vim
) anpassen möchten – in jedem Falle benötigen wir dafür einen weiteren, leeren Ordner.
Beispiel 1: Wir entmüllen die vorinstallierten Apps
In diesem Beispiel hänge ich das zu installiere Windows 10 Pro (Index 5) Installationsabbild ein.
$installWim = "$cwd\install.wim_mount"
mkdir $installWim
Mount-WindowsImage -ImagePath $mount\sources\install.wim -Index 5 -Path $installWim
Mit DISM und dem Pfad zum Abbild als Präfix können wir Befehle im Kontext dieses Abbilds ausführen, statt des bereits laufenden Windows. Beispielsweise liefert folgender Aufruf eine Liste aller MS Store Anwendungen:
dism /image:$installWim /Get-ProvisionedAppxPackages
Lesbarer wird es, wenn wir uns die Paketnamen aus der Ausgabe heraus filtern:
dism /image:$installWim /Get-ProvisionedAppxPackages | Select-String -Pattern 'PackageName: (.+)$' | % {"$($_.matches.groups[1])"}
Interessant, was dort alles vorinstalliert ist. Alleine zu Xbox finden sich 6 Pakete, die nur für Nutzer des Dienstes relevant sind. Der große Rest schleppt sie als Bloatware im Betriebssystem mit sich herum. Man könnte diese nun von Hand entfernen, wofür wir ein interessantes PS-Syntax verwenden müssen. Allerdings ist das mühsam und wir müssten dies für jede neue Windows-Version wiederholen.
dism /image:$installWim /Remove-ProvisionedAppxPackage /PackageName:Microsoft.Xbox.TCUI_1.23.28002.0_neutral_~_8wekyb3d8bbwe
Besser: Wir filtern die Liste auf die gewünschten Namen (z.B. Alles von Xbox, Bing Wetter, MS Office usw) und holen uns die exakten Versionen aus dem Abbild. Diese leiten wir an Remove-ProvisionedAppxPackage weiter.
$existingAppx=(dism /image:$installWim /Get-ProvisionedAppxPackages | Select-String -Pattern 'PackageName: (.+)$' | % {"$($_.matches.groups[1])"})
$existingAppx | Select-String -Pattern '(Xbox|BingWeather|MicrosoftOfficeHub|WindowsMaps|Office\.OneNote|SkypeApp|ZuneMusic|MixedReality|CommunicationsApp)' | % { write-host "Entferne $_"; dism /image:$installWim /Remove-ProvisionedAppxPackage /PackageName:$_ }
So darfst du Änderungen an Dateienvornehmen
Abseits der offiziellen Windows-Funktionen möchtest du möglicherweise etwas verändern oder entfernen. Das ist vor allem fürs Modden interessant, was bei proprietärer Software wie MS Windows jedoch nur eingeschränkt durch Reverse Engineering möglich ist. Ein relativ einfaches Beispiel besteht darin, den trostlosen Hintergrund im Installations-Assistenten auszutauschen. Der liegt direkt im Dateisystem, sodass man dieses Bild austauschen kann. Windows\System32\setup.bmp
lautet der Pfad zum dauerhaft angezeigten. Soweit die Theorie, in der Praxis fehlen jedoch die Rechte dafür.
Zunächst lege ich mir einen neuen Unterordner im Arbeitsverzeichnis an, in den boot.wim
gemountet wird:
$bootWim = "$cwd\boot.wim_mount"
mkdir $bootWim
Mount-WindowsImage -ImagePath $mount\sources\boot.wim -Index 2 -Path $bootWim
Möchtet ihr dort Dateien ersetzen (z.B. die erwähnte setup.bmp
), gelingt dies selbst mit Administrator-Rechten nicht. Das liegt daran, dass in den ACLs selbst lokale Administratoren lediglich lesen und ausführen dürfen:
Um dort auch schreiben zu können, übertragen wir uns die Eigentümerschaft mit takeown
(vergleichbar mit chown
unter GNU/Linux) und gewähren dem angemeldeten Benutzer durch icacls
volle Rechte.
takeown /f $bootWim\Windows\System32\setup.bmp
icacls $bootWim\Windows\System32\setup.bmp /grant ${Env:UserName}:F
Nun können wir diese verändern. Aber Vorsicht: Das Windows Setup reagiert allergisch auf gelöschte & neu angelegte Dateien. In meinen Tests hat das dazu geführt, dass der Assistent zwar das Bild kurz anzeigte, dann jedoch abstürzte. Stabil funktionierte es nur, wenn man die neue Datei in einem anderen Ordner umbenannt (hier in setup.bmp
) und anschließend im System32
Ordner ersetzt.
Änderungen speichern und eine neue ISO erstellen
Nachdem du mit den Anpassungen fertig bist, schließe sämtliche Programme, die auf Dateien aus den Abbildern zugreifen. Erst durch das Aushängen werden die Änderungen in die Quelldatei geschrieben. Ist das nicht gewünscht, ersetzt du -save
durch -discard
. Der Pfad ist entsprechend auf den Einhängepfad anzupassen. Falls du mehrere eingehängt hast, muss dies für jedes wiederholt werden.
Dismount-WindowsImage -path $bootWim -save
Nun liegen unsere Änderungen allerdings noch nicht im ISO. Sondern lediglich in deren lokaler Kopie, die wir zwecks Schreibrechten erstellt haben. Auf dessen Basis müssen wir daher ein neues ISO erstellen – hier kommt das ADK zum Einsatz. Microsoft macht euch damit das Leben jedoch schwer: Es wird in einem Pfad voller Leer- und Sonderzeichen (!) installiert. Zu allem Überfluss kann die Konsole in Windows bis heute nicht vernünftig damit umgehen (!!), sodass als Workaround ein & vor den Befehl gesetzt werden müsste. Der ist aber nicht ohne Seiteneffekte (!!!), sondern verhindert die Substitution von Variablen – welche ich als Workaround einsetze, um mit den erzwungenen absoluten Pfaden nicht wahnsinnig zu werden. Um aus dieser Katastrophe halbwegs mit blauem Auge raus zu kommen, habe ich einen weiteren Workaround gefunden: Ein Alias. Damit können wir das Werkzeug fast schon vernünftig verwenden.
Set-Alias -Name oscdimg -Value 'C:\Program Files (x86)\Windows Kits\10\Assessment and Deployment Kit\Deployment Tools\amd64\Oscdimg\OSCDIMG.exe'
oscdimg -lWin10_22H2_Ger_x64v1_custom -m -u2 "-b${mount}\boot\etfsboot.com" "$mount" "${cwd}\win10-22h2_custom.iso"
OSCDIMG erstellt uns ein neues ISO-Abbild.5 Es hat ebenfalls tolle Eigenheiten: Die Parameter werden nicht mit /
übergeben, wie es Microsofts kuriose Eigenart ist. Sondern mit einem Minus, was eher der Unix-Welt entspricht. Dort ist allerdings ein Leerzeichen danach üblich, damit kann OSCDIMG nicht umgehen. Wer z.B. -l Test123 übergibt, wird einen Fehler erhalten, weil dies als leer erkannt wird… das macht den Aufruf wenig übersichtlich, schauen wir uns daher die Parameter an:
-l
steht für Label – die Bezeichnung wird z.B. im Dateiexplorer angezeigt. Ist nicht zwingend notwendig, ich finde es jedoch sinnvoll. Leider auf 32 Zeichen Begrenzt. Zumindest kann man kenntlich machen, dass es sich um ein angepasstes Abbild handelt.-m
erlaubt Abbilddateien, die über 700 MB (CDs) hinaus gehen. Eine andere Wahl bleibt uns nicht, Windows ist heutzutage sehr kräftig gebaut…-
-u2
steht für das UDF-Format von DVDs. - –
b
übergibt den Pfad zum Boot-Abbild, d.H. dieboot.wim
Datei. - Es folgt der Pfad zur komplett extrahierten Kopie des Installationsmedium (
$mount
) und zum Schluss die ISO-Datei zur Ausgabe.
Test
Die Ausgabedatei enthält nun das originale Installations-Abbild von Microsoft inklusive unserer Anpassungen und kann genau so verwendet werden: Zum Beispiel mit Ventoy auf einen Multi-Boot Stick ablegen, um davon zu booten. Oder als Startmedium in einer VM hinterlegen, letzteres dürfte für Tests der einfachere Weg sein. In meinem Beispiel ist ein Installations-Assistent mit Linux-Pinguin als Hintergrund entstanden:
In dieser Installation habe ich auch die Xbox-Pakete entfernt, wie im vorherigen Beispiel demonstriert. Im Startmenü werden daher keine Anwendungen zur Xbox angezeigt:
Weiteres Vorgehen
Weitere Anpassungen sind möglich: Beispielsweise lässt sich die Registry aus dem Abbild laden und anpassen. Auch Systemkomponenten, die nicht über den App-Store bereitgestellt werden, könnt ihr aus dem System verbannen. Dazu zählen Funktionen wie die Handschrift-erkennung, Text zu Sprache, Schrittaufzeichnung und weitere, die viele wohl gar nicht verwenden.
dism /image:$installWim /Get-Packages | Select-String -Pattern "~" | ForEach-Object -Process {$_.ToString().Split(':')[1].Trim()}
Wie bei den Appx-Paketen auch, enthalten diese Pakete detaillierte Versionsinfos und man kann diese auf unerwünschte Filtern. Für eine übersichtliche Ausgabe lässt sich die Ausgabe des Remove-Package Befehls nach $null
umleiten – dies ist vergleichbar mit /dev/null von GNU/Linux.
$packages = (dism /image:$installWim /Get-Packages | Select-String -Pattern "~" | ForEach-Object -Process {$_.ToString().Split(':')[1].Trim()})
$packages | Select-String -pattern 'StepsRecorder|WordPad|MsPaint|Hello\-Face|InternetExplorer|QuickAssist|TabletPCMath' | % { write-host "Entferne $_"; dism /image:$installWim /Remove-Package /PackageName:$_ >$null }
Sobald neue Installationsmedien erscheinen, müsst ihr die neue ISO herunterladen und testen. Je nachdem, was Microsoft geändert hat, funktioniert manches möglicherweise nicht mehr bzw. muss ebenfalls angepasst werden. Dafür macht es Sinn, sich ein Skript zu schreiben. Das erleichtert und beschleunigt mehrere Durchläufe nicht nur ungemein – insbesondere bei größeren Anpassungen. Man hat damit zudem automatisch dokumentiert, was genau verändert wurde.
Quellen
- https://www.microsoft.com/de-de/software-download/windows10 ↩︎
- https://www.microsoft.com/de-de/software-download/windows11 ↩︎
- https://learn.microsoft.com/de-de/windows-hardware/get-started/adk-install ↩︎
- https://www.heise.de/select/ct/2018/18/1535265216281441 ↩︎
- https://learn.microsoft.com/de-de/windows-hardware/manufacture/desktop/oscdimg-command-line-options?view=windows-10 ↩︎