Windows 2016 Nano Server Part2

Hallo zusammen,

Die Basics habe ich ja bereits in folgendem Blog Artikel beschrieben Windows 2016 Nano Server Part1

Domain Join

Dami ein Computer zum Active Directory hinzugefügt werden kann, muss von vorgängig das Konto im AD Provisionieren. Das geht mit folgendem Befehl auf dem Domain Controller, welcher ein File zur späteren Verwendung erzeugt

djoin.exe /provision /domain corp.icewolf.ch /machine nano01 /savefile C:\temp\nano01.txt

So sieht das File hinterher aus

Und im AD ist der Computeraccount angelegt.

Erzeugen des Nano Images

Nun erzeuge ich wieder die Nano VHD. Den Computername und das DNS Package gebe ich als Parameter an. Da auf alle Fälle ein Admin Passwort hinterlegt werden muss, habe ich das ebenfalls eingefügt.

D:
cd .\NanoServer\
Import-Module .\NanoServerImageGenerator.psm1

New-NanoServerImage -MediaPath D:\ -BasePath C:\Nanotemp\ -TargetPath C:\Nanoserver\Nano01.vhd -Language EN-US -AdministratorPassword (ConvertTo-SecureString "MySecurePassword" -AsPlainText -Force) -OEMDrivers -DriversPath C:\Nanotemp\Extra\Drivers\ -ComputerName NANO01 -Packages Microsoft-NanoServer-DNS-Package

Nun müssen noch die Unattend.xml und das SetupComplete.cmd File ins Image geladen werden. Die Files müssen in folgenden Pfad:

Windows\Setup\Scripts\SetupComplete.cmd
Windows\panther\unattend.xml

In einigen Anleitungen wird das DISM Command benutzt um das Image zu Mounten. Das MountDir muss vorhanden und leer sein. In meinem Script verwende ich jedoch die Powershell Befehle Mount-DiskImage  und Dismount-DiskImage.

Dism /Mount-Image /ImageFile:C:\Nanoserver\NanoServer.vhd /Index:1 /MountDir:C:\temp\mountdir

Mit dem folgenden Befehl, werden die Veränderungen angewendet und das Image Unmounted.

Dism /Unmount-Image /MountDir:C:\Nanotemp\mount /Commit

Unattend.xml

Nachfolgend die Unattend.xml, welche ich verwendet habe. Auch wenn hier der Computername drin steht, ich habe es nicht geschafft mit dem Unattend.xml den Computernamen zu setzen. Ich habe deshalb beim erzeugen der VHD den Parameter "-ComputerName NANO01" verwendet.

Wie ihr sehen könnt, habe ich das Passwort in der unattend.xml Codiert abgespeichert. Eigentlich ist das ganz einfach: Das Passwort + "AdministratorPassword" in einen Unicode String speichern und in Base64 umwandeln. Dafür kann man folgenden Powershell befehle verwenden 

#Encode Password

$b = [System.Text.Encoding]::Unicode.GetBytes("MySecurePasswordAdministratorPassword")

[System.Convert]::ToBase64String($b)

 

#Decode Password

$encryptedpwd = "TQB5AFMAZQBjAHUAcgBlAFAAYQBzAHMAdwBvAHIAZABBAGQAbQBpAG4AaQBzAHQAcgBhAHQAbwByAFAAYQBzAHMAdwBvAHIAZAA="

[System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($encryptedpwd))

Die Timezones sind hier dokumentiert https://technet.microsoft.com/de-ch/library/cc749073(v=ws.10).aspx

<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:schemas-microsoft-com:unattend">
  <settings pass="offlineServicing">
    <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
      <ComputerName>NANO01</ComputerName>
    </component>
  </settings>

  <settings pass="oobeSystem">
    <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
      <UserAccounts>
        <AdministratorPassword>          <Value>UABhAHMAcwB3AG8AcgBkAEEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIAUABhAHMAcwB3AG8AcgBkAA==</Value>
          <PlainText>False</PlainText>
        </AdministratorPassword>
      </UserAccounts>
      <TimeZone>W. Europe Standard Time</TimeZone>
    </component>
  </settings>
</unattend>

SetupComplete.cmd

Die SetupComplete.cmd wird einmalig beim ersten Start ausgeführt. Dabei setze ich die gewünsche IP und DNS Server, passe die Firewall Rules an, führe den Domain Join aus und restarte den Server.

netsh interface ipv4 set address "Ethernet0" static 172.21.175.99 255.255.255.0 172.21.175.1
netsh Interface ipv4 set dnsserver "Ethernet0" static 172.21.175.20
netsh advfirewall firewall set rule name="Windows Remote Management (HTTP-In)" new enable=yes profile=any

netsh advfirewall firewall set rule group=”Remote Service Management” new enable=yes profile=any

