Anzeige

Am Puls von Microsoft

Anzeige

Frage WDS auf Server 2019 - spezielle Fragen

g-force

Inventar
Bevor ich zu sehr ins Detail gehe:
Ist jemand mit Server 2019 (als WDS-Server zur Windows-Installation) vertraut und kann Fragen zur Unattended-Installation beantworten?
 
Anzeige
Kommt drauf an, worum es genau geht.

Frag doch einfach mal. Ob jemand sinnvolle Dinge dazu sagen kann, wirst du dann sehen.
 
Ich hab mal hier meine zwei Files mit reingepackt. Die Plattenkonfiguration findet im ersten Schritt statt. Im zweiten gibts nur noch die Anpassungen des Systems.

Da ist bei mir auch ein WipeDisk drin. Die Config läuft hier so seit Jahren für 10 und 11, wobei 11 mit einer Windows 10 boot.wim installiert wird.

XML:
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
    <settings pass="windowsPE">
        <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>en-us</UILanguage>
            </SetupUILanguage>
            <InputLocale></InputLocale>
            <SystemLocale></SystemLocale>
            <UILanguage>en-us</UILanguage>
            <UILanguageFallback></UILanguageFallback>
            <UserLocale></UserLocale>
        </component>
        <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>1000</Size>
                  <Type>Primary</Type>
                </CreatePartition>
                <CreatePartition wcm:action="add">
                  <Order>2</Order>
                  <Size>100</Size>
                  <Type>EFI</Type>
                </CreatePartition>
                <CreatePartition wcm:action="add">
                  <Order>3</Order>
                  <Size>16</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">
                  <Order>1</Order>
                  <Format>NTFS</Format>
                  <Label>WinRE</Label>
                  <PartitionID>1</PartitionID>
                  <TypeID>de94bba4-06d1-4d40-a16a-bfd50179d6ac</TypeID>
                </ModifyPartition>
                <ModifyPartition wcm:action="add">
                  <Order>2</Order>
                  <PartitionID>2</PartitionID>
                  <Format>FAT32</Format>
                  <Label>System</Label>
                </ModifyPartition>
                <ModifyPartition wcm:action="add">
                  <Order>3</Order>
                  <PartitionID>3</PartitionID>
                </ModifyPartition>
                <ModifyPartition wcm:action="add">
                  <Order>4</Order>
                  <Format>NTFS</Format>
                  <Letter>C</Letter>
                  <PartitionID>4</PartitionID>
                </ModifyPartition>
              </ModifyPartitions>
              <DiskID>0</DiskID>
              <WillWipeDisk>true</WillWipeDisk>
            </Disk>
            <DisableEncryptedDiskProvisioning>false</DisableEncryptedDiskProvisioning>
            <WillShowUI>OnError</WillShowUI>
          </DiskConfiguration>
            <ImageInstall>
                <OSImage>
                    <InstallFrom>
                        <Credentials>
                            <Domain>example.com</Domain>
                            <Password>xxxxxxx</Password>
                            <Username>installuser</Username>
                        </Credentials>
                        <Path>\\wdsserver\REMINST\Images\Windows 10\install.wim</Path>
                    </InstallFrom>
                    <InstallToAvailablePartition>true</InstallToAvailablePartition>
                    <WillShowUI>OnError</WillShowUI>
                </OSImage>
            </ImageInstall>
            <UserData>
                <AcceptEula>true</AcceptEula>
                <FullName>IT</FullName>
                <Organization>xxxxx</Organization>
                <ProductKey>
                    <Key>xxxxxxxx</Key>
                    <WillShowUI>OnError</WillShowUI>
                </ProductKey>
            </UserData>
            <WindowsDeploymentServices>
                <Login>
                    <Credentials>
                        <Domain>example.com</Domain>
                        <Password>xxxxxxxxx</Password>
                        <Username>installuser</Username>
                    </Credentials>
                </Login>
                <ImageSelection>
                    <InstallImage>
                        <ImageGroup>Windows 10</ImageGroup>
                        <ImageName>Windows 10 Enterprise</ImageName>
                    </InstallImage>
                    <InstallTo>
                        <DiskID>0</DiskID>
                        <PartitionID>4</PartitionID>
                    </InstallTo>
                </ImageSelection>
            </WindowsDeploymentServices>
        </component>
    </settings>
    <cpi:offlineImage cpi:source="wim:d:/windows10/wim/install.wim#Windows 10 Enterprise" xmlns:cpi="urn:schemas-microsoft-com:cpi" />
