Windows 10/11 ohne Klicks installieren: Installation automatisieren und künstliche Windows 11 Beschränkungen (TPM, SecureBoot etc.) mit (auto)unattend.xml/Windows ADK entfernen

Windows 10/11 ohne Klicks installieren: Installation automatisieren und künstliche Windows 11 Beschränkungen (TPM, SecureBoot etc.) mit (auto)unattend.xml/Windows ADK entfernen

Es gibt verschiedene Gründe, um eine Windows-Installation anzupassen: Etwa das Entfernen der künstlichen Installationsbeschränkungen von Windows 11. Aber auch das Automatisieren der lästigen Installationsschritte kann einem viel Arbeit abnehmen. Vor allem bei Testsystemen oder einer größeren Anzahl an PCs möchte man die vielen Dialogfenster nicht jedes mal durchklicken. Ganz abgesehen von verschiedenen Anpassungen. Dieser Artikel zeigt, wie sich eine Installation sowohl händisch durch Bearbeiten der Autounattend.xml Datei, als auch grafisch per Windows ADK recht einfach teilweise oder komplett automatisieren lässt.

Wie lassen sich diese lästigen Schritte zur Windows 11 Installation einbinden?

Rufus besitzt seit Ende 2021 einen Haken, der diese Einschränkungen vom damit generierten Stick entfernt:

Das lässt sich mit der Antwortdatei (unattend.xml) umsetzen. Microsoft hat sie entwickelt, um die Windows-Installation im Vorfeld automatisieren zu können. Daher auch der Name: Sie soll die (mittlerweile sehr vielen) Fragen im Vorfeld beantworten, die während der Installation gestellt werden. Damit lassen sich einzelne Schritte bis hin zur kompletten Installation automatisieren. Neben vordefinierten Einstellungen kann man auch eigene Befehle ausführen – und das nicht nur in der fertigen Installation, sondern auch unter Windows PE. Das ist die Oberfläche des Installationsassistenten.

Ursprünglich ist Autounattend.xml für die erste Installationsphase gedacht: Also dem Assistenten zur Auswahl der Edition, des Laufwerks usw. Dagegen automatisiert unattend.xml den Einrichtungsassistenten. Er fragt nach dem ersten Start die Region ab sowie weitere Anpassungen, u.a. zum Datenschutz. Man kann dies aber auch in einer Datei kombinieren. Beide Methoden haben den Vorteil, dass man das originale Installationsmedium nicht anpasst. Entfernt man die XML-Datei oder benennt sie um, bekommt man einen Vanilla Installationsassistenten.

Beginnen wir mit einem relativ einfachen Beispiel. Vor dem Start der Windows 11 Installation sollen die Registry-Schlüssel gesetzt werden, um die künstliche Beschränkung auf TPM, Secure Boot und die gelisteten Prozessoren abzuschalten. Technisch befindet man sich dabei in Windows PE (Preboot Environment). Mit dem reg add Befehl können wir alle vier Registry-Schlüssel angeben. Außerdem setzt sie einen leeren Lizenzschlüssel – ansonsten wirft Windows PE einen Fehler. Natürlich kann sie auch um weitere Prüfungen ergänzt werden. Dazu einfach unten einen <RunSynchronousCommand> Block kopieren, den Name ersetzen (etwa BypassRAMCheck) und Order eins hoch zählen.

<!--*************************************************
Entfernt die Kompatibilitaetspruefung fuer Prozessor, TPM und Secure Boot
**************************************************-->
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
    <settings pass="windowsPE">
        <component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">            
			<UserData>
				<ProductKey>
				  <Key />
				</ProductKey>
			</UserData>
            <!-- Kuenstliche Restriktionen von Windows 11 entfernen - /f ignoriert vorhandene von zB Ventoy -->
		    <RunSynchronous>
                <RunSynchronousCommand wcm:action="add">
                    <Order>1</Order>
                    <Description>BypassTPMCheck</Description>
                    <Path>cmd /c reg add "HKLM\SYSTEM\Setup\LabConfig" /v "BypassTPMCheck" /t REG_DWORD /d 1 /f</Path>
                </RunSynchronousCommand>
                <RunSynchronousCommand wcm:action="add">
                    <Order>2</Order>
                    <Description>BypassSecureBootCheck</Description>
                    <Path>cmd /c reg add "HKLM\SYSTEM\Setup\LabConfig" /v "BypassSecureBootCheck" /t REG_DWORD /d 1 /f</Path>
                </RunSynchronousCommand>
                <RunSynchronousCommand wcm:action="add">
                    <Order>3</Order>
                    <Description>BypassCPUCheck</Description>
                    <Path>cmd /c reg add "HKLM\SYSTEM\Setup\LabConfig" /v "BypassCPUCheck" /t REG_DWORD /d 1 /f</Path>
                </RunSynchronousCommand>
                <RunSynchronousCommand wcm:action="add">
                    <Order>4</Order>
                    <Description>BypassRAMCheck</Description>
                    <Path>cmd /c reg add "HKLM\SYSTEM\Setup\LabConfig" /v "BypassRAMCheck" /t REG_DWORD /d 1 /f</Path>
                </RunSynchronousCommand>
            </RunSynchronous>
		</component>
	</settings>