netsh advfirewall firewall set rule group=”Remote Event Log Management” new enable=yes profile=any
netsh advfirewall firewall set rule name="File and Printer Sharing (Echo Request - ICMPv4-In)" new enable=yes profile=any
netsh advfirewall firewall set rule name="Core Networking - Group Policy (LSASS-Out)" new enable=yes profile=any
netsh advfirewall firewall set rule name="Core Networking - Group Policy (NP-Out)" new enable=yes profile=any
netsh advfirewall firewall set rule name="Core Networking - Group Policy (TCP-Out)" new enable=yes profile=any
netsh advfirewall firewall set rule name="Core Networking - DNS (UDP-Out)" new enable=yes profile=any
djoin /requestodj /loadfile C:\Windows\Setup\Scripts\DjoinNano01.txt /windowspath C:\Windows /localos
Shutdown -r -t 0

Image mit unattend.xml und SetupComplete.cmd ausstatten

Mit folgendem Script, wird das Image gemountet und die Unattend.xml, das SetupComplete.cmd und die Djoin Datei ins Image kopiert und anschliessend das Image wieder dismounted.

Einige Teile des Scripts habe ich von hier kopiert: Quick Guide - Deploying Nano Server using PowerShell http://deploymentresearch.com/Research/Post/479/Quick-Guide-Deploying-Nano-Server-using-PowerShell

#Deploy Unattended.xml and SetupComplete.cmd
$NanoImage = "C:\Nanoserver\Nano01.vhd"
Mount-DiskImage -ImagePath $NanoImage
$NanoVolume = Get-DiskImage –ImagePath $NanoImage | Get-Disk | Get-Partition | Get-Volume

# Copy the unattend.xml file to the offline Windows\Panther folder
$NanoUnattendFile = "C:\Nanotemp2\Unattend.xml"
# New-Item -ItemType Directory "$($NanoVolume.DriveLetter):\Windows\Panther"
Copy-Item $NanoUnattendFile "$($NanoVolume.DriveLetter):\Windows\Panther\Unattend.xml"
 
# Copy the SetupComplete.cmd file
$SetupCompleteCMDFile = "C:\Nanotemp2\SetupComplete.cmd"
New-Item -ItemType Directory "$($NanoVolume.DriveLetter):\Windows\Setup"
New-Item -ItemType Directory "$($NanoVolume.DriveLetter):\Windows\Setup\Scripts"
Copy-Item $SetupCompleteCMDFile "$($NanoVolume.DriveLetter):\Windows\Setup\Scripts"

$DJoinBlob = "C:\Nanotemp2\DjoinNano01.txt"
Copy-Item $DJoinBlob "$($NanoVolume.DriveLetter):\Windows\Setup\Scripts"

Dismount-DiskImage -ImagePath $NanoImage

Nach dem Starten der VHD und dem Reboot kann man sich als Domain User einloggen. Im untenstehenden Screenshot sieht man, dass der Domain Join geklappt hat.

Powershell Remoting

Im Part1 dieses Artikels habe ich gezeigt, dass man die IP in die Trusted Hosts aufnehmen musste. Das ist als Domain Computer nicht mehr notwendig.

Clear-Item WSMan:\localhost\Client\TrustedHosts
Get-Item WSMan:\localhost\Client\TrustedHosts
$cred = Get-Credential
Enter-PSSession -ComputerName  nano01.corp.icewolf.ch -Credential $cred

Aktivieren des Packages

Bei der Erzeugung der VHD habe ich ja den Parameter "-Packages Microsoft-NanoServer-DNS-Package" mitgegeben. Das Package muss aber erst noch aktiviert werden, bevor der DNS Server verwendet werden kann.

Enable-WindowsOptionalFeature -Online -FeatureName DNS-Server-Full-Role

Nach der Installation müssen auch noch die Firewall Rules für den DNS Server aktiviert werden

netsh advfirewall firewall set rule name="DNS (TCP, Incoming)" new enable=yes profile=any
netsh advfirewall firewall set rule name="DNS (UDP, Incoming)" new enable=yes profile=any

Nachdem man das Powershell Modul  "DNSServer" geladen hat, kann man die DNS Befehle mit folgendem Befehl anzeigen lassen.

Get-Command -Module DNSServer

Mit den folgenden Befehlen wird eine neue DNS Zone angelegt und ein neuer A Record in der DNS Zone erfasst.

Import-Module DNSServer

Add-DnsServerPrimaryZone -ZoneName contoso.com -ZoneFile contoso.com.dns

Add-DnsServerResourceRecordA -Name www -ZoneName contoso.com -IPv4Address 10.0.0.2

Nslookup www.contoso.com 172.21.175.99

Nach dem Installieren des Packages kann ich den DNS Server auch bequem über den DNS Manager eines anderen Servers verwalten.

Was hat geklappt

  • IP und DNS Server über SetupComplete.cmd setzen
  • Firewall über SetupComplete.cmd setzen
  • Domain Join über SetupComplete.cmd setzen
  • Encrypted / Dycrypt Password in Unatted.xml
  • Mount / Unmount VHD über Powershell anstatt über DISM

Was hat nicht geklappt

  • Hostname über Unattend.xml setzen
  • Domain Join über Unattend.xml setzen

Weitere Informationen:

Grüsse
Andres Bohren