</unattend>

Und das ist dann die Anpassung:

XML:
<?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">
            <AutoLogon>
                <Password>
                    <Value>xxxxxxxx</Value>
                    <PlainText>true</PlainText>
                </Password>
                <Domain>example.com</Domain>
                <Enabled>true</Enabled>
                <LogonCount>1</LogonCount>
                <Username>installuser</Username>
            </AutoLogon>
            <ProductKey>xxxxxxx</ProductKey>
            <TimeZone>W. Europe Standard Time</TimeZone>
            <ComputerName>%MACHINENAME%</ComputerName>
            <OEMInformation>
                <SupportURL>xxxxxxx</SupportURL>
                <SupportPhone>xxxxxxx</SupportPhone>
                <Logo>C:\Windows\System32\OemLogo.bmp</Logo>
            </OEMInformation>
        </component>
        <component name="Microsoft-Windows-UnattendedJoin" 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">
            <Identification>
                <JoinDomain>example.com</JoinDomain>
                <UnsecureJoin>True</UnsecureJoin>
            </Identification>
        </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">
            <OOBE>
                <HideEULAPage>true</HideEULAPage>
                <HideWirelessSetupInOOBE>true</HideWirelessSetupInOOBE>
                <NetworkLocation>Work</NetworkLocation>
                <ProtectYourPC>1</ProtectYourPC>
            </OOBE>
            <UserAccounts>
                <LocalAccounts>
                    <LocalAccount wcm:action="add">
                        <Password>
                            <Value>xxxxxxxx</Value>
                            <PlainText>false</PlainText>
                        </Password>
                        <Description>Local Administrator</Description>
                        <DisplayName>Local Administrator</DisplayName>
                        <Group>Administrators</Group>
                        <Name>admin</Name>
                    </LocalAccount>
                </LocalAccounts>
            </UserAccounts>
            <TimeZone>W. Europe Standard Time</TimeZone>
            <VisualEffects>
                <SystemDefaultBackgroundColor>2</SystemDefaultBackgroundColor>
            </VisualEffects>
            <FirstLogonCommands>
                <SynchronousCommand wcm:action="add">
                    <CommandLine>cmd /c \\wdsserver\packages\postinstall.cmd</CommandLine>
                    <Description>Run Postinstall Script</Description>
                    <Order>1</Order>
                    <RequiresUserInput>true</RequiresUserInput>
                </SynchronousCommand>
            </FirstLogonCommands>
        </component>
    </settings>
    <cpi:offlineImage cpi:source="wim:d:/windows10/wim/install.wim#Windows 10 Enterprise" xmlns:cpi="urn:schemas-microsoft-com:cpi" />
</unattend>
 
@IngoBingo Vielen Dank für deine Unterstützung! Unsere Beiträge haben sich ja knapp überschnitten, aber deine Lösung bestätigt mein Vorgehen. Ich finde in deinen XML auch einige interessante Einträge, die ich evtl. noch übernehme.

Zu welchem Zeitpunkt wird denn diese Zeile ausgeführt?
<CommandLine>cmd /c \\wdsserver\packages\postinstall.cmd</CommandLine>
 
Nach der Fertigstellung der Installation. Es findet dann noch ein Autologon statt und daraufhin startet das verlinkte Script. Das ruft dann an sich ein Powershell Script auf, welches bisher die ganzen Anwendungen installiert hat.

Mittlerweile gehen wir immer mehr in Richtung Intune, insofern macht das Script mittlerweile nicht mehr ganz so viel.
 
Ich löse das momentan noch mit $OEM$, womit ich eine CMD in den Autostart des Administrators lege. Die CMD erstellt ein Netzlaufwerk und ruft dann ein Script auf dem Server auf.
 