</unattend>

Speichert die fertige Datei unter dem Name Autounattend.xml im Wurzelverzeichnis eures USB-Sticks. Dieser muss nicht besonders vorbereitet sein – es genügt ein normaler bootbarer Stick mit einem Vanilla Windows 11 Abbild. Doch Achtung: Es darf keine Erweiterung hinter xml im Dateiname stehen wie z.B. .xml.txt! Dies fügen Programme wie Notepad gerne hinzu, wenn dort der Typ auf Textdateien gesetzt ist.

Der Windows 11 Installationsassistent wird beim Booten vom Stick die XML-Datei automatisch laden und mit den Befehlen die Schlüssel im Registrierungseditor setzen, sodass die zuvor gezeigte lästige Handarbeit entfällt. Falls die Datei Fehler enthält, wird beim Start eine entsprechende Meldung erscheinen. An der Farbe des Assistenten lässt sich erkennen, dass er die Datei geladen hat. Der Hintergrund im Fenster entspricht dann nicht mehr dem Bildschirmhintergrund, sondern färbt sich weiß:

Zum Vergleich der Assistent eines Vanilla-Sticks, ohne Autounattend.xml.

Die gleiche Technik wird von Rufus für den anfangs gezeigten Haken genutzt. Da das Programm Open Source ist, kann man dies relativ einfach im Quellcode nachvollziehen: In der Datei wue.c erzeugt die Methode CreateUnattendXml die Datei zur unbeaufsichtigten Installation, während ApplyWindowsCustomization sie entsprechend der Auswahl des Nutzers auf dem Stick ablegt.

Die unbeaufsichtigte Installation kann noch vieles mehr

Wir nutzen in diesem Anwendungsfall nur einen Bruchteil der Funktionen. Etwa ließe sich damit den Online-Kontozwang abschalten, den Microsoft jüngst für die Home-Edition von Windows 11 startete. Wie zuvor kurz erwähnt, kann man damit auch die komplette Installation automatisieren: Von den ersten Schritten wie der Auswahl des Ziellaufwerkes bis hin zur sogenannten Out of the Box Experience (OOBE) von Microsoft, die im Form eines Assistenten beim ersten Start zig Daten abfragt. So kann viel mühselige Klickarbeit gespart werden. Mit der irreführend benannten Eigenschaft ProtectYourPC lässt sich beispielsweise die massive Datensammlung von Windows zumindest etwas eindämmen, wenn man ihn auf den Wert 3 setzt.

Für umfangreichere Anpassungen: DasWindows Assessment and Deployment Kit (ADK)

Man kann sich mithilfe der Dokumentation die einzelnen Komponenten selbst zusammen suchen und in der Autounattend.xml Datei einbauen. Das wird bei komplexeren Dateien schnell unhandlich, zudem es keinerlei Überprüfungen gibt, ob etwa der Syntax des Schemas passt. Ein Stück weit kann das Windows Assesment and Deployment Kit (kurz ADK) abhelfen. Es kodiert außerdem automatisch bestimmte Sonderzeichen, die unter Umständen Probleme bereiten können.

Es muss zunächst händisch von Microsoft heruntergeladen und installiert werden. Die Installationsdatei heißt adksetup.exe. Das Werkzeug steht für Windows 10 und 11 bereit, variiert jedoch je nach eingesetzter Version. Die Funktion Bereitstellungstools aus der Feature-Liste reicht bereits aus und installiert die Anwendung Windows System Image Manager, den man anschließend über das Startmenü findet.

