Windows 2016 Nano Server Part2
Hallo zusammen,
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 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.
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:
-
How Configuration Passes Work https://technet.microsoft.com/en-us/library/dd744341(v=ws.10).aspx
-
DISM-Befehlszeilenoptionen für die Imageverwaltung https://msdn.microsoft.com/de-de/library/hh825258.aspx
-
Netsh commands for Interface IP https://technet.microsoft.com/en-us/library/bb490943.aspx