@g-force
Wenn du es trotzdem mit diskpart bewerkstelligen möchtest,hier der Abschnitt meiner Antwortdatei.
<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State">
<settings pass="offlineServicing"></settings>
<settings pass="windowsPE">
<component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<SetupUILanguage>
<UILanguage>de-DE</UILanguage>
</SetupUILanguage>
<InputLocale>0407:00000407</InputLocale>
<SystemLocale>de-DE</SystemLocale>
<UILanguage>de-DE</UILanguage>
<UserLocale>de-DE</UserLocale>
</component>
<component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<ImageInstall>
<OSImage>
<InstallTo>
<DiskID>0</DiskID>
<PartitionID>3</PartitionID>
</InstallTo>
</OSImage>
</ImageInstall>
<UserData>
<ProductKey>
<Key>NPPR9-FWDCX-D2C8J-H872K-2YT43</Key>
</ProductKey>
<AcceptEula>true</AcceptEula>
</UserData>
<RunSynchronous>
<RunSynchronousCommand>
<Order>1</Order>
<Path>cmd.exe /c echo SELECT DISK=0 &gt;&gt; X:\diskpart.txt</Path>
</RunSynchronousCommand>
<RunSynchronousCommand>
<Order>2</Order>
<Path>cmd.exe /c echo CLEAN &gt;&gt; X:\diskpart.txt</Path>
</RunSynchronousCommand>
<RunSynchronousCommand>
<Order>3</Order>
<Path>cmd.exe /c echo CONVERT GPT &gt;&gt; X:\diskpart.txt</Path>
</RunSynchronousCommand>
<RunSynchronousCommand>
<Order>4</Order>
<Path>cmd.exe /c echo CREATE PARTITION EFI SIZE=100 &gt;&gt; X:\diskpart.txt</Path>
</RunSynchronousCommand>
<RunSynchronousCommand>
<Order>5</Order>
<Path>cmd.exe /c echo FORMAT QUICK FS=FAT32 LABEL="System" &gt;&gt; X:\diskpart.txt</Path>
</RunSynchronousCommand>
<RunSynchronousCommand>
<Order>6</Order>
<Path>cmd.exe /c echo CREATE PARTITION MSR SIZE=16 &gt;&gt; X:\diskpart.txt</Path>
</RunSynchronousCommand>
<RunSynchronousCommand>
<Order>7</Order>
<Path>cmd.exe /c echo CREATE PARTITION PRIMARY &gt;&gt; X:\diskpart.txt</Path>
</RunSynchronousCommand>
<RunSynchronousCommand>
<Order>8</Order>
<Path>cmd.exe /c echo SHRINK MINIMUM=500 &gt;&gt; X:\diskpart.txt</Path>
</RunSynchronousCommand>
<RunSynchronousCommand>
<Order>9</Order>
<Path>cmd.exe /c echo FORMAT QUICK FS=NTFS LABEL="Windows" &gt;&gt; X:\diskpart.txt</Path>
</RunSynchronousCommand>
<RunSynchronousCommand>
<Order>10</Order>
<Path>cmd.exe /c echo CREATE PARTITION PRIMARY &gt;&gt; X:\diskpart.txt</Path>
</RunSynchronousCommand>
<RunSynchronousCommand>
<Order>11</Order>
<Path>cmd.exe /c echo FORMAT QUICK FS=NTFS LABEL="Recovery" &gt;&gt; X:\diskpart.txt</Path>
</RunSynchronousCommand>
<RunSynchronousCommand>
<Order>12</Order>
<Path>cmd.exe /c echo SET ID="de94bba4-06d1-4d40-a16a-bfd50179d6ac" &gt;&gt; X:\diskpart.txt</Path>
</RunSynchronousCommand>
<RunSynchronousCommand>
<Order>13</Order>
<Path>cmd.exe /c echo GPT ATTRIBUTES=0x8000000000000001 &gt;&gt; X:\diskpart.txt</Path>
</RunSynchronousCommand>
<RunSynchronousCommand>
<Order>14</Order>
<Path>cmd.exe /c diskpart /s X:\diskpart.txt &gt;&gt; X:\diskpart.log</Path>
</RunSynchronousCommand>
</RunSynchronous>
</component>
 
Bei nur einer verbauten Festplatte/Datenträger funktioniert die ganze Geschichte jetzt reibungslos. Der Client startet über PXE, meldet sich automatisch am WDS an und springt in die Image-Auswahl. Nach Image-Auswahl geht es direkt in die Installation, die Partitionierung wird entsprechend der XML ausgeführt.