Die Oberfläche ist in insgesamt 5 Bereiche eingeteilt, von denen wir nur 4 benötigen. Zuerst benötigst du ein ISO-Abbild der gewünschten Windows-Version von Microsoft. Dies wird mit einem Archivierungsprogramm wie z.B. 7-Zip entpackt.

In der Windows-Image Box links unten mit der Rechten Maustaste klicken und auf Windows-Image auswählen. Navigiere in den soeben erstellten Ordner des entpackten Abbilds, öffne den Unterordner sources und öffne install.wim. Bestätige die Meldung und warte, bis das Image geladen ist. Anschließend kannst du es ausklappen, sowie den Inhalt von Components durchstöbern. Sie gruppieren verschiedene Funktionen, die du aus der Doku entnehmen kannst: amd64_Microsoft-Windows-Setup_neutral enthält beispielsweise die Festplatten-Partitionierung oder den Lizenzzschlüssel. Components können mit einem Rechtsklick in sogenannten Konfigurationsübergängen hinzugefügt werden:

Bereits ein Linksklick zeigt die im Hauptelement verfügbaren Einstellungen rechts an. Die Abschnitte werden an bestimmten Stellen geladen bzw. verfolgen verschiedene Zwecke, am Häufigsten werden wohl Folgende benötigt:

  • windowsPE ist die portable Laufzeitumgebung, über die Windows installiert wird. Man kann damit also den Installationsassistenten anpassen.
  • generalize soll ein Abbild vorbereiten, welches auf mehreren Computern installiert werden soll. Beispielsweise, um in einer Organisation wie Schulen, Vereinen oder Unternehmen die Geräte einheitlich aufzusetzen.
  • specialize spezialisiert das Abbild, um es für einen bestimmten Computer anzupassen.
  • oobeSystem steht für Out of the Box Experience. So nennt Microsoft den Einrichtungsassistenten, der sich beim ersten Start des Computers öffnet: Er fragt unter anderem den Standort, das Tastaturlayout sowie die Einstellungen zur Übermittlung von Daten an Microsoft ab.

Achte auf die Auswahl der korrekten Architektur! Die meisten Systeme sind heutzutage 64 Bit fähig und benötigen die mit amd64_ beginnenden Abschnitte, nicht wow64_. Falls du die falsche Architektur auswählst, werden die darin enthaltenen Einstellungen vom Windows Installations-Assistent ignoriert! Maßgeblich ist die Architektur der WIM-Datei und damit letztendlich des ISO-Abbildes. In diesem Falle wurde eine 64 Bit ISO verwendet – daher erscheinen die x86_ Einträge für die 32 Bit Version nicht in der Liste.

Nicht alle Abschnitte können überall verwendet werden, weil sie teils für bestimmte Abschnitte entwickelt wurden. Hast du per Rechtsklick einen hinzugefügt, findest du ihn im mittleren Bereich Antwortdatei. Je nach Inhalt kann er angeklickt werden und die Eigenschaften erscheinen im rechten Bereich. Ein Klick auf eine Eigenschaft zeigt unten den Datentyp an. Bei Wahrheitswerten siehst du im rechten Bereich des Wertes zudem eine entsprechende Auswahl, damit keine ungültigen Daten eingegeben werden. Im Falle von Zeichenketten (Strings) hilft ein Blick in die Dokumentation, um herauszufinden, welche Werte zulässig sind.

Manche Abschnitte können über das Plus-Symbol links daneben ausgeklappt werden, wie beispielsweise amd_64_Microsoft-Windows-Shell-Setup_neutral. Darin befinden sich weitere Gruppen, in diesem Beispiel etwa OOBE (also zur Konfiguration des ersten Systemstarts) oder UserAccounts. OOBE ist nicht weiter verschachtelt, hier können wir bestimmte Schritte ausblenden bzw. Vorkonfigurieren, wie der zuvor erwähnte ProtectYourPC = 3, um den Datenschutz etwas zu erhöhen. Manche Elemente sind aber auch tiefer verschachtelt: In UserAccounts können wir ein Administrator-Passwort angeben. Zusätzlich enthält es wiederum die Liste LocalAccounts. Per Rechtsklick darauf lässt sich ein neues, eigenes Konto hinzufügen – in diesem Beispiel heißt es U-Labs.

