Archive for the ‘ISO’ Category

Weitere Erkenntnisse zu Tar unter Windows 10

25 März 2019

In diesem Artikel bin ich schon auf TAR.EXE unter Windows 10 eingegangen: https://newyear2006.wordpress.com/2018/10/21/tar-exe-unter-windows-10-der-neue-tausendsassa/. Nun habe ich weitere Erkenntnisse und diese möchte ich in diesem Artikel beschreiben. Dies wird sicher nicht der letzte Artikel zu diesem Thema sein, denn es gibt noch einiges zu entdecken bzw. es gibt noch die eine oder andere Ungereimtheit aber dazu ein anderes Mal mehr.

Genereller Hinweis:

Da macht man sich Mühe und testet alles durch, danach ladet man den Artikel hoch doch dann grätscht WordPress rein und zerhaut einem die mühsam hinterlegte Formatierung Sad smile. Also überall wo in diesem Artikel ein langer Bindestrich steht sollten eigentlich zwei Minuszeichen stehen. Also Hirn einschalten beim Copy und Paste…

Kurze und lange Parameterangaben
Tar kennt kurze wie lange Parameter, z. B. sind diese alle drei Zeilen identisch:

tar -caf test.zip *

tar -c –a -f test.zip *

tar –create –auto-compress –file test.zip *

Teilweise findet man im Internet Beispiele wo tar anstatt mit dem Parameter -caf  einfach nur mit caf, also so angegeben wird, auch dies ist zulässig:

tar caf test.zip *

Nicht direkt aber dennoch auch von Bedeutung ist die Angabe von Parametern mit Gleichheitszeichen, so sind diese beiden Aufruf identisch:

tar –format=7zip –options=7zip:compression=STORE -cf ..\testNeu.7z *

tar –format 7zip –options 7zip:compression=STORE -cf ..\testNeu.7z *

Tar ist so schlau und erkennt die einzelnen Parameter und kann sie problemlos auseinanderhalten, selbst wenn doppelte Gleichheitszeichen wie im zweiten Beispiel angegeben sind.

Einfaches Erzeugen von ZIP-Dateien
Die einfachste Variante ein ZIP-Archiv zu erstellen ist, indem man tar automatisch anweist die Dateiendung zu analysieren um daraus auf das zu verwendende Format zu schließen, dazu gibt man den Parameter a mit an:

tar.exe -caf test.zip *

Unterverzeichnisse ausschließen
Gibt man keinen speziellen Parameter an, werden alle Dateien inklusive deren Unterverzeichnisse gesichert bzw. zurückgespielt. Man kann dieses Verhalten ändern indem man den Parameter -n bzw. die Langform –norecurse bzw. –no-recursion verwendet. Aber nicht erschrecken, obwohl man diesen Parameter angegeben hat wird der eigentlich Verzeichnisname mitgesichert, nur der Inhalt darunter liegenden Dateien nicht!

tar.exe -cnaf test.zip *

Obige Zeile erzeugt also eine ZIP-Datei ohne die Unterverzeichnisinhalte mit zu nehmen.

Groß-/Kleinschreibung ist ein Problem
BSDtar kommt aus der Unix-Welt und da ist die Groß-/Kleinschreibung wichtig! D. h. testex.txt, Testex.txt und z. B. TESTEX.TXT sind alles unterschiedliche Dateien.

Dies wirkt sich auch an unerwarteter Stelle aus, wenn man obiges Beispiel zum Erzeugen einer ZIP-Datei z. B. so schreibt:

tar.exe -caf test.ZIP *

so erhält man keine ZIP-Datei! Statt dessen wird ein konventionelles Tar-Archiv erzeugt.

Ausschließen von Dateien
Sollen bestimmte Dateien nicht gesichert werden dann kann man diese mit dem Parameter –exclude angeben. Exclude kann auch mehrfach angegeben werden, ja muss in Einzelfällen sogar mehrfach angegeben werden, wenn man z. B. im Vorfeld nicht weiß, ob der Dateinamen groß- oder kleingeschrieben wurde.

