Windows Server auf einem VPS einrichten: die ersten Schritte
Die Checkliste nach der Bereitstellung, in der richtigen Reihenfolge: Lizenz prüfen, Kennwort setzen, Zeitzone, Updates, Firewall, RDP absichern, Datenträger und Rollen. Inklusive der Stellen, an denen es schiefgeht.
Ein frisch bereitgestellter Windows Server sieht fertig aus: RDP antwortet, der Desktop erscheint, der Server-Manager startet. Genau das ist die Falle. Zwischen "RDP antwortet" und "produktionstauglich" liegen etwa zwanzig Minuten Arbeit, und deren Reihenfolge entscheidet darüber, ob Sie danach noch hineinkommen.
Hier stehen die Schritte in der Reihenfolge, in der sie gemacht werden müssen, jeweils mit dem Kontrollbefehl und mit den Fehlermeldungen im Wortlaut.
Zuerst die Lizenz klären, nicht zuletzt
Windows Server ist nicht Teil des Serverpreises. KernelHost ist kein Microsoft-SPLA-Partner und vermietet keine Windows-Lizenzen. Windows läuft hier im Modell Bring Your Own License: Die Lizenz wird von einem zertifizierten Microsoft-Partner oder direkt von Microsoft bezogen und vom Kunden eingebracht.
Zum Testen, Evaluieren und für Migrationsproben gibt es die kostenlose Evaluierungsversion von Microsoft mit 180 Tagen Laufzeit. Die ist vollwertig, sie ist nur zeitlich begrenzt und nicht für Produktion gedacht.
Prüfen Sie als Allererstes, was auf dem Server tatsächlich läuft:
slmgr /dlv
slmgr /xpr
slmgr /dlv zeigt den Editionsnamen. Steht dort ServerStandardEval oder ServerDatacenterEval, läuft eine Evaluierung. slmgr /xpr nennt das Ablaufdatum im Klartext. Beide Befehle öffnen ein Popup-Fenster, was auf Server Core stört. Dort nutzen Sie stattdessen cscript C:\Windows\System32\slmgr.vbs /dlv.
Was passiert, wenn die 180 Tage ablaufen
Der Server läuft weiter, aber der Windows License Monitoring Service fährt ihn nach etwa einer Stunde Betriebszeit herunter, immer wieder. Rechts unten steht ein Wasserzeichen mit dem Hinweis, dass die Windows-Lizenz abgelaufen ist. Wer das zum ersten Mal sieht, sucht meist stundenlang nach einem Hardware- oder Treiberfehler, weil das Muster wie ein Watchdog aussieht.
Der saubere Ausweg ist die Umstellung auf eine echte Lizenz. Das geht ohne Neuinstallation:
DISM /Online /Set-Edition:ServerStandard /ProductKey:XXXXX-XXXXX-XXXXX-XXXXX-XXXXX /AcceptEula
Drei Punkte, an denen das regelmäßig scheitert:
- Es geht nur von Eval zur gleichnamigen Vollversion oder aufwärts. Von Datacenter Evaluation zurück auf Standard führt DISM nicht durch.
- Der Schlüssel muss ein Retail-, MAK- oder KMS-Schlüssel sein. Passt er nicht, meldet DISM Error: 1168 oder der Lizenzdienst 0xC004F050 mit dem Hinweis, dass der Product Key ungültig ist. Das heißt fast nie "gefälschter Schlüssel", sondern "falscher Schlüsseltyp für diesen Weg".
- Ein Domänencontroller lässt sich nicht von Evaluation auf Retail umstellen. Wer auf der Evaluierung schon
Install-ADDSForestausgeführt hat, muss die Rolle erst wieder abbauen. Das ist der teuerste Fehler in diesem Artikel, deshalb steht die Lizenzfrage hier ganz oben und nicht am Ende.
Ein Hinweis zur Beschaffung der Installationsquelle: Eigene ISO-Abbilder lassen sich bei KernelHost nicht hochladen, Windows kommt aus dem Image-Katalog im Kundenbereich. Die Lizenz bringen Sie mit, das Abbild ist bereits da.
Administratorpasswort ändern, ohne sich auszusperren
Das ausgelieferte Kennwort steht in der Bereitstellungsmail und gehört sofort ersetzt. Der übliche Weg über net user Administrator * funktioniert, hat aber den Nachteil, dass er bei Richtlinienverstößen nur eine dürre Meldung liefert. Besser:
$pw = Read-Host -AsSecureString -Prompt "Neues Kennwort"
Set-LocalUser -Name "Administrator" -Password $pw
Kommt Das Kennwort entspricht nicht den Anforderungen an die Kennwortkomplexität, greift die lokale Richtlinie: mindestens acht Zeichen und drei von vier Zeichenklassen. Prüfen können Sie die geltenden Werte mit net accounts.
Sinnvoller als das Umbenennen des Kontos ist ein zweites, benanntes Administratorkonto. Damit haben Sie einen Rückweg, falls das eine Konto gesperrt wird:
$pw = Read-Host -AsSecureString -Prompt "Kennwort für svcadmin"
New-LocalUser -Name "svcadmin" -Password $pw -PasswordNeverExpires
Add-LocalGroupMember -SID "S-1-5-32-544" -Member "svcadmin"
Warum die SID statt des Gruppennamens? Weil die Administratorengruppe auf einem deutschen System Administratoren heißt und auf einem englischen Administrators. Skripte, die den Namen fest verdrahten, brechen beim ersten Sprachwechsel mit Die angegebene lokale Gruppe ist nicht vorhanden ab. S-1-5-32-544 ist auf jedem Windows dieselbe.
Die Sperrfalle, die es unter Windows Server 2025 wirklich gibt
Bis einschließlich Windows Server 2019 konnte das eingebaute Administratorkonto über Netzwerkanmeldungen nicht gesperrt werden. Seit einem kumulativen Update für Server 2022 und standardmäßig unter Windows Server 2025 ist das anders: Die Kontosperrung greift ab fünf fehlgeschlagenen Versuchen, und sie erwischt auch den eingebauten Administrator.
Auf einem VPS mit offenem Port 3389 heißt das konkret: Die Anmeldeversuche automatisierter Scanner sperren Ihnen das Konto, bevor Sie selbst dazu kommen. Sie tippen ein korrektes Kennwort und bekommen trotzdem Das verwendete Benutzerkonto ist gesperrt und kann nicht zur Anmeldung verwendet werden.
Der Weg heraus, wenn es passiert ist:
- Über die Konsole im Kundenbereich anmelden statt über RDP.
- Die Sperre lösen, entweder durch Abwarten der Sperrdauer (
net accountszeigt sie an, Standard sind zehn Minuten) oder direkt:
$u = [ADSI]"WinNT://$env:COMPUTERNAME/Administrator,user"
$u.IsAccountLocked = $false
$u.SetInfo()
Die dauerhafte Lösung ist nicht, die Sperrschwelle hochzudrehen, sondern die Erreichbarkeit von RDP einzuschränken. Das kommt weiter unten. Erst danach kann man die Schwelle wieder entspannen, weil dann keine fremden Versuche mehr ankommen.
Zeitzone und Uhrzeit setzen, bevor irgendetwas protokolliert wird
Windows-Images stehen fast immer auf UTC oder auf einer amerikanischen Zone. Das fällt niemandem auf, bis das erste TLS-Zertifikat als "noch nicht gültig" abgelehnt wird oder Ereignisprotokolle sich nicht mehr mit denen anderer Systeme zusammenbringen lassen.
Get-TimeZone
Get-TimeZone -ListAvailable | Where-Object { $_.Id -like "*Europe*" }
Set-TimeZone -Id "W. Europe Standard Time"
"W. Europe Standard Time" deckt Wien, Berlin und Zürich ab, samt Sommerzeitumstellung. Die Uhrzeit selbst kommt vom Zeitdienst, und hier liegt der eigentliche Unterschied zwischen einem Blech und einem virtuellen Server:
w32tm /query /source
w32tm /query /status
Steht als Quelle Local CMOS Clock, holt sich der Server seine Zeit gar nicht aus dem Netz. Auf einem virtualisierten System driftet die Uhr dann sichtbar, teils um mehrere Sekunden pro Tag. Setzen Sie eine echte Quelle:
w32tm /config /manualpeerlist:"time.windows.com,0x9 at.pool.ntp.org,0x9" /syncfromflags:manual /update
Set-Service w32time -StartupType Automatic
Restart-Service w32time
w32tm /resync /force
Der Beweis, dass es sitzt: w32tm /query /source nennt jetzt einen der eingetragenen Server, und w32tm /query /status zeigt einen Stratum-Wert kleiner als 10 sowie eine plausible Zeit der letzten Synchronisierung. Meldet w32tm /resync stattdessen Der Computer wurde nicht synchronisiert, da keine Zeitdaten verfügbar waren, blockiert meist die Firewall den ausgehenden UDP-Port 123, oder der Dienst lief noch nicht.
Falls der Server später einer Domäne beitritt: Dann übernimmt der Domänencontroller die Zeitverteilung und die manuelle Peer-Liste muss wieder weg, sonst haben Sie zwei konkurrierende Zeitquellen.
Windows-Updates, und was tun, wenn sie hängen
Patchen Sie vor der Installation von Rollen, nicht danach. Sonst installieren Sie Rollen aus einem alten Stand und ziehen sie anschließend ein zweites Mal durch die Updateschleife.
Auf Server Core erledigt das sconfig, Menüpunkt 6. Mit Desktopoberfläche geht es über die Einstellungen. Skriptbar wird es mit dem Modul PSWindowsUpdate:
Install-PackageProvider -Name NuGet -Force
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
Install-Module PSWindowsUpdate -Force
Import-Module PSWindowsUpdate
Get-WindowsUpdate
Scheitert der Download aus der PowerShell Gallery mit Es wurde keine Übereinstimmung für die angegebenen Suchkriterien gefunden oder mit einem Verbindungsabbruch, liegt es auf älteren Ständen (Server 2016 und 2019) fast immer an TLS. In derselben Sitzung vorher ausführen:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Für den ersten Lauf empfiehlt sich, den Neustart selbst in der Hand zu behalten:
Install-WindowsUpdate -AcceptAll -IgnoreReboot
Get-WURebootStatus -Silent
Der erste Patchlauf auf einem frischen Abbild dauert je nach Alter des Abbilds 30 bis 60 Minuten und braucht zwei bis drei Neustarts. Das ist normal. Nicht normal ist die Meldung Fehler beim Konfigurieren von Windows-Updates. Änderungen werden rückgängig gemacht beim Hochfahren. Die zwei häufigsten Ursachen auf einem VPS: zu wenig freier Platz auf C: (unter etwa 10 GB wird es eng) oder ein harter Neustart mitten in der Konfigurationsphase. Prüfen Sie den Platz mit Get-Volume und setzen Sie den Updatespeicher zurück: Dienste wuauserv und bits stoppen, C:\Windows\SoftwareDistribution umbenennen, Dienste starten.
Am Rande: Für Windows Server 2025 gibt es Hotpatching, also Sicherheitsupdates ohne Neustart. Seit Mai 2026 kostet es nichts mehr, setzt aber eine Anbindung an Azure Arc voraus. Für einen einzelnen VPS ist das meist mehr Aufwand als Nutzen.
Firewall: das Profil ist wichtiger als die Regel
Die Windows-Firewall bleibt an. Immer. Der übliche Rat "zum Testen kurz ausschalten" endet auf einem öffentlich erreichbaren Server regelmäßig damit, dass sie ausgeschaltet bleibt.
Get-NetFirewallProfile | Select-Object Name, Enabled
Get-NetConnectionProfile
Der mit Abstand häufigste Firewall-Irrtum unter Windows: Die Regel existiert, ist aktiviert, und der Zugriff wird trotzdem geblockt. Ursache ist fast immer, dass die Regel für das Profil Privat oder Domäne gilt, die Netzwerkkarte aber im Profil Öffentlich steht. Ein VPS mit direkter öffentlicher IP landet nach der Bereitstellung häufig genau dort. Prüfen Sie die Zuordnung einer Regel explizit:
Get-NetFirewallRule -Name "RemoteDesktop-UserMode-In-TCP" | Select-Object Name, Enabled, Profile, Action
Und schauen Sie einmal an, was eingehend überhaupt erlaubt ist:
Get-NetFirewallRule -Enabled True -Direction Inbound -Action Allow | Select-Object DisplayName, Profile | Sort-Object DisplayName
Was auf einem Internet-VPS nichts zu suchen hat, ist Datei- und Druckerfreigabe auf TCP 445. Wenn Sie SMB brauchen, dann durch einen Tunnel, nicht offen. Ein WireGuard-Tunnel ist dafür der geradlinigste Weg, die Einrichtung der Gegenstelle ist in WireGuard-VPN-Server einrichten beschrieben.
Ein ICMP-Echo sollten Sie dagegen erlauben, sonst meldet Ihr Monitoring den Server als tot:
New-NetFirewallRule -DisplayName "ICMPv4 Echo eingehend" -Protocol ICMPv4 -IcmpType 8 -Direction Inbound -Action Allow
RDP absichern heißt nicht, den Port zu verschieben
Ein anderer Port reduziert Lograuschen und sonst nichts. Wenn Sie ihn trotzdem ändern wollen, geht das ohne Neustart, das ist in RDP-Port ohne Neustart ändern beschrieben. Die eigentliche Absicherung besteht aus drei anderen Dingen.
Erstens: Authentifizierung auf Netzwerkebene erzwingen. Ohne NLA baut Windows die Sitzung auf, bevor sich jemand ausgewiesen hat. Das ist genau die Angriffsfläche, die man nicht will.
$rdp = "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp"
Get-ItemProperty -Path $rdp -Name UserAuthentication, SecurityLayer
Set-ItemProperty -Path $rdp -Name UserAuthentication -Value 1
Set-ItemProperty -Path $rdp -Name SecurityLayer -Value 2
UserAuthentication = 1 bedeutet NLA aktiv, SecurityLayer = 2 erzwingt TLS für den Verbindungsaufbau.
Zweitens: die Quell-IP einschränken. Das ist die Maßnahme mit der größten Wirkung, und sie ist ein Einzeiler. Sie kappt Kennwortangriffe vollständig, und damit auch das Kontosperrproblem von oben.
Set-NetFirewallRule -Name "RemoteDesktop-UserMode-In-TCP" -RemoteAddress "203.0.113.10"
Set-NetFirewallRule -Name "RemoteDesktop-UserMode-In-UDP" -RemoteAddress "203.0.113.10"
Der Regelname ist bewusst der interne -Name und nicht die Anzeigegruppe, denn die heißt je nach Sprache "Remotedesktop" oder "Remote Desktop". Mehrere Adressen oder ein ganzes Netz gehen ebenso, etwa -RemoteAddress @("203.0.113.10","198.51.100.0/24").
Und hier die wichtige Vorsichtsmaßnahme: Führen Sie das aus einer bestehenden RDP-Sitzung aus und lassen Sie parallel eine zweite Sitzung offen. Wenn Sie sich bei der eigenen IP vertippen, ist die Verbindung sofort weg. Der Rückweg ist dann die Konsole im Kundenbereich. Wer eine wechselnde IP zuhause hat, sollte diesen Schritt überspringen und stattdessen RDP nur über VPN erreichbar machen.
Drittens: die Sperrschwelle passend setzen, nachdem die Firewall zu ist:
net accounts /lockoutthreshold:10 /lockoutduration:15 /lockoutwindow:15
Die drei RDP-Fehler, nach denen wirklich gesucht wird
- Es ist ein Authentifizierungsfehler aufgetreten. Die angeforderte Funktion wird nicht unterstützt. Das ist der CredSSP-Fall aus CVE-2018-0886: Der Client ist gepatcht, der Server nicht. Richtige Lösung ist der Patchstand auf dem Server. Die kursierende Registry-Umgehung mit
AllowEncryptionOracle = 2auf dem Client schaltet genau die Lücke wieder frei und darf, wenn überhaupt, nur bis zum abgeschlossenen Patchlauf gesetzt und danach entfernt werden. - Der Remotecomputer erfordert eine Authentifizierung auf Netzwerkebene, die von Ihrem Computer nicht unterstützt wird. Tritt bei sehr alten Clients auf. Der Server ist hier richtig konfiguriert, aktualisieren Sie den Client statt NLA abzuschalten.
- Remotedesktop kann keine Verbindung mit dem Remotecomputer herstellen. Mögliche Gründe hierfür sind: ... Diese Meldung ist ein Sammelbecken. Grenzen Sie auf dem Server ein, ob überhaupt jemand lauscht:
Get-Service TermService
Get-NetTCPConnection -LocalPort 3389 -State Listen
Kommt eine Zeile mit 0.0.0.0:3389 zurück, ist der Dienst in Ordnung und der Fehler liegt in der Firewall oder auf dem Weg dorthin. Kommt nichts zurück, ist es der Dienst oder ein geänderter Port. Wenn der Server unter Last gar nicht mehr antwortet und auch ICMP ausbleibt, lohnt ein Blick in Richtung Angriffslage, dazu passt Server vor DDoS-Angriffen schützen.
Zusätzliche Datenträger einbinden
Ein zweiter Datenträger erscheint nach der Zuweisung nicht von selbst im Explorer. Er ist roh und muss initialisiert werden.
Get-Disk
Get-Disk | Where-Object PartitionStyle -eq 'RAW' | Initialize-Disk -PartitionStyle GPT
New-Partition -DiskNumber 1 -UseMaximumSize -DriveLetter D | Format-Volume -FileSystem NTFS -NewFileSystemLabel "Daten" -Confirm:$false
Get-Volume
GPT statt MBR, immer. MBR ist bei 2 TB am Ende, und den Umstieg später macht niemand gern. Vier Stolperstellen:
- Datenträger offline oder schreibgeschützt.
Initialize-Diskmeldet dann Der Datenträger befindet sich im Offlinezustand oder Der Datenträger ist schreibgeschützt. Lösung:Set-Disk -Number 1 -IsOffline $falseundSet-Disk -Number 1 -IsReadOnly $false. - Buchstabe D: ist belegt. Bei vielen Abbildern hängt dort das virtuelle Laufwerk der Installationsquelle.
New-Partitionbricht mit Der angegebene Laufwerkbuchstabe ist nicht verfügbar ab. Prüfen Sie mitGet-Volumeund weichen Sie auf E: aus oder verschieben Sie das virtuelle Laufwerk vorher. - Nummer verwechselt.
-DiskNumber 1ist nicht garantiert der neue Datenträger. Vergleichen Sie inGet-DiskGröße undPartitionStyle, bevor Sie formatieren. Ein Format auf Nummer 0 ist der Systemdatenträger. - Nach einer Speichererweiterung wächst C: nicht mit. Der zusätzliche Platz liegt unpartitioniert dahinter:
Update-HostStorageCache
$max = (Get-PartitionSupportedSize -DriveLetter C).SizeMax
Resize-Partition -DriveLetter C -Size $max
Meldet Resize-Partition hier Die angegebene Größe wird nicht unterstützt oder Size Not Supported, liegt zwischen C: und dem freien Platz eine Wiederherstellungspartition. Die muss erst entfernt oder ans Ende verschoben werden, das geht nicht in einem Befehl und sollte nicht ohne Sicherung passieren.
Rollen und Features installieren
Erst jetzt, nach Patchstand und Firewall, kommen die Rollen dazu. Ein Blick auf den Ist-Zustand:
Get-WindowsFeature | Where-Object Installed | Select-Object Name, DisplayName
Ein Webserver ist ein Einzeiler:
Install-WindowsFeature -Name Web-Server -IncludeManagementTools
Get-Service W3SVC
Invoke-WebRequest http://localhost -UseBasicParsing | Select-Object StatusCode
Kommt StatusCode 200 zurück, läuft IIS lokal. Dass er auch von außen erreichbar ist, ist damit noch nicht gesagt, dafür braucht es die passende Firewallregel und einen Blick von einem zweiten System aus.
Der Klassiker unter den Fehlschlägen ist .NET Framework 3.5. Es liegt nicht im laufenden System, sondern muss aus der Installationsquelle nachgeladen werden. Ohne eingebundenes Abbild kommt:
Fehler: 0x800f081f
Die Quelldateien wurden nicht gefunden.
Auf einem VPS ohne eigenes ISO haben Sie zwei Wege: die Richtlinie so setzen, dass Windows die Dateien direkt von Windows Update holen darf, oder den Ordner sources\sxs aus einem Abbild derselben Build-Nummer auf den Server kopieren und mit -Source darauf zeigen. Eine andere Buildnummer funktioniert nicht, auch wenn sie zur selben Windows-Version gehört.
Zwei weitere Punkte zu Rollen: Uninstall-WindowsFeature -Name Web-Server -Remove entfernt nicht nur die Rolle, sondern auch deren Dateien vom Datenträger. Das spart Platz, macht die spätere Neuinstallation aber quellpflichtig, mit demselben 0x800f081f. Und wer Active Directory installiert, sollte vorher noch einmal nach oben scrollen: Auf einer Evaluierungslizenz ist das eine Sackgasse.
Woran Sie erkennen, dass alles sitzt
Zum Schluss eine Runde Kontrollbefehle. Jeder davon hat eine erwartete Antwort, und wenn eine davon nicht passt, ist der Server noch nicht fertig.
slmgr /xpr
Get-TimeZone
w32tm /query /source
Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 5
Get-NetFirewallProfile | Select-Object Name, Enabled
Get-NetFirewallRule -Name "RemoteDesktop-UserMode-In-TCP" | Get-NetFirewallAddressFilter
Get-LocalUser | Select-Object Name, Enabled, PasswordLastSet
Get-Volume | Where-Object DriveLetter
Get-WindowsFeature | Where-Object Installed | Measure-Object
Erwartet wird: ein Ablaufdatum oder "dauerhaft aktiviert", die europäische Zeitzone, eine echte Zeitquelle statt der lokalen Uhr, Updates von heute oder gestern, alle drei Firewallprofile auf True, eine RemoteAddress-Einschränkung statt Any, ein frisches Kennwortdatum beim Administrator und alle Laufwerke mit Buchstabe.
Danach lohnt ein letzter, oft vergessener Schritt: Trennen Sie die Sitzung nicht einfach durch Schließen des Fensters, sondern melden Sie sich richtig ab. Getrennte Sitzungen bleiben mit ihrem Speicherverbrauch stehen, und auf einem kleinen VPS summiert sich das über Wochen bis zu dem Punkt, an dem keine neue Anmeldung mehr möglich ist.
Wenn parallel ein Linux-Server aufgesetzt wird, deckt Neuen Rootserver einrichten: die Checkliste dieselben Themen für die andere Seite ab, und SSH absichern und Key-Login einrichten ist dort das Gegenstück zum Abschnitt über RDP.
Häufige Fragen
Ist eine Windows-Server-Lizenz im Serverpreis enthalten?
Was passiert, wenn die 180 Tage der Evaluierungsversion abgelaufen sind?
Warum werde ich ständig aus meinem eigenen Server ausgesperrt?
Wie binde ich einen zweiten Datenträger unter Windows Server ein?
Was bedeutet die Meldung, dass die angeforderte Funktion nicht unterstützt wird?
Warum blockiert die Windows-Firewall, obwohl die Regel existiert?
2026 KernelHost GmbH. Alle Rechte vorbehalten. Diese Anleitung ist urheberrechtlich geschützt. Eine Veröffentlichung auf anderen Webseiten, auch auszugsweise oder in bearbeiteter Form, ist ohne unsere schriftliche Zustimmung nicht gestattet. Zitate mit Quellenangabe und Link sind ausdrücklich willkommen.