Vor dem Speichern prüft das Tool, ob die Datei gültig ist. Dies ist in diesem Beispiel etwa dann nicht der Fall, wenn man Pflichtfelder wie den Name des Kontos leer lässt. Man sollte hier auf Nein drücken und im unteren Bereich Meldungen nach den Fehlern suchen, die an einem roten X zu erkennen sind.

Mit solchen Fehlern wird die Installation wahrscheinlich fehlschlagen. Warnungen sind weniger schwerwiegend, sollten dennoch geprüft werden. Die Warnung darüber weist uns darauf hin, dass jedes Konto wiederum verschachtelt die Eigenschaft Password besitzt. Sie ist zwar kein Pflichtfeld, aber wenn sie fehlt, wird kein Kennwort gesetzt. Passwörter werden übrigens standardmäßig nicht im Klartext gespeichert, sondern moderat verschleiert. Praktisch: Ein Doppelklick auf eine Meldung springt zum betroffenen Eintrag. Das spart vor allem bei Listen nervige Sucherei.

Die Meldungen verschwinden jedoch nicht in Echtzeit wieder, nachdem ein Problem korrigiert wurde. Das Werkzeug führt erst beim Speichern eine erneute Prüfung durch. Kommt es dabei zu keinen Fehlern, erscheint ein Auswahldialog, um das Speicherziel festzulegen. Damit diese XML-Datei vor der Installation geladen wird, muss sie direkt auf dem Windows Installations-Stick mit dem Name Autounattend.xml gespeichert sein.

Alternativ lässt sich die Antwortdatei auch über das Menü Extras prüfen, ohne sie zu speichern – wenngleich ich die Speicherung sinnvoll finde, um die Änderungen zu sichern. Beim expliziten Prüfen erscheint ein Dialogfenster, welches sofort wieder verschwindet, falls keine Probleme gefunden werden.

Einsatz in der Praxis

Je nach Grad der Automatisierung erscheinen im Installations-Assistent von Windows nur noch einzelne, wenige Schritte – oder gar keine mehr. Was davon sinnvoller ist, hängt vom persönlichen Anwendungszweck ab. Ich setze nicht mehr viele Systeme mit Windows auf. Wenn ich es tue, dann wird ggf. eine bestimmte Edition benötigt, um zu testen, ob dort etwas funktioniert. Aus diesem Grunde habe ich daher die zu installierende Edition nicht fest in der Datei vorgegeben, wenngleich dies technisch möglich wäre. Wer möchte, kann sich damit eine vollautomatisierte Installation erstellen, die sofort nach dem Einstecken des Sticks durchläuft – bis nach der entsprechenden Wartezeit ein frisch installiertes Windows läuft.

In meiner Konfiguration erscheint nach dem Booten vom Stick nur der Auswahldialog für die Edition. Die Restliche Installation läuft vollautomatisch, bis der Desktop erscheint. Dazu verwende ich die folgende Autounattend.xml, die sowohl unter Windows 10 als auch Windows 11 genutzt werden kann – inklusive dem Entfernen von Microsofts künstlichen Hardwarebeschränkungen unter der neuen 11er Version:

