Tips voor Windows-images met DISM
Het commandline-programma DISM van Microsoft kan bij Windows-installaties functies, stuurprogramma’s, updates en taalpakketten toevoegen of verwijderen, Windows-images naar een schijf schrijven, bewerken, opnieuw verpakken en nog veel meer. Om DISM goed te kunnen gebruiken, moet je je er wel eerst in verdiepen. Deze introductie helpt je met de eerste stappen.
De afkorting DISM betekent Deployment Image Servicing and Management. Microsoft omschrijft het als ‘a command-line tool that can be used to service and prepare Windows images’. Aangezien de officiële naam niet meteen duidelijkheid biedt en ook veel te lang is voor dagelijks gebruik, wordt meestal de afkorting DISM gebruikt. Het programma heeft geen grafische userinterface, dus het is zuiver bedoeld voor de commandline. De naam van het uitvoerbare bestand is dism.exe. Je kunt het oproepen vanuit Opdrachtprompt of PowerShell, maar in beide gevallen moet die draaien met administratorrechten.
Wanneer je voor de eerste keer met DISM aan de slag gaat, is de term image in de naam vaak verwarrend, daarom hier eerst een korte uitleg. Een image is een verzameling van mappen en submappen en de bestanden die ze bevatten. Een image bevat ook metadata zoals attributen en objecten van het NTFS-bestandssysteem (toegangsrechten, reparsepoints zoals junctions en hardlinks...). Zo kan een image alles bevatten wat zich op een Windows-pc op de C: schijf bevindt – en wanneer dat het geval is spreken we meestal over een Windows-image. Maar een image kan willekeurige bestanden bevatten, bijvoorbeeld de inhoud van D:\fotos\vakantie. Een image is dus een afbeelding van een logische schijf (volume) of een map daarop, maar kan geen bestanden bevatten die zich in de originele situatie over meerdere logische schijven uitstrekken.
Images kun je verpakken in een archiefbestand in het bestandsformaat Windows Image. Dat heeft normaal gesproken de extensie .wim, vandaar de aanduiding WIM-bestand. Er zijn ook WIM-bestanden met de extensie .esd. Daarin zitten bijzonder sterk gecomprimeerde images voor het verspreiden via downloaden (esd staat voor Electronic Software Distribution). Als je images over meerdere WIM-bestanden opdeelt, krijgen die de extensie .swm (Splitted WIM).
In eerste instantie kun je WIM -bestanden opvatten als ziparchieven, maar een WIM-bestand kan niet slechts één, maar meerdere images bevatten. Daarbij worden slimme compressiemethoden
gebruikt. Images kunnen op hun beurt weer WIM -bestanden en dus ook andere images bevatten. Images kunnen in WIM-bestanden zitten, maar dat hoeft niet. Ze kunnen bijvoorbeeld in VHD/VHDXbestanden zitten, de virtuele harde schijven daarin voor DISM dus eveneens images.
De hoofdzaak: vanuit DISM gezien is zelfs een draaiende Windows-installatie uiteindelijk slechts een image, dus de inhoud van schijf C: (meer precies: van %systemdrive%). De bootloader en de recoverypartitie, die normaal gesproken op voor Verkenner niet zichtbare, aparte partities staan, maken geen deel uit van de Windows-image, maar zijn afzonderlijke images.
Je kunt met DISM dus images bewerken die in WIM-bestanden verpakt zijn, maar ook Windows-installaties – en daarbij maakt het niet uit of ze op dat moment draaien of niet. Maar afhankelijk van de toestand van een image heeft DISM verschillende mogelijkheden, en juist bij draaiende Windowsinstallaties zijn dat er heel veel.
Behalve de hierboven genoemde Windowsimages zijn er nog andere Windows-achtige images die je ook met DISM kunt bewerken. Dat zijn images met Windows PE. PE staat voor Preinstallation Environment. Daarbij gaat het om het minibesturingssysteem dat bijvoorbeeld opstart van een Windows-set-up-stick en waarin het eigenlijke installatieproces draait. Details over PE zijn te vinden in [1]. Een minibesturingssysteem dat sterk lijkt op PE is Windows RE (Recovery Environment). Dat is het systeem dat opstart van de reeds genoemde herstelpartitie als de eigenlijke Windows-installatie dat niet meer kan. Details over RE zijn te vinden in [2].
EERSTE STAPPEN
De eerste stappen met DISM zijn het makkelijkst als je het gewoon zelf uitprobeert – en dan op zo’n manier dat er niets fout kan gaan. We tonen hier twee voorbeelden. Ten eerste is dat het bewerken van de dataset van een Windows-installatie op een set-upstick, zoals je die bijvoorbeeld met de Media Creation Tool zelf kunt maken [3].Ten tweede is dat het verwijderen van voorgeïnstalleerde apps. Als je beide succesvol hebt afgerond, kun je die kennis makkelijk gebruiken bij andere DISM-operaties, omdat ze allemaal op dezelfde manier verlopen.
Of je Power Shell of Opdrachtprompt voor de eerste stappen gebruikt, is een kwestie van smaak. PowerShell heeft extra DISM-cmdlets, maar die kunnen niet meer dan wat dism.exe sowieso al kan. Hoewel de namen van de cmdlets vaak overeenkomen met de originele DISM-commando’s, zijn ze niet altijd hetzelfde (zie de link op de laatste pagina van dit artikel voor een overzicht van de cmdlets en hun dism.exe-equivalenten). Als je de DISM-cmdlets wilt gebruiken, zul je een iets andere syntax leren dan wanneer je dism.exe gebruikt. Dat zou niets uitmaken als PowerShell overal beschikbaar zou zijn, maar dat is niet zo. Zowel Windows PE als Windows
RE moeten het doen zonder PowerShell. Om daar DISM te gebruiken, moet je dus sowieso Opdrachtprompt gebruiken (meer precies: dism.exe), en dan kun je die meteen ook overal gebruiken.
Je kunt een eerste indruk van DISM krijgen door simpelweg dism bij Opdrachtprompt in te typen. Dat resulteert in een lange lijst van opties, die op nieuwkomers een afschrikkend effect kunnen hebben. Maar de namen van de commando’s en opties volgen een uniform schema, en veel ervan werken op dezelfde manier. Het belangrijkste is dat de toevoeging /get-help of het kortere /? voor elk subcommando en elke optie een aparte uitleg oproept. In de praktijk maakt het niet uit of het een commando of een optie is, want beide worden aan dism.exe doorgegeven met een ervoor geplaatste schuine streep (/).
De helpfunctie vertelt waar een commando of optie goed voor is, welke andere gegevens vereist zijn, en welke opties optioneel zijn. In de meeste gevallen geeft die functie ook voorbeelden.
HET EERSTE COMMANDO
Voor de eerste experimenten is het handig een aparte usb-stick van 16 of 32 GB te gebruiken. Via de link op de laatste pagina kun je Media Creation Tool (MCT) downloaden. Richt daarmee een stick in als Windows-set-up-stick – zie [3]. Daarbij wordt er onder andere een WIM-bestand op de stick gezet, en die kun je met DISM bewerken zonder iets anders te beschadigen. Wanneer je het WIM-bestand per ongeluk beschadigt, kun je de stick met MCT gewoon opnieuw maken.
Het WIM-bestand staat op de stick in de map sources en heet install.esd. In dat bestand zitten Windows-images die het eveneens op de stick geplaatste set-upprogramma op een interne schijf kan installeren. Het plan is nu om een image in het WIM-bestand zo te openen dat je het kunt veranderen door een paar bestanden toe te voegen. Tot slot wordt de image inclusief de veranderingen weer naar het WIM-bestand teruggeschreven. Wanneer het set-upprogramma die image later op een schijf installeert, zitten je veranderingen daar ook bij.
Kijk eerst eens naar de in het WIM-bestand opgenomen images. Dat doe je met het commando /Get-ImageInfo. Het onderdeel /Get- staat bij DISM-commando’s in principe voor het opvragen
van informatie. Zo’n commando veroorzaakt dus geen veranderingen. Aangezien het net als bijna alle DISM-commando’s te lang is om hem hier zonder afbreken af te drukken, staat hij hieronder wel over meer regels, maar moet je alle in dit artikel genoemde commando’s steeds op één enkele regel invoeren. Het gebruik van hoofd- of kleine letters speelt daarbij geen rol, maar komt de leesbaarheid wel ten goede.
Dism /Get-ImageInfo /ImageFile:H:\sources\ install.esd
Het commando krijgt via /ImageFile: te horen waar het bestand staat (hier H:\sources\install. esd). Let erop dat er voor de schuine streep een spatie staat, maar tussen de dubbele punt en het pad niet. Dat is bij DISM altijd zo! Na een spatie verwacht het programma steeds de volgende optie of het volgende commando. Wanneer je een pad met spaties erin wilt doorgeven, moet je het daarom tussen dubbele aanhalingstekens zetten. Tip: als je bij het intypen van paden de tab-aanvulling wilt gebruiken, zet dan achter de dubbele punt eerst nog een spatie, voer dan het pad met tab-aanvulling in en verwijder daarna de spatie achter de dubbele punt weer. Vooral bij lange paden spaart dat veel typewerk uit.
Na het uitvoeren van het commando geeft DISM informatie over de images in het opgegeven bestand. Voor iedere image wordt het indexnummer genoemd. Dat is een oplopende reeks. DISM geeft daarnaast de naam en de beschrijving van iedere image. Beide zijn vastgelegd door degene die de image oorspronkelijk in het WIM-bestand heeft gezet. Ook de grootte van iedere image wordt vermeld.
Voor de hierop volgende stappen gebruiken we de image Windows 10 Pro, die bij onze MCT-stick indexnummer 6 heeft. Over die image kun je met het commando /Get-ImageInfo ook weer meer informatie krijgen. Daarvoor hoef je er alleen een /Index:6 aan toe te voegen (ook hier geen spatie na de dubbele punt). Het hele commando ziet er dan zo uit:
Dism /Get-ImageInfo /ImageFile:H:\sources\ install.esd /Index:6
Zodra je aan een commando dus niet alleen het pad van een WIM-bestand meegeeft, maar daarbij ook het indexnummer van een daarin opgenomen image, heeft het niet meer betrekking op het hele bestand, maar alleen op de uitgekozen image.
Er is overigens een commando dat op het eerste gezicht hetzelfde lijkt te doen: Get-WimInfo. De volgende regel:
Dism /Get-WimInfo /WimFile:H:\Sources\ Install.esd
levert dezelfde output op als /Get-ImageInfo. Het verschil is dat /Get-WimInfo alleen met WIMen ESD-bestanden overweg kan, en je met /GetImageInfo ook informatie over bijvoorbeeld VHD/ VHDX-bestanden kunt opvragen.
De twee commando’s laten één ding duidelijk zien: wanneer aan een commando een directory- of bestandspad meegegeven moet worden, wordt de naam van de optie van het eigenlijke commando afgeleid. Zo moet je bij /Get-ImageInfo het pad achter /ImageFile: opgeven, terwijl /Get-WimInfo het achter /WimFile: verwacht. Die wetenschap maakt het je later makkelijk om bij andere commando’s ook zonder dat je bij de helpfunctie hoeft te kijken kunt vermoeden of herinneren wat je moet intypen.
CONVERTEREN
De volgende stap is eigenlijk het uitpakken van de geselecteerde image, maar eerst moet er nog een hindernis genomen worden. In ESD-bestanden zijn images namelijk zodanig gecomprimeerd opgeslagen dat je ze niet kunt bewerken, maar alleen
kunt gebruiken om te installeren. De oplossing is om de image naar een minder gecomprimeerd WIM-bestand te exporteren – ook gewoon op de usb-stick. Dat gaat met een enkel, maar lang commando. Controleer of er op de stick genoeg ruimte beschikbaar is, het bestand wordt circa 4 GB groot. Wanneer de ruimte op de stick niet voldoende is, kun je het doelbestand op een ander station maken (dat gaat iets sneller, maar je hebt straks meer om op te ruimen). Pas daarvoor het doelpad in het onderstaande commando achter /DestinationImageFile aan:
Dism /Export-Image /SourceImageFile:H:\ Sources\Install.esd /SourceIndex:6 /DestinationImageFile:H:\Sources\Install.wim /compress:max
De meeste onderdelen moeten na de uitleg hierboven nu al makkelijker te lezen zijn. Aan het commando Export-Image wordt eerst de naam van het bronbestand (/SourceImageFile:) en het indexnummer van de bronimage (/SourceIndex:) doorgegeven, vervolgens het doelbestand (/DestinationImageFile:) en tot slot het compressieniveau. Daarvan zijn er vier (none, fast, max, recovery). Het niveau max betekent daarbij niet de maximaal mogelijke compressie, maar het maximale compressieniveau dat een image mag hebben om het nog te kunnen bewerken. Voor het ESD-bestand wordt het nog hogere niveau recovery gebruikt. Het uitvoeren van het commando duurt enige tijd.
MOUNTEN
Om het nieuw gemaakte WIM-bestand te kunnen bewerken, kun je het als een met NTFS geformatteerde schijf mounten. Je kunt je dat proces voorstellen als het tijdelijk uitpakken van een ziparchief. Daarvoor moet er aan twee voorwaarden voldaan zijn: het WIM-bestand moet op een beschrijfbare schijf staan (dus niet op een dvd of een iso). In de tweede plaats heb je een map op een NTFS-schijf nodig, waarin de image uitgepakt kan worden. Die map moet al aanwezig zijn en genoeg vrije ruimte hebben. Hoeveel precies hangt van de image af, met 20 GB zit je in dit geval aan de veilige kant. Als voorbeeld gebruiken we hier G:\Mount. Maak die map eerst aan. Het uitpakken gaat met het commando /Mount-Image, in z’n geheel ziet dat er zo uit:
Dism /Mount-Image /ImageFile:H:\Sources\ Install.wim /Index:1 /MountDir:G:\Mount
Weer wordt het image-bestand aangegeven, in dit geval het net gemaakte WIM-bestand (als je per ongeluk install.esd opgeeft, genereert DISM een error: ‘… kan het opgegeven bestand niet vinden’). Het indexnummer is in dit geval 1. Je hoeft dat hier niet eerst met /Get-ImageInfo op te zoeken, je hebt
immers maar één WIM-bestand geëxporteerd en de eerste image heeft altijd het nummer 1. Tot slot geef je nog de doeldirectory aan.
BEWERKEN
Het bewerken van de gemounte image is simpel, want dat kan met Verkenner. In de map G:\Mount zie je meerdere mappen, die je zult herkennen van je C-schijf: Windows, Program Files, Gebruikers, etc. Het zijn de mappen van een Windows-installatie, inclusief alle metadata zoals toegangsrechten en dergelijke. In de map Gebruikers zitten alleen de profielmappen Openbaar en Default, want er is nog geen gebruiker aangemaakt. De image bevindt zich in de toestand waarop het set-upprogramma het op de interne schijf vóór de eerste reboot neerzet (details over het verloop van een Windows-installatie staan in [4]).
Wat in G:\Mount staat kun je naar believen bewerken – in elk geval in principe. Want niet alleen de bestanden en mappen zijn uitgepakt, maar ook de daarbij behorende metadata zoals de toegangsrechten. Op veel plaatsen in G:\Mount mag je daarom alleen dingen veranderen als je administratorrechten hebt. En het kan gebeuren dat Verkenner er dan zelf een stokje voor steekt. Als administrator kun je voor de ontbrekende rechten zorgen, maar wees voorzichtig. Bij Windows-installaties die later met deze image gemaakt worden, kun je namelijk te veel toestaan wat tot veiligheidsgaten kan leiden. Details over het rechtensysteem vind je in [5].
Veel lukt overigens ook zonder aan de toegangsrechten te hoeven komen. Een simpel voorbeeld: voeg in G:\Mount\Program Files bijvoorbeeld de tools uit de Sysinternals Suite toe. Download de Sysinternals Suite van https://sysinternals.com, pak het zipbestand uit en kopieer de inhoud met Verkenner naar de Mount-directory, bijvoorbeeld naar G:\Mount\Program Files\SysinternalsSuite. Voor het kopiëren moet je akkoord gaan met de waarschuwing van het gebruikersaccountbeheer.
Dan kun je de image weer inpakken. Dat doe je met het DISM-commando /Unmount-Image. Je kunt daarbij zelf beslissen of je de veranderingen mee wilt nemen. Hoe dan ook, sluit eerst alle Verkenner-vensters. Controleer dat er geen bestanden meer in de Mount-directory geopend zijn. Wacht nog een paar seconden, totdat een eventueel nog in de Mount-directory actieve virusscanner klaar is. Typ daarna pas het onderstaande commando in en neem de veranderingen daarbij mee:
Dism /Unmount-Image /MountDir:G:\Mount / Commit
Als je de veranderingen toch niet mee wilt nemen, vervang je /Commit door /Discard.
Dat de overgenomen veranderingen ook werkelijk in de image zitten, kun je controleren zonder daarvoor de image opnieuw te hoeven mounten. Het DISM-commando /List-Image laat alle in een image aanwezige bestanden en mappen zien. Dat zijn er zoveel, dat je de uitvoer het beste naar een tekstbestand kunt doorsluizen door achter het commando een > en de gewenste bestandsnaam te zetten. Dat ziet er dan zo uit (het pad eventueel aanpassen):
Dism /List-Image /ImageFile:H:\Sources\ Install.wim /Index:1 > %UserProfile%\ Documents\Dismtmp.txt
Zoek in het tekstbestand gewoon op ‘sysinternals’ om te zien dat de map erin zit.
APPS VERWIJDEREN
Nu naar het tweede voorbeeld, het verwijderen van geïnstalleerde apps. Je kunt dat wel op een draaiende Windows uitproberen, maar maak er dan eerst een back-up van, bijvoorbeeld met c’t-WIMage (zie de link op de volgende pagina). Het is sowieso veiliger om voor je eerste pogingen het in het eerste voorbeeld gemaakte WIM-bestand te gebruiken. De gang van zaken is in beide gevallen in principe hetzelfde.
Hieronder beschrijven we het met het voorbeeld van het gemaakte WIM-bestand. Koppel eerst de image weer zoals boven beschreven met de opdracht /Mount-Image in de map G:\Mount.
Kijk dan naar de geïnstalleerde apps. Dat gaat weer met een /Get-opdracht: /Get-ProvisionedAppxPackages. Omdat er standaard veel apps geïnstalleerd zijn, kun je de uitvoer beter weer naar een tekstbestand doorsluizen. Het onderstaande commando overschrijft het tekstbestand dat in het eerste voorbeeld is aangemaakt.. Bovendien demonstreert het dat DISM ook een ingebedde image als imageparameter accepteert:
Dism /Get-ProvisionedAppxPackages /Image:G:\ Mount > %UserProfile%\Documents\Dismtmp.txt
Open vervolgens het tekstbestand. Voor iedere app wordt behalve de versie en architectuur en dergelijke ook de weergavenaam getoond. Zoek er een uit die je overbodig vindt, bijvoorbeeld het spel Microsoft.MicrosoftSolitaireCollection.
Voor het verwijderen is er een /Remove-commando, in dit geval /Remove-ProvisionedAppxPackage. Let erop dat dit commando geschreven wordt zonder meervouds-s aan het eind. Dat is taalkundig juist, want bij het overzicht met /Get- gaat het om alle apps, maar bij /Remove- om niet meer dan één. Dat principe geldt ook voor soortgelijke opdrachten zoals /Add-, /Set- enzovoort.
Maar hoe doe je dat nu precies bij het verwijderen van het spel? In de helpfunctie vind je de details. In dit geval is het echter niet voldoende om alleen Dism /Remove-ProvisionedAppxPackage /? in te typen, want dat levert alleen de melding ‘No help topic could be found’ op. De reden: het commando moet altijd weten om welke image het gaat, en dat geldt in dit geval ook voor de helpfunctie. Daarom roep je de helpfunctie in dit geval als volgt op:
Dism /Image:G:\Mount /Remove-ProvisionedAppxPackage /?
Je kunt het bovenstaande commando in plaats van op een gemounte image ook op een draaiende in
stallatie toepassen. Daarvoor vervang je /Image: G:\Mount door /online. Dat is voor het oproepen van dergelijke helpteksten overigens een manier om minder in te hoeven typen, de helpteksten zijn hetzelfde.
De helpfunctie geeft aan dat je voor het uitvoeren van het commando de /PackageName: moet opgeven. Kopieer die dus uit het tekstbestand. Het volledige commando ziet er dan zo uit:
Dism /Remove-ProvisionedAppxPackage /Image:G:\Mount /PackageName:Microsoft.Microsoft SolitaireCollection_4.4.8204.0_ neutral_~_8wekyb3d8bbwe
Wanneer je de bovenstaande /Get-ProvisionedAppxPackages-regel met het pijltje-omhoog weer tevoorschijn haalt en opnieuw uitvoert, zal het spel vervolgens niet meer in het tekstbestand voorkomen. Nu alleen nog de image weer loskoppelen uit G:\Mount. Als je daar nu een /Commit in plaats van /Discard achter zet, heb je een installatiebestand waar het spel niet meer in zit.
Als je het laatste voorbeeld op een lopende installatie wilt toepassen, hoef je zoals eerder gezegd alleen bij ieder commando /Image:G:\Mount te vervangen door /Online. Maar pas wel op: veranderingen worden zonder een afsluitende /Commit dan meteen doorgevoerd!
EN VERDER …
Op dezelfde manier zoals je net een overzicht van de standaard geïnstalleerde apps hebt gemaakt, kun je ook de stuurgprogramma’s (/Get-Drivers) bekijken. Vergelijkbare commando’s zijn er voor de ‘capabilities’ zoals schrift- en spraakherkenning (/Get-Capabilities), Windows-updates (/Get-Packages) en features als Hyper-V, MediaPlayer en Linux-subsystem WSL (/Get-Features).
De gang van zaken is bij allemaal hetzelfde. Met Info erachter krijg je gedetailleerde informatie over een afzonderlijke driver of update., bijvoorbeeld /Get-DriverInfo. Voor het toevoegen en verwijderen zijn er de betreffende add- en remove-commando’s zoals /Add-Driver en /Remove-Feature.
Daarmee ben je klaar om op eigen kracht een ontdekkingsreis door de mogelijkheden van DISM te maken. Daarbij kun je op de commandline telkens de helpfunctie oproepen, of online in de DISMreferentie van Microsoft (zie de link op deze pagina) meer opzoeken over de afzonderlijke commando’s.
Ongeacht welke naslagmethode je gebruikt, je zult af en toe commando’s tegenkomen waarvan de betekenis ook na het doornemen van dit artikel nog niet volledig duidelijk is. Negeer die commando’s gewoonweg of gebruik voor je eerste experimenten een testcomputer, een virtuelel machine of een speciaal daarvoor aangemaakte image. Dat geldt vooral voor alle soorten van /Remove-commando’s.
Wees met name voorzichtig met het verwijderen van Windows-updates, want daarmee kun je opgeloste veiligheidsgaten weer openzetten. Tips voor het verwijderen van hinderlijke updates vind je in [6]. De Windows-versie waarmee je werkt blijft in elk geval intact als je je experimenten uitvoert op een testimage of een testinstallatie. En gewapend met deze kennis werkt het onderzoeken van het onbekende toch altijd relaxter dan zonder.
Literatuur
[1] Axel Vahldiek, Laatste redmiddel, Los problemen op met het mini-besturingssysteem Windows PE, c’t 7-8/2018, p.114
[2] Axel Vahldiek, Start assistentie, Hoe Windows startproblemen zelf oplost, c’t 4/2018, p.44
[3] Axel Vahldiek en Daniel Dupré, Een Windows 10 installatiestick maken, c’t 10/2020, p.122
[4] Axel Vahldiek, Werk in opdracht, Hoe een Windowsinstallatie verloopt – en waar je kunt ingrijpen, c’t 3/2019, p.66
[5] Hajo Schulz en Marco den Teuling, Het rechtensysteem van Windows, c’t 3/2020, p.94
[6] Jan Schüßler en Marco den Teuling, Defecte Windowspatches verwijderen, c’t 1-2/2021, p.130