Logo faq-o-matic.net
Logo faq-o-matic.net

WIM-File mit PowerShell aktualisieren

von veröffentlicht am10. Februar 2014, 06:04 Uhr Kurzlink und Zitatlink einblenden
Kategorie Kategorie: PowerShell   Translate with Google Translate Translate EN   Die angezeigte Seite drucken

Das Windows Imaging File Format (WIM) ist das Datenträgerabbildformat für alle Windows-Betriebssysteme ab Windows Vista und somit auch Grundlage für Windows PE (Preinstallation Environment) ab Version 2.0. Für die Modifikation von WIM-Files eignet sich hervorragend das DISM-PowerShell-Modul.

Dieses ist unter Windows 8.1 und Windows Server 2012 R2 standardmäßig enthalten, muss jedoch für frühere Windows-Versionen über das aktuelle Windows Assessment and Deployment Kit (Windows ADK) nachgerüstet werden.

Ein Import des Modules kann manuell über folgenden Befehl mit Import-Module durchgeführt werden. Die Variable „$env:PROCESSOR_ARCHITECTURE“ sorgt für die richtige Architektur-Auswahl im Ordnerpfad.

ipmo "C:\Program Files (x86)\Windows Kits\8.1\Assessment and Deployment Kit\Deployment Tools\$env:PROCESSOR_ARCHITECTURE\DISM"

Zuerst muss man das zu bearbeitende Image in einen leeren Ordner mounten. Dieses wird dann auch als Offlineabbild bezeichnet. Da in einem WIM-File mehrere Image-Instanzen vorhanden sein können, muss der richtige Index angegeben werden. In den meisten Fällen reicht „Index 1“. Wer sich jedoch nicht sicher ist, sollte vorher mit Get-WindowsImage alle Informationen zum Image-File abrufen und damit den richtigen Index ermitteln.

Get-WindowsImage –ImagePath E:\image.wim

Mount-WindowsImage -Path E:\mount -ImagePath E:\image.wim -Index 1

Gerade im Windows PE benötigt man ab und zu aktuelle Netzwerkkartentreiber. Bekannte Hersteller wie Dell oder HP bieten hier gleich kompatible Treiberpakete zum Download an. Wichtig ist jedoch, dass man selbst darauf achten muss, dass die Treiber zur verwendeten Windows-PE-Version passen, ein Überblick gibt folgende Webseite: http://technet.microsoft.com/de-de/library/dn293271.aspx.

Für das Hinzufügen eines Treibers in das gemountete WIM-File benutzt man das Cmdlet Add-WindowsDriver.

Add-WindowsDriver –Path E:\mount –Driver E:\winpe\x64\network\N6RY0_A00-00\Extracted\E1C\WINDOWS8.1-x64\E1C64x64.inf

Statt einzelner INF-Dateien kann man auch Verzeichnisse angegeben. Der Recurse-Parameter führt dann dazu, dass alle vorhandenen INF-Dateien hinzugefügt werden. Möchte man auch nicht von Microsoft signierte Treiber integrieren, muss auch noch der Parameter ForceUnsigned angehängt werden.

Add-WindowsDriver –Path E:\mount –Driver E:\winpe\x64\network –Recurse –ForceUnsigned

Mit Remove-WindowsDriver kann man auch Treiber aus dem Windows-Image entfernen. In dem Fall ist es jedoch sinnvoll, vorher über ein Get-WindowsDriver alle Treiber anzeigen zu lassen und eine passende Auswahl mit Where-Object durchzuführen. Über Pipelining kann das Ergebnis dann an Remove-WindowsDriver weitergegeben werden.

Get-WindowsDriver –Path E:\mount | ?{$_.Driver -eq "oem1.inf"} | Remove-WindowsDriver

Eine weitere Möglichkeit besteht darin, Updates und Sprachpakete zu verwalten. Für das Hinzufügen verwendet man Add-WindowsPackage. Es können CAB- oder MSU-Dateien installiert werden, auch mehrere aus einem Ordner. Für die verschiedenen Aktionen wird ein temporäres Verzeichnis verwendet, es ist sinnvoll, dieses selbst zu definieren. Nach Abschluss kann das Verzeichnis gelöscht werden.

Add-WindowsPackage –Path E:\mount –PackagePath E:\langpacks\de-de\lp.cab –ScratchDirectory E:\Scratch

Benötigt man eine weitere Filterung, z.B. nach MSU als Dateiendung, kann man dieses bequem mit einem vorangestellten ls (Get-ChildItem) umsetzen. Das Ergebnis muss über ein ForEach-Object gepiped werden, in welchem dann Add-WindowsPackage ausgeführt wird.

ls E:\ -i *.msu -r | %{Add-WindowsPackage -PackagePath $_.fullname -Path E:\mount}

Nicht alle Pakete werden im Offlineabbild gleich komplett installiert, einige befinden sich im Paketstatus „Installation steht aus“. Das bedeutet, dass die Installation durchgeführt wird, wenn das Abbild gestartet und die Onlineaktionen verarbeitet werden.

Für das Ermitteln und anschließende Entfernen eines einzelnen Pakets benutzt man Get-WindowsPackage und führt danach über ein Where-Object eine Filterung durch. Ein abschließendes Remove-WindowsPackage führt die Deinstallation aus.

Get-WindowsPackage -Path E:\mount | ?{$_.PackageName -like "*-InternetExplorer-*10*"} | Remove-WindowsPackage

Es gibt jedoch auch Funktionen, welche durch die DISM-PowerShell-Cmdlets noch nicht unterstützt werden, hierzu zählt z.B. die Änderung der Spracheinstellungen. Dafür benutzt man einfach das bekannte CMD-Tool DISM.exe, welches auch ohne Probleme in der PowerShell ausführbar ist. Die nächste Codezeile ändert die Standardsprache für die Systembenutzeroberfläche auf Deutsch.

Dism /Image:E:\mount /Set-SKUIntlDefaults:de-DE

Die aktuelle Einstellung kann über folgenden Befehl abgefragt werden:

Dism /Image:E:\mount /Get-Intl

Nach Abschluss aller Arbeiten muss der Mount-Punkt aufgehoben und über den Save-Parameter gespeichert werden, sonst werden alle Änderungen verworfen. Ein zusätzlicher Integritätscheck verbraucht zwar Zeit, stellt aber die Datenkonsistenz sicher und vermeidet somit spätere Fehler.

Dismount-WindowsImage -Path E:\mount -Save -CheckIntegrity

Es ist prinzipiell auch möglich, alles mit DISM.exe zu bearbeiten, jedoch hat man bei der PowerShell wieder den Vorteil von Pipelining, Tab-Vervollständigung und einheitlichem Syntaxaufbau.

In einem meiner nächsten Artikel werde ich die Möglichkeiten aufzeigen, wie man PowerShell innerhalb von Windows PE sinnvoll einsetzen kann.

© 2005-2023 bei faq-o-matic.net. Alle Rechte an den Texten liegen bei deren Autorinnen und Autoren.

Jede Wiederveröffentlichung der Texte oder von Auszügen daraus - egal ob kommerziell oder nicht - bedarf der ausdrücklichen Genehmigung durch die jeweiligen Urheberinnen oder Urheber.

Das Impressum findet sich unter: http://www.faq-o-matic.net/impressum/

Danke, dass du faq-o-matic.net nutzt. Du hast ein einfaches Blog sehr glücklich gemacht!