<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
    <settings pass="specialize">
        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <ComputerName>Test-PC</ComputerName>
            <RegisteredOrganization>U-Labs</RegisteredOrganization>
        </component>
        <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <InputLocale>de-DE</InputLocale>
            <SystemLocale>de-DE</SystemLocale>
            <UILanguageFallback>en-US</UILanguageFallback>
            <UILanguage>de-DE</UILanguage>
            <UserLocale>de-DE</UserLocale>
        </component>
        <component name="Microsoft-Windows-TerminalServices-LocalSessionManager" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <!-- Aktiviert RDP, allerdings nicht die FW Regel -->
            <fDenyTSConnections>false</fDenyTSConnections>
        </component>
        <component name="Networking-MPSSVC-Svc" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <FirewallGroups>
                <FirewallGroup wcm:action="add" wcm:keyValue="rd1">
                    <Active>true</Active>
                    <!-- Wird von Windows lokalisiert! Auf Englischen Installationen heißt die Gruppe "Remote Desktop" statt "Remotedesktop"...
                     
                         Funktioniert (manuell getestet):
                         reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
                         netsh advfirewall firewall set rule group="Remotedesktop" new enable=Yes
                    -->
                    <Group>Remotedesktop</Group>
                    <Profile>all</Profile>
                </FirewallGroup>
            </FirewallGroups>
        </component>
         <component name="Microsoft-Windows-TerminalServices-RDP-WinStationExtensions" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
            <UserAuthentication>0</UserAuthentication>
        </component> 
    </settings>
    <settings pass="windowsPE">
        <component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <DiskConfiguration>
                <Disk wcm:action="add">
                    <CreatePartitions>
                        <CreatePartition wcm:action="add">
                            <Order>1</Order>
                            <Size>500</Size>
                            <Type>Primary</Type>
                        </CreatePartition>
                        <CreatePartition wcm:action="add">
                            <Order>2</Order>
                            <Size>260</Size>
                            <Type>EFI</Type>
                        </CreatePartition>
                        <CreatePartition wcm:action="add">
                            <Order>3</Order>
                            <Size>128</Size>
                            <Type>MSR</Type>
                        </CreatePartition>
                        <CreatePartition wcm:action="add">
                            <Extend>true</Extend>
                            <Order>4</Order>
                            <Type>Primary</Type>
                        </CreatePartition>
                    </CreatePartitions>
                    <ModifyPartitions>
                        <ModifyPartition wcm:action="add">
                            <Format>NTFS</Format>
                            <Label>WinRE</Label>
                            <Order>1</Order>
                            <PartitionID>1</PartitionID>
                            <TypeID>DE94BBA4-06D1-4D40-A16A-BFD50179D6AC</TypeID>
                        </ModifyPartition>
                        <ModifyPartition wcm:action="add">
                            <Format>FAT32</Format>
                            <Label>System</Label>
                            <Order>2</Order>
                            <PartitionID>2</PartitionID>
                        </ModifyPartition>
                        <ModifyPartition wcm:action="add">
                            <Order>3</Order>
                            <PartitionID>3</PartitionID>
                        </ModifyPartition>
                        <ModifyPartition wcm:action="add">
                            <Format>NTFS</Format>
                            <Label>Windows</Label>
                            <Letter>C</Letter>
                            <Order>4</Order>
                            <PartitionID>4</PartitionID>
                        </ModifyPartition>
                    </ModifyPartitions>
                    <DiskID>0</DiskID>
                    <WillWipeDisk>true</WillWipeDisk>
                </Disk>
                <WillShowUI>OnError</WillShowUI>
            </DiskConfiguration>
            <ImageInstall>
                <OSImage>
                    <InstallTo>
                        <DiskID>0</DiskID>
                        <PartitionID>4</PartitionID>
                    </InstallTo>
                </OSImage>
            </ImageInstall>
            <UserData>
                <ProductKey>
                    <!-- Alternativ generischer Key - scheint seit den deutlich gelockerten Konditionen von MS seit Win10 nicht mehr wirklich noetig zu sein -->
                    <!-- <Key>VK7JG-NPHTM-C97JM-9MPGT-3V66T</Key> -->
                    <Key />
                    <WillShowUI>OnError</WillShowUI>
                </ProductKey>
                <AcceptEula>true</AcceptEula>
            </UserData>
             
            <!-- Kuenstliche Restriktionen von Windows 11 entfernen - /f ignoriert vorhandene von zB Ventoy -->
            <RunSynchronous>
                <RunSynchronousCommand wcm:action="add">
                    <Order>1</Order>
                    <Description>BypassTPMCheck</Description>
                    <Path>cmd /c reg add "HKLM\SYSTEM\Setup\LabConfig" /v "BypassTPMCheck" /t REG_DWORD /d 1 /f</Path>
                </RunSynchronousCommand>
                <RunSynchronousCommand wcm:action="add">
                    <Order>2</Order>
                    <Description>BypassSecureBootCheck</Description>
                    <Path>cmd /c reg add "HKLM\SYSTEM\Setup\LabConfig" /v "BypassSecureBootCheck" /t REG_DWORD /d 1 /f</Path>
                </RunSynchronousCommand>
                <RunSynchronousCommand wcm:action="add">
                    <Order>3</Order>
                    <Description>BypassCPUCheck</Description>
                    <Path>cmd /c reg add "HKLM\SYSTEM\Setup\LabConfig" /v "BypassCPUCheck" /t REG_DWORD /d 1 /f</Path>
                </RunSynchronousCommand>
                <RunSynchronousCommand wcm:action="add">
                    <Order>4</Order>
                    <Description>BypassRAMCheck</Description>
                    <Path>cmd /c reg add "HKLM\SYSTEM\Setup\LabConfig" /v "BypassRAMCheck" /t REG_DWORD /d 1 /f</Path>
                </RunSynchronousCommand>
 
                <!-- Bildschirm abschalten/Standby etc deaktivieren -->
                <RunSynchronousCommand wcm:action="add">
                    <Order>5</Order>
                    <Description>Hybernate</Description>
                    <Path>cmd /c powercfg /x -hibernate-timeout-ac 0</Path>
                </RunSynchronousCommand>
                <RunSynchronousCommand wcm:action="add">
                    <Order>6</Order>
                    <Description>Hybernate2</Description>
                    <Path>cmd /c powercfg /x -hibernate-timeout-dc 0</Path>
                </RunSynchronousCommand>
                <RunSynchronousCommand wcm:action="add">
                    <Order>7</Order>
                    <Description>Disk</Description>
                    <Path>cmd /c powercfg /x -disk-timeout-ac 0</Path>
                </RunSynchronousCommand>
                <RunSynchronousCommand wcm:action="add">
                    <Order>8</Order>
                    <Description>Disk2</Description>
                    <Path>cmd /c powercfg /x -disk-timeout-dc 0</Path>
                </RunSynchronousCommand>
                <RunSynchronousCommand wcm:action="add">
                    <Order>9</Order>
                    <Description>Screen</Description>
                    <Path>cmd /c powercfg /x -monitor-timeout-ac 0</Path>
                </RunSynchronousCommand>
                <RunSynchronousCommand wcm:action="add">
                    <Order>10</Order>
                    <Description>Screen2</Description>
                    <Path>cmd /c powercfg /x -monitor-timeout-dc 0</Path>
                </RunSynchronousCommand>
                <RunSynchronousCommand wcm:action="add">
                    <Order>11</Order>
                    <Description>Standby</Description>
                    <Path>cmd /c powercfg /x -standby-timeout-ac 0</Path>
                </RunSynchronousCommand>
                <RunSynchronousCommand wcm:action="add">
                    <Order>12</Order>
                    <Description>Standby2</Description>
                    <Path>cmd /c powercfg /x -standby-timeout-dc 0</Path>
                </RunSynchronousCommand>
            </RunSynchronous>
        </component>
        <component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <SetupUILanguage>
                <UILanguage>de-DE</UILanguage>
            </SetupUILanguage>
            <InputLocale>de-DE</InputLocale>
            <SystemLocale>de-DE</SystemLocale>
            <UILanguage>de-DE</UILanguage>
            <UILanguageFallback>en-US</UILanguageFallback>
            <UserLocale>de-DE</UserLocale>
        </component>
    </settings>
    <settings pass="oobeSystem">
        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <UserAccounts>
                <AdministratorPassword>
                    <Value>U-Labs</Value>
                    <PlainText>true</PlainText>
                </AdministratorPassword>
                <LocalAccounts>
                    <LocalAccount wcm:action="add">
                        <Password>
                            <Value>U-Labs</Value>
                            <PlainText>true</PlainText>
                        </Password>
                        <DisplayName>U-Labs</DisplayName>
                        <Name>U-Labs</Name>
                        <Group>Administrators</Group>
                    </LocalAccount>
                </LocalAccounts>
            </UserAccounts>
            <TimeZone>W. Europe Standard Time</TimeZone>
            <OOBE>
                <HideEULAPage>true</HideEULAPage>
                <HideLocalAccountScreen>true</HideLocalAccountScreen>
                <HideOEMRegistrationScreen>true</HideOEMRegistrationScreen>
                <HideOnlineAccountScreens>true</HideOnlineAccountScreens>
                <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
                <ProtectYourPC>3</ProtectYourPC>
            </OOBE>
            <AutoLogon>
                <Password>
                    <Value>U-Labs</Value>
                    <PlainText>true</PlainText>
                </Password>
                <Enabled>true</Enabled>
                <!-- Uint32 Maximalwert -->
                <LogonCount>4294967295</LogonCount>
                <Username>U-Labs</Username>
            </AutoLogon>
            <FirstLogonCommands>
                <SynchronousCommand wcm:action="add">
                    <Order>1</Order>
                    <!-- Muss in HKEY_CURRENT_USER statt LOCAL_MACHINE gesetzt werden, da sonst HKEY_CURRENT_USER ueberschreibt.
                        specialize Schritt/Microsoft-Windows-Deployment Komponente ist ebenfalls zu frueh, da ueberschreibt Windows. -->
                    <CommandLine>cmd /k reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" /v HideFileExt /t REG_DWORD /d 0 /f >> C:\ul_xml_customizations_log.txt && exit</CommandLine>
                    <Description>Dateinamenserweiterung im Explorer anzeigen</Description>
                </SynchronousCommand>
                <SynchronousCommand wcm:action="add">
                    <Order>2</Order>
                    <CommandLine>cmd /c reg add "HKLM\SOFTWARE\Policies\Microsoft\Edge" /v "HideFirstRunExperience" /t REG_DWORD /d 1 && exit</CommandLine>
                    <Description>MS Edge Einrichtungsassistent deaktivieren</Description>
                </SynchronousCommand>
            </FirstLogonCommands>
        </component>
        <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <InputLocale>de-DE</InputLocale>
            <SystemLocale>de-DE</SystemLocale>
            <UILanguage>de-DE</UILanguage>
            <UILanguageFallback>en-US</UILanguageFallback>
            <UserLocale>de-DE</UserLocale>
        </component>
    </settings>