Am sichersten verwendet man diese drei Varianten, wobei es sicher noch Fälle gibt, wo es nicht klappt:

tar.exe –exclude testex.txt –exclude Testex.txt –exclude TESTEX.TXT -caf test.zip test*

Unter GNU-Tar gibt es den tollen Parameter –ignore-case, doch leider funktioniert dieser bei BSDtar nicht:

tar –ignore-case –exclude testex.txt -caf test.zip test*
tar.exe: Option –ignore-case is not supported

Natürlich wird der Aufruf dadurch schnell unübersichtlich, zum Glück gibt es den Parameter –exclude-from welcher die Angabe eines Dateinamens erlaubt. Mit Powershell kann man dann z. B. sowas machen:

"testex.txt","Testex.txt","TESTEX.TXT" | set-content -Path exclude.txt
tar.exe –exclude-from exclude.txt  -caf test.zip test*

Verhinderung unnötiger Meldung
Manchmal muss man ein Archiv in genau dem Verzeichnis erstellen, welches man sichern möchte. Wenn man alles ohne Ausnahme sichert, dann versucht tar das eigene Archiv nochmals mit zu sichern. Dies wird erkannt und durch folgende Meldung quittiert:

tar.exe -caf Sicherung.zip *
tar.exe: Couldn’t open Sicherung.zip: Permission denied
tar.exe: Error exit delayed from previous errors.

Das Archiv wird trotzdem erstellt, also kein Problem. Sieht halt nur unschön aus. Das Thema kann über einen Aufruf über Powershell und dem expliziten Ausschließen des Archivnamens verhindert werden:

$archive=’Sicherung.zip‘; tar.exe –exclude=$archive -caf $archive *

Verwendung von Optionen
Jedes Format welches von Tar unterstützt wird kennt seine eigenen Optionen. Optionen werden immer eingeleitet durch den Parameter –options. Gibt man Optionen speziell für ein bestimmtes Format an, so gibt man den Formatnamen z. B. zip gefolgt von einem Doppelpunkt und dann dem eigentlichen Optionsparameter. Dadurch kann man bei ZIP-Dateien den Kompressionsfaktor angeben. So erzeugt diese Option die höchste Kompression, Standard ist anscheinend 6, welches von der ZLib-Bibliothek vorgegeben ist.

–options zip:compression-level=9

Weiß man, dass man in einem Archiv mehr als 4GB an Daten speichern muss, kann man gleich den Parameter für die Zip64-Unterstützung angeben:

–options zip:zip64

Will man das ZIP-Archiv schützen, dann kann man noch eine Verschlüsselung mitangeben, es werden drei Varianten unterstützt:

–options zip:encryption=zipcrypt

–options zip:encryption=aes128

–options zip:encryption=aes256

Komplett könnte ein Aufruf also so aussehen:

tar.exe –format=zip –options zip:zip64 –options zip:encryption=aes256 –passphrase=MeinPassword -cf test.zip *

7Zip-Unterstützung
Tar unterstützt eigentlich 7Zip, wenn man jedoch eine 7Zip-Datei versucht zu entpacken, dann passiert folgendes:

tar -xvf .\test.7z
x test.txt: LZMA codec is unsupported
tar.exe: Error exit delayed from previous errors.

Trotzdem kann aber Tar das Verzeichnis des Archivs auflisten:

tar -tvf .\test.7z
-rw-rw-rw-  0 0      0           7 Mrz 25 09:26 test.txt

Man könnte nun sagen, ok vielleicht klappt es nicht mit LZMA aber es gibt ja noch LZMA2, doch leider:

tar -c –format 7zip –options 7zip:compression=lzma1 -f .\test.7z test.txt
tar.exe: `lzma1′ compression not supported on this platform
tar -c –format 7zip –options 7zip:compression=lzma2 -f .\test.7z test.txt
tar.exe: `lzma2′ compression not supported on this platform

Als Bestätigung, dass der Parameter korrekt angegeben wurde, kann man einfach etwas unsinniges angeben:

tar -c –format 7zip –options 7zip:compression=lzma3 -f .\test.7z test.txt
tar.exe: Unknown compression name: `lzma3′

Also müssen wir davon ausgehen, dass Microsoft das zugehörige lzma-Modul für hochwertige Kompression von 7Zip-Dateien nicht mit eingebaut hat. Schade.

Man kann jedoch problemlos 7Zip-Dateien erstellen, diese sind dann allerdings nicht hochgradig komprimiert sondern nur mit einem einfachen Deflate-Algorithmus gestaucht.

TAR.exe Rückgabe von Fehlercode
Tar.exe gibt immer einen Errorlevel zurück, unter Powershell kann dieser mittels $LastExitCode ganz einfach abgefragt werden. Ist dieser 0 war die Abfrage erfolgreich, ist er 1 trat ein Fehler auf.

Parameter –fast-read
Der Parameter –fast-read macht auf den ersten Blick keinen Sinn, denn er sorgt dafür, dass die weitere Verarbeitung eines Archivs gleich gestoppt wird.

Dieser Parameter ist aber nützlich um schnell eine Information über ein Archiv zu erhalten ohne es komplett verarbeiten zu müssen. Vor allem bei großen Archiven sorgt dies für eine enorme Zeitersparnis.

Möchte man also nur wissen, ob eine bestimmte Datei enthalten ist, ruft man

tar.exe –fast-read -tf archiv Datei

auf und fragt den $LastExitCode ab.

Anwendung bei .CAB-Dateien
Unter Windows hat man es ab und an mit .CAB-Dateien zu tun, welche z. B. für Updates benötigt werden. Seither musste man mit dem Befehl Expand.exe arbeiten, alternativ kann man nun tar.exe verwenden. So sind diese beiden Aufrufe identisch, sie geben beide den Inhalt des Archivs aus:

expand.exe -D  CabDatei.CAB
tar -tvf CabDatei.CAB

Man kann zwar CAB-Dateien entpacken, allerdings nicht mit tar.exe packen, denn tar kann nur lesend auf CAB-Dateien zugreifen!

Wildcards bzw. Patterns
Man kann bei den Verzeichnis- und Dateinamenparametern wie –exclude auch Wildcards angeben, diese richten sich nach den “Filename substitution”-Richtlinien aus https://www.freebsd.org/cgi/man.cgi?query=tcsh. Es sind zwar keine vollständigen RegEx-Ausdrücke möglich aber Angaben wie

Zur Vereinfachung zur Erzeugung der nötigen Patterns kann man diese Funktion verwenden:

Function New-GKPattern ($String) { (($String.ToLower().tochararray()) | % {$t=[System.Convert]::ToString($_); If ($t.ToLower() -ceq $t.ToUpper()) {$t} else {"[$($t.ToLower())$($t.ToUpper())]"}}) -join “}

Die Funktion macht aus

New-GKPattern "Agent§$%"

den String "[aA][gG][eE][nN][tT]§$%", jeder Buchstabe wird als groß und klein angegeben, Zeichen oder Buchstaben wie ß wo es keine unterschiedliche Schreibweise gibt, werden direkt übernommen.

Mit dieser Methode könnte man obiges Beispiel wo der exclude-Parameter beschrieben war so verwenden:

tar.exe –exclude $(New-GKPattern ‚testex.txt‘)  -caf test.zip test*

Verwendung unter WinPE und WinRE
Man kann Tar direkt unter WindowsPE kurz WinPE bzw. im Windows Recovery Environment kurz WinRE verwenden. Doch leider ist Tar in diesem Umgebungen nicht direkt enthalten (Stand 1903, Build 18361). Man kann allerdings von einer anderen Windows 10 (64-Bit) Maschine aus dem Verzeichnis C:\Windows\System32 die Dateien tar.exe sowie archiveint.dll kopieren um Tar wie gewohnt verwenden zu können. Übrigens kann man auch curl.exe gleich mitnehmen, dies könnte in bestimmten Situationen auch hilfreich sein. Bei curl.exe scheint es keine weiteren Abhängigkeiten zu geben.

Weitere Infos zu Tar
Möchte man etwas speziell über Möglichkeiten von Tar.EXE wissen, dann ist ein Blick in den Sourcecode hilfreich. Man holt sich einfach die Version durch

tar –version

und geht mit der libarchive Version auf ein definiertes Tag z. B.

https://github.com/libarchive/libarchive/tree/v3.3.2

Oder automatisiert:

$version = (((tar.exe –version) -split ‚-‚)[1] -split ‚ ‚)[2]
start "https://github.com/libarchive/libarchive/tree/v$version"

Werbeanzeigen

Tar.exe unter Windows 10 der neue Tausendsassa

21 Oktober 2018

Mit Windows 10 v1803 wurde ein neues Utility-Programm von Microsoft ins Windows-System mitaufgenommen. Es handelt sich um TAR.EXE. Tar ist unter Linux im Dauereinsatz aber auch bei Mac OS X verfügbar. Bei Windows handelt es sich um ein reines 32- bzw. 64-Bit Windows Anwendungsprogramm und ist unter 32- und 64-Bit Windowsversionen vorhanden. Obwohl die EXE tar genannt wird, handelt es sich eigentlich um BSDTar, welches primär auch beim Mac zum Einsatz kommt. Die Besonderheit von BSDTar ist, dass es auf libarchive aufsetzt, d. h. viele Features werden durch libarchive definiert. Tar.EXE ist bereits bei einer einfachen Grundinstallation sofort verfügbar. Es hat auch nichts mit dem Windows Linux Subsystem zu tun, welches ihre eigenen tar-Programme mitbringen. tar ist bei Servern ab Windows Server 2019, auch beim Hyper-V Server. Leider fehlt die Unterstützung in WinPE. Hier die offizielle Ankündigung von Microsoft tar unterstützen zu wollen: https://blogs.technet.microsoft.com/virtualization/2017/12/19/tar-and-curl-come-to-windows/.

Um zu wissen was alles mit Tar möglich ist, gilt es zuerst die Version herauszufinden, dazu ruft man

tar –version

auf, welches

bsdtar 3.3.2 – libarchive 3.3.2 zlib/1.2.5.f-ipp

liefert. Hiermit wird obige Aussage bei tar handelt es sich um bsdtar verdeutlicht. Auch wird damit libarchive klar. Um nun die Möglichkeiten und den Versionstand besser verstehen zu können, kann man hier nachschauen: http://www.libarchive.org/. Zum aktuellen Zeitpunkt gibt es die Version 3.3.3, also ist Microsoft recht nahe am Original. Übrigens hat Windows 10 v1809 keine neuere Version mitgebracht, stellt sich die Frage, ob Microsoft zukünftig die Version aktualisieren wird oder ob die Version auf ewig bei 3.3.2 verharren wird. Der Source Code zur Version 3.3.2 ist hier zu finden: https://github.com/libarchive/libarchive/tree/v3.3.2.

Was kann man nun mittels tar unter Windows tun? Jede Menge, nicht umsonst die Überschrift. tar kann ZIP-Dateien erstellen, sogar ZIP64-Dateien, also ZIP-Dateien größer als 4GB, dadurch kann man komplette Platten mittels tar sichern. tar kann auch die Dateien mit AES-128 oder AES-256 verschlüsseln, somit kann man Sicherungen erstellen, verschlüsseln und bedenkenlos in die Cloud schieben. tar kann auch mit ISO-Dateien umgehen und diese sogar erstellen. tar kann aber nicht nur mit normalen und großen ZIP-Dateien umgehen, sondern unterstützt auch 7-Zip-Dateien. Daneben noch viele andere Formate mehr. Es soll auch mit CAB-Dateien umgehen können, aber meine Versuche hiermit sind alle gescheitert.

Nun ein paar Anwendungsbeispiele.

Erzeugt eine Test.ISO-Datei mit den beiden Dateien Datei1.txt und Datei2.txt:

tar -cf test.iso –format=iso9660 datei1.txt datei2.txt

Erzeugt eine Test.ZIP-Datei mit den beiden Dateien Datei1.txt und Datei2.txt, wobei die Test.ZIP-Datei zusätzlich AES-256 verschlüsselt und mit dem Passwort password versehen wird:

tar -cf test.zip –format=zip –options=encryption=aes256 –passphrase=password datei1.txt datei2.txt

Wie oben beschrieben darf die resultierende ZIP-Datei auch größer als 4GB haben, unterstützt also ZIP64.

Dieses Beispiel listet den Inhalt einer ISO-Datei auf:

tar -tvf test.iso

Die gleiche Variante stellt auch den Inhalt von ZIP-Dateien dar. tar versucht dabei unabhängig von der Endung das passende Format zu erkennen. Ein angeben des Formats mittels –format=zip ist nicht erlaubt und wird mittels Fehler quittiert.

Natürlich kann man Dateien auch extrahieren:

tar -xvf test.zip

entpackt alle in Test.ZIP enthaltenen Dateien.

So toll tar unter Windows auch ist, hab ich leider noch keinen Parameter finden können, über den ein Fortschrittsbalken oder Hinweis ausgegeben werden kann. Gerade bei größeren Dateien wäre dies absolut hilfreich. Auch ist der Einsatz von Filtern per Kommandozeile nicht so klar. Ein weiteres Problem sind Dateien die gesichert werden sollen, die gerade in Benutzung sind, hier bricht tar einfach mit einer Fehlermeldung ab. Leider fehlt die Unterstützung für –ignore-read-error.

Aber ist vielleicht alles nur eine Frage der Zeit…

Positiv festzuhalten gilt vor allem, tar löst nun das Problem, dass man seither mittels ZIP64 gepackte oder mittels AES-verschlüsselte Dateien nicht ohne Bordmittel öffnen bzw. erstellen konnte. Zumindest für Kommandliner geht dies nun.

Wiederherstellungsumgebung WinRE.WIM aus Windows ISO-Datei extrahieren

2 Juli 2017

Für bestimmte Zwecke benötigt man die WinRE.WIM-Datei. WinRE ist die Wiederherstellungsumgebung für Windows. WinRE gibt es quasi seit Windows Vista und wurde Version um Version weiter ausgebaut. WinRE.WIM findet vor allem bei aktuellen Windows 10 und Windows Server 2016 Systemen Anwendung.

Um WinRE.WIM zu erhalten gibt es verschiedene Wege. Der einfachste ist auf einem bestehenden System die versteckte Wiederherstellungspartition mit einem Laufwerksbuchstaben zu versehen und dann unter X:\Recovery\WindowsRE mittels

attrib –s –h winre.wim

die WinRE.WIM-Datei sichtbar zu machen. Danach kann man sie wegkopieren.

Allerdings kann es Fälle geben, da möchte man sicher sein, dass die WinRE.WIM-Datei vom Original stammt. In diesem Fall kann man die WinRE.WIM-Datei aus bestehenden ISO-Dateien herauskopieren. Allerdings ist dieser Weg nicht sofort offensichtlich, denn es muss zunächst die ISO-Datei und zusätzlich die INSTALL.WIM-Datei eingehängt werden.

Auf einem aktuellen Windows 10 System mit Powershell-Unterstützung sieht der Vorgang z. B. so aus:

#Requires –RunAsAdministrator
# ISO-Datei sollte als absoluter Pfad angegeben werden, keine Remotelaufwerke, sonst klappt es manchmal nicht:
$iso=’D:\ISOs\de_windows_10_multiple_editions_
version_1703_updated_march_2017_x86_dvd_
10191741.iso‘
$im=Mount-DiskImage -ImagePath $iso -PassThru
If ($im.Attached) {
  $isoDrive=(Get-DiskImage –DevicePath $im.DevicePath | Get-Volume).DriveLetter
}

So nun sollte $isoDrive den Laufwerksbuchstaben des eingehängten ISO-Images haben. Mit diesem kann man dann weiterarbeiten und die Install.Wim einhängen:

# Verzeichnis zum Einhängen von Install.WIM anlegen
md $env:TEMP\WinRE
Mount-WindowsImage -ImagePath "$($isoDrive):\sources\install.wim" -Index 1 -path "$env:Temp\WinRE" -ReadOnly

Nach dem Kopiervorgang kann man nun auf die WinRE.WIM zugreifen:

dir $env:Temp\WinRE\windows\System32\Recovery\Winre.wim

Man könnte sie z. B. in das ADK für WinPE kopieren, damit man eine individuelle RettungsCD erstellen kann:

# bei x86:
copy $env:Temp\WinRE\windows\System32\Recovery\Winre.wim "${env:ProgramFiles(x86)}\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\x86\en-us"

# oder bei x64:
copy $env:Temp\WinRE\windows\System32\Recovery\Winre.wim "${env:ProgramFiles(x86)}\Windows Kits\10\Assessment and Deployment Kit\Windows Preinstallation Environment\x64\en-us"

Hat man die Datei dann wegkopiert, sollte man die Umgebung noch wieder aufräumen, damit alles seine Ordnung hat:

Dismount-WindowsImage  -path $Env:Temp\WinRE  -Discard
DisMount-DiskImage -ImagePath $iso

USB-Bootstick von einer Windows-ISO erstellen, MasterbootRecord (MBR)-Variante

6 März 2017

In Bezug zu diesem Artikel https://newyear2006.wordpress.com/2009/09/19/windows-vista-windows-7-usb-boot-stick-erstellen/, hier ein Update um die einzelnen Dinge per Powershell hinzubekommen. Dadurch wird es möglich eine beliebige aktuelle Microsoft ISO-Datei (von Vista bis Server 2016) zu verwenden und deren Inhalt auf einem bootbaren USB-Stick zu erhalten. Damit die unten stehenden Powershellbefehle verfügbar sind, braucht man mindestens Windows 8.1, getestet habe ich es mit Windows 10.

Diese Methode könnte man auch mit leichter Variation verwenden, um eine bootbare VHD oder VHDX für einen Hyper-V zu bekommen. Aber dies vielleicht ein anderes Mal.

Ein weiterer Vorteil bei diesem Weg kann man auch Modifikationen der zu installierenden Dateien vornehmen. So kann man z. B. die EI.CFG bearbeiten, bevor man die eigentliche Installation beginnt. https://newyear2006.wordpress.com/2009/12/13/windows-7-versionsauswahl-bei-installation/. Oder man könnte die Eingabe des Produktschlüssels umgehen: https://newyear2006.wordpress.com/2012/08/30/windows-8-eingabe-des-produktschlssels-bei-der-installation-umgehen/. Noch eine Variante: https://newyear2006.wordpress.com/2013/09/13/windows-8-1-mit-product-key-von-windows-8-installieren/.

Damit die folgenden Befehle auch funktionieren, braucht man eine Powershell-Eingabeaufforderung mit Administratorrechten.

Auswahl des USB-Sticks
Da wir hier gezielt die Daten auf einen USB-Stick schreiben wollen und bei den Aktionen auch mal schnell die falsche Platte gelöscht werden kann, lassen wir uns nur Geräte die als Wechseldatenträger (Removable Storage) auftauchen anzeigen.

$diskObj = Get-Volume | Where DriveType –eq Removable | Get-Partition | Get-Disk | Out-GridView –Title "USB-Stick auswählen" –PassThru

Um auf vom Volume zur Disk zu kommen, muss man den Umweg über die Partition machen. Am Ende sorgt Out-GridView, dass nur ein Stick ausgewählt werden kann.

Wer hier nichts angezeigt bekommt, der hat womöglich einen Stick der als interne Festplatte erkannt wird. Vor allem USB-Sticks die “Windows to Go” geeignet sind, werden so also nicht erkannt. Wer möchte, kann dazu diese Variante wählen:

$diskObj = Get-Disk | Out-GridView –Title "USB-Stick auswählen" –PassThru

Wer auf einem Hyper-V oder Nano-Server arbeitet, der hat Out-GridView nicht zur Verfügung, der kann auch diese Variante verwenden:

Get-Disk | select Number, FriendlyName, @{Name="Total Size"; Expression={"{0:N2} GB" –f ($_.Size/1GB)}}

Es werden alle Laufwerke aufgelistet und man wählt eines aus:

$diskObj = Get-Disk –Number X

Egal welche Methode man gewählt hat, man sollte nun in $diskObj ein Objekt vom Typ MSFT_Disk haben.

USB-Stick löschen und formatieren
Nun geht es ans eingemachte. Für alle, die nicht wissen, was sie tun, hier kann man schnell seine Platte löschen, wenn man oben nicht das richtige Laufwerk ausgewählt hat!

$diskNr = $diskObj.Number

Get-Disk –Number $diskNr | Clear-Disk –RemoveData

muss mit Ja bestätigt werden.

$part=New-Partition –DiskNumber $diskNr –UseMaximumSize –IsActive

$part | Format-Volume –FileSystem NTFS –NewFileSystemLabel "BootDisk"

hier darf kein –Full angegeben werden, dann ist es automatisch eine Quick-Formatierung.

Add-PartitionAccessPath –Disknumber $diskNr –PartitionNumber $part.PartitionNumber –AssignDriveletter

Laufwerksbuchstaben holen:

$drive = (Get-Partition –DiskNumber $diskNr –PartitionNumber $part.PartitionNumber).DriveLetter

ISO-Datei auswählen
So, nun muss das ISO-Image geladen werden, hier wieder komfortabel per Auswahl die ISO-Datei ausgewählt:

$isoFile = Get-Item .\myIsoPath\*.ISO | Out-GridView –Title "ISO auswählen" –PassThru

Möchte man eine ISO-Datei direkt angeben oder liegt die ISO-Datei im aktuellen Pfad, dann kann auch der direkte Weg benutzt werden:

$isoFile = Get-Item (Resolve-Path .\myIsoFile.ISO)

Nun muss die ISO-Datei eingehängt werden und der zugeordnete Laufwerksbuchstabe ermittelt werden. Allerdings gibt es hier mal wieder ein kleines Problem! Die ISO-Datei darf nicht mittels UNC-Pfad angegeben werden bzw. darf nicht auf einem Remotelaufwerk liegen, sonst wird sie nicht richtig eingehängt, bzw. es wird kein Laufwerksbuchstabe zugeordnet. Nachdem ich ewig lang gezweifelt habe, habe ich jemand anderes gefunden, der genau das gleiche Problem entdeckt hat: https://github.com/VirtualEngine/Lability/issues/28#issuecomment-159657191. Kurz gesagt, Get-Volume liefert nicht den Laufwerksbuchstaben der ISO-Datei, allerdings liefern PS-Drive, Win32_Volume den Laufwerksbuchstaben! Mal wieder ein krasser Bug. Also Vorsicht!

$image=Mount-DiskImage –ImagePath $isoFile.Fullname –PassThru
$imageDrive=($image|Get-Volume).DriveLetter

Bootsector schreiben
Damit von dem USB-Stick auch gebootet werden kann, muss natürlich ein Boot-Sektor geschrieben werden.

Start-Process –Wait "$($ImageDrive):\Boot\BootSect.Exe" –ArgumentList "/NT60","$($drive)"

Dateien der ISO auf den Stick kopieren:

xcopy.exe "$($ImageDrive):\*.*" "$($drive):\" /s /h

So nun sollte alles auf dem Stick sein, so dass von diesem gebootet werden kann.

Noch wichtig: Was tun, wenn der Stick beim Bootvorgang nicht auftaucht? Im UEFI BIOS sollte dann die SecureBoot-Einstellung überprüft werden, ob beliebige Betriebssysteme gebootet werden können oder nur SecureBoot-fähige.

Ein späterer Artikel soll die SecureBoot- also UEFI-fähige Variante nachliefern.

Vorhandene Windowsversionen aus Windows-Installations-ISO-Datei ausgeben

30 Dezember 2014

Wenn man eine Windows-Installations-ISO-Datei hat und schnell wissen möchte, welche Versionen darin enthalten sind, gibt es verschiedene Möglichkeiten dies herauszufinden.

Wenn man Windows 8 oder neuer hat, dann kann man dies mittels Powershell über diesen Einzeiler:

$m=Mount-DiskImage -ImagePath "C:\Temp\MS-ISOs\de_windows_8.1_with_update_x64_dvd_6051485.iso" -PassThru ; Get-WindowsImage -ImagePath "$(($m| Get-Volume).DriveLetter):\sources\install.wim";
$m|Dismount-DiskImage

Führt zum Ergebnis:

Index       : 1
Name        : Windows 8.1 Pro
Description : Windows 8.1 Pro
Size        : 13.324.853.116 bytes

Index       : 2
Name        : Windows 8.1
Description : Windows 8.1
Size        : 13.260.872.008 bytes

Der Reihe nach:

$m=Mount-DiskImage -ImagePath "C:\Temp\MS-ISOs\de_windows_8.1_with_update_x64_dvd_6051485.iso" -PassThru ;

Öffnet eine ISO-Datei und reicht das Objekt an $m weiter.

Get-WindowsImage -ImagePath "$(($m| Get-Volume).DriveLetter):\sources\install.wim";

Ermittelt den bei Mount-DiskImage vergebenen Laufwerksbuchstaben und schaut unter diesem im Verzeichnis nach der X:\Sources\Install.WIM-Datei. Dort werden mittels Get-WindowsImage die verfügbaren Versionen ermittelt und ausgegeben.

$m|Dismount-DiskImage

Entfernt das eingehängte ISO-Image wieder. Das wars.

ISO-Dateien in Windows 8 mittels Powershell 3.0 einbinden

11 März 2012

Unter Windows 8 gibt es nun direkt die Möglichkeit über den Windows Explorer ISO-Dateien egal ob CD- (CDFS) oder DVD(UDF)-Images einzubinden. Einfach die ISO-Datei doppelklicken und schon ist die ISO-Datei als Laufwerk eingebunden.

Interessanter ist die Sache natürlich wenn man es automatisieren kann. Dank Powershell 3.0 und der Fülle von neuen Cmdlets die unter Windows 8 zur Verfügung stehen gibt es nun auch die Möglichkeit ISO-Dateien einzubinden. Übrigens kann man nun auch VHD und die neuen VHDX-Dateien über Powershell einbinden.

So kann man mittels

Mount-DiskImage –ImagePath C:\Path\ISOFile.ISO

eine ISO-Datei einbinden. Man bekommt zwar automatisch einen Laufwerksbuchstaben zugewiesen und kann den Inhalt der ISO-Datei direkt ansprechen. Blöd ist nur, dass man kein Objekt zurück bekommt. Wie kann man nun automatisiert den Laufwerksbuchstaben zurückbekommen? Mittels

Get-DiskImage –ImagePath C:\Path\ISOFile.ISO

bekommt man die nötigen Informationen. Mit diesen Informationen kann man dann auch den zugewiesenen Laufwerksbuchstaben erhalten:

Get-DiskImage –ImagePath C:\Path\ISOFile.ISO | Get-Volume

Der Laufwerksbuchstabe ist im Property DriveLetter enthalten.

Möchte man eine ISO-Datei wieder entladen, dann kann man dies mittels

Dismount-DiskImage –ImagePath C:\Path\ISOFile.ISO

erreichen.

Bei den Aufrufen bei Get-DiskImage und Dismount-DiskImage kann man anstatt dem Parameter –ImagePath auch den Parameter –DevicePath verwenden, dies sieht z. B. so aus:

Dismount-DiskImage –DevicePath \\.\CDROM0