Bei zwei vorhandenen Festplatten (1x NVME plus 1x HDD) gestaltet sich die Geschichte aber schwieriger:
Die XML unterscheidet natürlich nicht zwischen schneller NVME und der HDD (die ja eigentlich nur als Datengrab verwendet werden soll). Leider wird wohl grundsätzlich eine HDD als "Datenträger 0" erkannt und dementsprechend als Installations-Ziel verwendet. Das sollte nicht so sein - das OS soll natürlich auf die schnelle NVME.

Wie kann ich der XML beibringen, die NVME auszuwählen?
 
ich fürchte mit den Parametern disk0 oder disk1 wirst du nicht viel erreichen, weil Windows ja die Sata Laufwerke zuerst zählt

im Netz gibts da einen Trick

Put this Run Commandline step before partition step. It will set the NVME disk as disk 0.
PowerShell -ExecutionPolicy Bypass -Command " (New-Object -COMObject Microsoft.SMS.TSEnvironment).Value('OSDDiskIndex') = (Get-PhysicalDisk | Where-Object BusType -eq 'NVMe').DeviceID "

aber schau dir mal den folgenden Link an, da vor allem den langen Post von johngalt


da findest du sehr viele Infos und Querverweise
 
Das sind tatsächlich so viele Info, daß ich da nicht wirklich durchblicke. Viele Tipps beziehen sich auch auf MDT, was wiederum andere Probleme nach sich zieht - ich kann mich erinnern, daß ich damals an der Image-Auswahl gescheitert bin.
Wie müßte ich denn diese Commandline in die XML einbauen? Oder muß ich die "boot.wim" bearbeiten?
 
diese PowerShell-Cmdlets sind Bestandteil vom Microsoft System Center Configuration Manager (SCCM)

ob sich das so ohne weiteres für dein Vorhaben übertragen läßt, kann ich dir nicht beantworten

die XML Antwortdatei ist dafür sicherlich ungeeignet
 
Die XML sind dafür ziemlich sicher nicht geeignet.
Ich habe einen PS-Befehl in die "Startup.cmd" der boot.wim eingebaut, der zumindest in VM ohne Fehlermeldung durchläuft. Allerdings habe ich (noch) nicht die entsprechende Hardware zur Verfügung, um die echte Wirksamkeit des Befehls zu überprüfen.
 
Ich bin mittlerweile in meiner Testumgebung wieder bei MDT angekommen. Nach vielen Versuchen und Irrungen stehe ich aber nun vor einem Problem, das ich mir nicht erklären kann. Ich habe leider neben Hyper-V nur einen Laptop (Lenovo ThinkPad 470s) zur Verfügung. Eine aktuelle Treibersammlung liegt vor und ist im MDT eingepflegt. Die Treiberinjection erfolgt auch, ich kann das im Ablauf sehen. Trotzdem werden die Treiber bei der Installation nicht verwendet, als wären sie nicht vorhanden - es wird alles über WU nachgeladen, viel natürlich auch über "Optionale Updates". Das ist ja genau das, was ich nicht möchte. Ein Test mit vorab integrierten Treibern (NTlite) bringt das gewünschte Ergebnis, aber es soll ja mit MDT laufen.
Wohin kopiert MDT die Treiber, warum werden sie nicht erkannt?
 
Fehler gefunden.
In der "unattend.xml" fehlte ein Eintrag, der den Treiberpfad definiert. So wurde zwar angezeigt, welche Treiber installiert werden, aber später fehlte dann der passende Pfad. In einer "originalen" XML war der Eintrag vorhanden, in meiner eigenen fehlte er. Ich konnte das dann korrigieren:

AddDriverPath.JPG
 
MDT führt Scripte wohl grundsätzlich "hidden" aus. Ich verbinde den Client per Tasksequence/Script mit einem Netzlaufwerk und rufe dort eine "install.cmd" auf. Ich sehe anhand Veränderungen, daß die "install.cmd" (bis zu einer Aufforderung zu einer Eingabe) abläuft, aber das Konsolenfenster ist nicht da, es kann keine Eingabe getätigt werden - das Script hängt fest. Ich möchte die aufgerufene "install.cmd" sehen, damit Eingaben vorgenommen werden können.
Wo muß ich ansetzen?
 
Ich pushe meinen letzten Post mal, da ich bisher keine Lösung gefunden habe.
Wie kann ich (durch MDT aufgerufene) Scripte sichtbar machen?
 
Anzeige
Oben