</unattend>

Konkret wird dadurch Windows mit folgenden Eigenschaften nach der Editionsauswahl vollständig automatisiert installiert:

  • Computername wird auf Test-PC gesetzt
  • Überall deutsche Sprache, falls diese nicht verfügbar sein sollte (Fallback) kommt US-Amerikanisches Englisch zum Einsatz
  • Aktivierung von RDP inklusive Freigabe durch die Firewall (für deutsche Installationen)
  • Achtung: Die Festplatte wird komplett Formatiert!
  • Das Administrator-Passwort wird auf U-Labs gesetzt. Zusätzlich entsteht ein neues Konto mit Admin-Rechten, Benutzername und Kennwort lauten U-Labs
  • Automatische Anmeldung mit dem U-Labs Konto (begrenzt auf maximal 4294967295 Anmeldungen seitens Microsoft)
  • Die Dateierweiterungen im Windows Explorer werden angezeigt (Beispiel für OOBE-Anpassungen per Registry)

Weiterer Ausbau

Wer noch einen Schritt weiter gehen möchte, kann Windows über die angebotenen Einstellungen hinaus anpassen: Sehr viele Einstellungen lassen sich über CMD- oder PowerShell-Befehle setzen bzw. verändern. Theoretisch ist auch die automatische Installation von Drittanbieter-Programmen denkbar. Für derartige Aufgaben stellt Microsofts Werkzeug jedoch keinerlei Vorlagen bereit.

Lediglich über FirstLogonCommands kann ein beliebiger Befehl bei der ersten Anmeldung ausgeführt werden. Für Windows 11 wird dies genutzt, um als SynchronousCommand (synchroner Befehl) die notwendigen Registry-Schlüssel zu setzen, um die künstlichen Installationsbeschränkungen von Microsoft zu umgehen. Zusätzlich könnte man dort beispielsweise den Paketmanager WinGet installieren, um verschiedene Programme wie z.B. die Browser Firefox/Chrome installieren zu können.

Auch diesen kann man zu verschiedenen Konfigurationsübergängen hinzufügen: In windowsPE ist er nützlich, um die notwendigen Registry-Schlüssel zur Entfernung der künstlichen Installationsbeschränkungen zu entfernen. Möchten wir darüber hinaus das installierte Windows dauerhaft anpassen, nützt uns dieser Konfigurationsübergang wenig – hierfür kann etwa der specialize Übergang eingesetzt werden.

Im folgenden Beispiel wird ein Schlüssel zur Registry hinzugefügt, der die Anzeige von Dateiendungen im Explorer aktiviert. Standardmäßig ist das nicht der Fall, was ich für wenig sinnvoll halte: Steht dort nur adksetup ist möglicherweise nicht jedem sofort klar, dass es sich um ein ausführbares Programm handelt. Mit dieser Änderung wird daraus adksetup.exe. Sie betrifft nicht nur Exe-Dateien, sondern jegliche Dateitypen.

Weiterführende Drittanbieter-Seiten

  • https://www.tenforums.com/tutorials/96683-create-media-automated-unattended-install-windows-10-a.html
  • https://learn.microsoft.com/en-us/windows-hardware/customize/desktop/unattend/microsoft-windows-shell-setup-autologon-logoncount

Leave a Reply