Konfiguracja Windows Server na VPS: pierwsze kroki
Lista kontrolna po uruchomieniu serwera, w prawidłowej kolejności: sprawdzenie licencji, ustawienie hasła, strefa czasowa, aktualizacje, firewall, zabezpieczenie RDP, dyski i role. Razem z miejscami, w których to się sypie.
Świeżo postawiony serwer Windows wygląda na gotowy: RDP odpowiada, pojawia się pulpit, startuje Menedżer serwera. I dokładnie na tym polega pułapka. Między „RDP odpowiada” a „gotowy do produkcji” leży jakieś dwadzieścia minut pracy, a ich kolejność decyduje o tym, czy potem jeszcze wejdziesz na własny serwer.
Poniżej znajdziesz kroki w kolejności, w jakiej trzeba je wykonać, każdy z poleceniem kontrolnym i z komunikatami błędów w oryginalnym brzmieniu.
Licencję wyjaśnij na początku, nie na końcu
Windows Server nie wchodzi w cenę serwera. KernelHost nie jest partnerem Microsoft SPLA i nie wynajmuje licencji Windows. Windows działa tutaj w modelu Bring Your Own License: licencję kupujesz u certyfikowanego partnera Microsoftu albo bezpośrednio w Microsofcie i wnosisz ją do usługi sam.
Do testów, oceny produktu i prób migracji Microsoft udostępnia bezpłatną wersję ewaluacyjną z terminem 180 dni. Jest w pełni funkcjonalna, ma tylko ograniczenie czasowe i nie jest przeznaczona do produkcji.
Na samym początku sprawdź, co faktycznie działa na serwerze:
slmgr /dlv
slmgr /xpr
slmgr /dlv pokazuje nazwę edycji. Jeśli widnieje tam ServerStandardEval albo ServerDatacenterEval, działa wersja ewaluacyjna. slmgr /xpr podaje datę wygaśnięcia otwartym tekstem. Oba polecenia otwierają okienko wyskakujące, co na Server Core przeszkadza. Tam używasz zamiast tego cscript C:\Windows\System32\slmgr.vbs /dlv.
Co się dzieje, gdy 180 dni dobiegnie końca
Serwer działa dalej, ale Windows License Monitoring Service wyłącza go po mniej więcej godzinie pracy, i tak w kółko. W prawym dolnym rogu pojawia się znak wodny z informacją, że licencja Windows wygasła. Kto widzi to pierwszy raz, szuka zwykle godzinami błędu sprzętu albo sterownika, bo cały wzorzec wygląda jak zadziałanie watchdoga.
Czystym wyjściem jest przejście na prawdziwą licencję. Da się to zrobić bez ponownej instalacji:
DISM /Online /Set-Edition:ServerStandard /ProductKey:XXXXX-XXXXX-XXXXX-XXXXX-XXXXX /AcceptEula
Trzy miejsca, w których to regularnie zawodzi:
- Działa tylko przejście z Eval na pełną wersję o tej samej nazwie albo wyżej. Z Datacenter Evaluation z powrotem na Standard DISM nie przeprowadzi.
- Klucz musi być kluczem Retail, MAK albo KMS. Jeśli nie pasuje, DISM zgłasza Error: 1168 albo usługa licencjonowania 0xC004F050 z informacją, że klucz produktu jest nieprawidłowy. Prawie nigdy nie oznacza to „podrobionego klucza”, tylko „zły typ klucza do tej drogi”.
- Kontrolera domeny nie da się przestawić z Evaluation na Retail. Kto na wersji ewaluacyjnej uruchomił już
Install-ADDSForest, musi najpierw zdjąć tę rolę z powrotem. To najdroższy błąd w całym artykule, dlatego kwestia licencji stoi tutaj na samej górze, a nie na końcu.
Jeszcze uwaga o źródle instalacyjnym: własnych obrazów ISO nie wgrasz u KernelHosta, Windows bierze się z katalogu obrazów w panelu klienta. Licencję przynosisz sam, obraz jest już na miejscu.
Zmiana hasła administratora bez odcięcia się od serwera
Dostarczone hasło znajdziesz w mailu z danymi dostępowymi i należy je natychmiast wymienić. Zwyczajowa droga przez net user Administrator * działa, ma jednak tę wadę, że przy naruszeniu zasad zwraca tylko oszczędny komunikat. Lepiej tak:
$pw = Read-Host -AsSecureString -Prompt "Nowe hasło"
Set-LocalUser -Name "Administrator" -Password $pw
Jeśli pojawi się Hasło nie spełnia wymagań zasad dotyczących złożoności hasła, zadziałała lokalna zasada: co najmniej osiem znaków i trzy z czterech klas znaków. Obowiązujące wartości sprawdzisz poleceniem net accounts.
Sensowniejsze od zmiany nazwy konta jest drugie, nazwane konto administratora. Dzięki niemu masz drogę powrotną, gdyby to pierwsze konto zostało zablokowane:
$pw = Read-Host -AsSecureString -Prompt "Hasło dla svcadmin"
New-LocalUser -Name "svcadmin" -Password $pw -PasswordNeverExpires
Add-LocalGroupMember -SID "S-1-5-32-544" -Member "svcadmin"
Dlaczego SID, a nie nazwa grupy? Bo na systemie polskim grupa administratorów nazywa się Administratorzy, a na angielskim Administrators. Skrypty z nazwą wpisaną na sztywno przewracają się przy pierwszej zmianie języka na komunikacie Określona grupa lokalna nie istnieje. S-1-5-32-544 jest natomiast identyczny na każdym Windowsie.
Pułapka blokady konta, która na Windows Server 2025 naprawdę istnieje
Do Windows Server 2019 włącznie wbudowanego konta Administrator nie dało się zablokować logowaniami sieciowymi. Od pewnej aktualizacji zbiorczej dla Server 2022, a na Windows Server 2025 już domyślnie, jest inaczej: blokada konta zadziała po pięciu nieudanych próbach i obejmuje również wbudowanego administratora.
Na VPS z otwartym portem 3389 znaczy to konkretnie tyle: próby logowania automatycznych skanerów blokują ci konto, zanim sam zdążysz z niego skorzystać. Wpisujesz poprawne hasło i mimo to dostajesz Konto, do którego istnieje odwołanie, jest obecnie zablokowane i nie można się do niego zalogować.
Droga wyjścia, gdy już się to stało:
- Zaloguj się przez konsolę w panelu klienta zamiast przez RDP.
- Zdejmij blokadę, albo przeczekując czas blokady (
net accountsgo pokazuje, domyślnie to dziesięć minut), albo od razu:
$u = [ADSI]"WinNT://$env:COMPUTERNAME/Administrator,user"
$u.IsAccountLocked = $false
$u.SetInfo()
Trwałym rozwiązaniem nie jest podkręcanie progu blokady, tylko ograniczenie dostępności RDP. O tym niżej. Dopiero potem można próg znowu poluzować, bo obce próby przestaną w ogóle docierać.
Strefa czasowa i zegar, zanim cokolwiek trafi do logów
Obrazy Windows stoją prawie zawsze na UTC albo na którejś strefie amerykańskiej. Nikt tego nie zauważa, dopóki pierwszy certyfikat TLS nie zostanie odrzucony jako „jeszcze nieważny” albo dopóki dzienników zdarzeń nie da się zestawić z logami innych systemów.
Get-TimeZone
Get-TimeZone -ListAvailable | Where-Object { $_.Id -like "*Europe*" }
Set-TimeZone -Id "W. Europe Standard Time"
„W. Europe Standard Time” obejmuje Wiedeń, Berlin i Zurych razem ze zmianą czasu letniego. Sam czas przychodzi z usługi czasu i właśnie tutaj leży prawdziwa różnica między maszyną bare metal a serwerem wirtualnym:
w32tm /query /source
w32tm /query /status
Jeśli jako źródło widnieje Local CMOS Clock, serwer w ogóle nie pobiera czasu z sieci. Na systemie zwirtualizowanym zegar zaczyna wtedy widocznie odpływać, czasem o kilka sekund dziennie. Ustaw prawdziwe źródło:
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
Dowód, że wszystko siedzi: w32tm /query /source podaje teraz jeden z wpisanych serwerów, a w32tm /query /status pokazuje wartość Stratum mniejszą niż 10 oraz sensowny czas ostatniej synchronizacji. Jeśli w32tm /resync odpowiada natomiast Komputer nie został zsynchronizowany, ponieważ nie były dostępne żadne dane czasu, to zwykle firewall blokuje wychodzący port UDP 123 albo usługa jeszcze nie działała.
Jeśli serwer dołączy później do domeny: dystrybucję czasu przejmuje wtedy kontroler domeny, a ręczna lista peerów musi zniknąć, inaczej masz dwa konkurujące ze sobą źródła czasu.
Aktualizacje Windows i co robić, gdy się zawieszą
Łataj przed instalacją ról, a nie po niej. Inaczej zainstalujesz role ze starego stanu, a potem przeciągniesz je drugi raz przez pętlę aktualizacji.
Na Server Core załatwia to sconfig, pozycja 6 w menu. Z pulpitem graficznym robisz to przez Ustawienia. Skryptowalne staje się to dzięki modułowi PSWindowsUpdate:
Install-PackageProvider -Name NuGet -Force
Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
Install-Module PSWindowsUpdate -Force
Import-Module PSWindowsUpdate
Get-WindowsUpdate
Jeśli pobieranie z PowerShell Gallery kończy się komunikatem Nie znaleziono dopasowania do określonych kryteriów wyszukiwania albo zerwaniem połączenia, to na starszych wydaniach (Server 2016 i 2019) prawie zawsze winne jest TLS. W tej samej sesji wykonaj wcześniej:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Przy pierwszym przebiegu warto zatrzymać restart we własnych rękach:
Install-WindowsUpdate -AcceptAll -IgnoreReboot
Get-WURebootStatus -Silent
Pierwsze łatanie świeżego obrazu trwa, zależnie od jego wieku, od 30 do 60 minut i wymaga dwóch albo trzech restartów. To normalne. Nie jest normalny komunikat Nie można skonfigurować aktualizacji systemu Windows. Trwa cofanie zmian przy starcie. Dwie najczęstsze przyczyny na VPS: za mało wolnego miejsca na dysku C: (poniżej mniej więcej 10 GB robi się ciasno) albo twardy restart w środku fazy konfiguracji. Sprawdź miejsce poleceniem Get-Volume i zresetuj magazyn aktualizacji: zatrzymaj usługi wuauserv oraz bits, zmień nazwę katalogu C:\Windows\SoftwareDistribution, uruchom usługi ponownie.
Na marginesie: dla Windows Server 2025 istnieje hotpatching, czyli aktualizacje zabezpieczeń bez restartu. Od maja 2026 nic już nie kosztuje, wymaga jednak podpięcia do Azure Arc. Przy pojedynczym VPS to zwykle więcej zachodu niż pożytku.
Firewall: profil jest ważniejszy niż reguła
Firewall Windows zostaje włączony. Zawsze. Zwyczajowa rada „wyłącz go na chwilę do testów” na serwerze dostępnym publicznie regularnie kończy się tym, że zostaje wyłączony na stałe.
Get-NetFirewallProfile | Select-Object Name, Enabled
Get-NetConnectionProfile
Zdecydowanie najczęstsza pomyłka z firewallem na Windows: reguła istnieje, jest włączona, a dostęp i tak zostaje zablokowany. Przyczyna jest prawie zawsze taka, że reguła obowiązuje dla profilu Prywatny albo Domena, a karta sieciowa stoi w profilu Publiczny. VPS z bezpośrednim publicznym adresem IP ląduje po uruchomieniu bardzo często właśnie tam. Sprawdź przypisanie reguły wprost:
Get-NetFirewallRule -Name "RemoteDesktop-UserMode-In-TCP" | Select-Object Name, Enabled, Profile, Action
I zobacz przy okazji, co w ogóle jest dozwolone na wejściu:
Get-NetFirewallRule -Enabled True -Direction Inbound -Action Allow | Select-Object DisplayName, Profile | Sort-Object DisplayName
Czego na VPS wystawionym do internetu być nie powinno, to udostępnianie plików i drukarek na TCP 445. Jeśli potrzebujesz SMB, to przez tunel, a nie otwarcie. Tunel WireGuard jest tu najprostszą drogą, konfigurację drugiej strony opisuje Konfiguracja serwera VPN WireGuard.
Echo ICMP powinieneś natomiast przepuścić, inaczej monitoring zgłosi serwer jako martwy:
New-NetFirewallRule -DisplayName "ICMPv4 Echo przychodzące" -Protocol ICMPv4 -IcmpType 8 -Direction Inbound -Action Allow
Zabezpieczenie RDP to nie przeniesienie portu
Inny port zmniejsza szum w logach i nic poza tym. Jeśli mimo wszystko chcesz go zmienić, da się to zrobić bez restartu, opisuje to Zmiana portu RDP bez restartu. Właściwe zabezpieczenie składa się z trzech innych rzeczy.
Po pierwsze: wymuś uwierzytelnianie na poziomie sieci. Bez NLA Windows buduje sesję, zanim ktokolwiek się wylegitymuje. To dokładnie ta powierzchnia ataku, której nikt nie chce.
$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 oznacza aktywne NLA, a SecurityLayer = 2 wymusza TLS przy zestawianiu połączenia.
Po drugie: ogranicz źródłowy adres IP. To środek o największym skutku, a mieści się w jednej linijce. Odcina ataki na hasło całkowicie, a razem z nimi opisany wyżej problem blokady konta.
Set-NetFirewallRule -Name "RemoteDesktop-UserMode-In-TCP" -RemoteAddress "203.0.113.10"
Set-NetFirewallRule -Name "RemoteDesktop-UserMode-In-UDP" -RemoteAddress "203.0.113.10"
Nazwa reguły to celowo wewnętrzne -Name, a nie grupa wyświetlana, bo ta nazywa się zależnie od języka „Pulpit zdalny” albo „Remote Desktop”. Kilka adresów albo cała sieć też przejdą, na przykład -RemoteAddress @("203.0.113.10","198.51.100.0/24").
I teraz ważna ostrożność: wykonaj to z istniejącej sesji RDP i zostaw równolegle otwartą drugą sesję. Jeśli pomylisz się przy własnym adresie IP, połączenie znika natychmiast. Drogą powrotną jest wtedy konsola w panelu klienta. Kto ma w domu zmienny adres IP, powinien ten krok pominąć i zamiast tego udostępnić RDP wyłącznie przez VPN.
Po trzecie: ustaw próg blokady rozsądnie, kiedy firewall jest już zamknięty:
net accounts /lockoutthreshold:10 /lockoutduration:15 /lockoutwindow:15
Trzy błędy RDP, których naprawdę się szuka
- Wystąpił błąd uwierzytelniania. Żądana funkcja nie jest obsługiwana. To przypadek CredSSP z CVE-2018-0886: klient ma poprawkę, serwer nie. Właściwym rozwiązaniem jest poziom łatek na serwerze. Krążące obejście w rejestrze z
AllowEncryptionOracle = 2po stronie klienta otwiera dokładnie tę lukę z powrotem i wolno je ustawić co najwyżej do zakończenia łatania, a potem trzeba je usunąć. - Komputer zdalny wymaga uwierzytelniania na poziomie sieci, którego ten komputer nie obsługuje. Pojawia się przy bardzo starych klientach. Serwer jest tu skonfigurowany poprawnie, zaktualizuj klienta zamiast wyłączać NLA.
- Pulpit zdalny nie może połączyć się z komputerem zdalnym z jednego z następujących powodów: ... Ten komunikat to worek na wszystko. Zawęź sprawę na serwerze i sprawdź, czy ktokolwiek w ogóle nasłuchuje:
Get-Service TermService
Get-NetTCPConnection -LocalPort 3389 -State Listen
Jeśli wróci wiersz z 0.0.0.0:3389, usługa jest w porządku, a błąd siedzi w firewallu albo po drodze do niego. Jeśli nie wróci nic, winna jest usługa albo zmieniony port. Gdy serwer pod obciążeniem przestaje odpowiadać w ogóle i milczy też ICMP, warto spojrzeć w stronę ataku, pasuje do tego Ochrona serwera przed atakami DDoS.
Podłączanie dodatkowych dysków
Drugi dysk nie pojawia się po przypisaniu sam z siebie w Eksploratorze. Jest surowy i trzeba go najpierw zainicjować.
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 "Dane" -Confirm:$false
Get-Volume
GPT zamiast MBR, zawsze. MBR kończy się przy 2 TB, a późniejszej przesiadki nikt nie lubi. Cztery miejsca, o które można się potknąć:
- Dysk offline albo chroniony przed zapisem.
Initialize-Diskzgłasza wtedy Dysk jest w trybie offline albo Dysk jest chroniony przed zapisem. Rozwiązanie:Set-Disk -Number 1 -IsOffline $falseorazSet-Disk -Number 1 -IsReadOnly $false. - Litera D: jest zajęta. Przy wielu obrazach wisi tam wirtualny napęd ze źródłem instalacyjnym.
New-Partitionprzerywa wtedy komunikatem Określona litera dysku jest niedostępna. Sprawdź to poleceniemGet-Volumei przejdź na E: albo najpierw przesuń wirtualny napęd. - Pomylony numer.
-DiskNumber 1wcale nie musi być tym nowym dyskiem. Porównaj wGet-Diskrozmiar orazPartitionStyle, zanim zaczniesz formatować. Formatowanie numeru 0 trafia w dysk systemowy. - Po rozszerzeniu pamięci masowej dysk C: nie rośnie razem z nią. Dodatkowe miejsce leży za nim bez partycji:
Update-HostStorageCache
$max = (Get-PartitionSupportedSize -DriveLetter C).SizeMax
Resize-Partition -DriveLetter C -Size $max
Jeśli Resize-Partition zgłasza tutaj Określony rozmiar nie jest obsługiwany albo Size Not Supported, to między dyskiem C: a wolnym miejscem leży partycja odzyskiwania. Trzeba ją najpierw usunąć albo przesunąć na koniec, jednym poleceniem się tego nie zrobi i nie powinno się do tego zabierać bez backupu.
Instalacja ról i funkcji
Dopiero teraz, po łatkach i firewallu, dochodzą role. Spojrzenie na stan faktyczny:
Get-WindowsFeature | Where-Object Installed | Select-Object Name, DisplayName
Serwer WWW mieści się w jednej linijce:
Install-WindowsFeature -Name Web-Server -IncludeManagementTools
Get-Service W3SVC
Invoke-WebRequest http://localhost -UseBasicParsing | Select-Object StatusCode
Jeśli wróci StatusCode 200, IIS działa lokalnie. Że jest osiągalny również z zewnątrz, tego to jeszcze nie przesądza, do tego potrzebna jest odpowiednia reguła firewalla i sprawdzenie z drugiego systemu.
Klasykiem wśród niepowodzeń jest .NET Framework 3.5. Nie leży w działającym systemie, tylko trzeba go doładować ze źródła instalacyjnego. Bez podpiętego obrazu przychodzi:
Błąd: 0x800f081f
Nie można odnaleźć plików źródłowych.
Na VPS bez własnego ISO masz dwie drogi: ustawić zasadę tak, żeby Windows mógł pobrać pliki wprost z Windows Update, albo skopiować na serwer katalog sources\sxs z obrazu o tym samym numerze kompilacji i wskazać go przez -Source. Inny numer kompilacji nie zadziała, nawet jeśli należy do tej samej wersji Windows.
Jeszcze dwie uwagi o rolach: Uninstall-WindowsFeature -Name Web-Server -Remove usuwa nie tylko rolę, ale też jej pliki z dysku. Oszczędza to miejsce, ale późniejsza ponowna instalacja wymaga wtedy źródła, z tym samym 0x800f081f. A kto instaluje Active Directory, powinien wcześniej jeszcze raz przewinąć do góry: na licencji ewaluacyjnej to ślepa uliczka.
Po czym poznasz, że wszystko siedzi
Na koniec runda poleceń kontrolnych. Każde z nich ma oczekiwaną odpowiedź, a jeśli któraś nie pasuje, serwer nie jest jeszcze gotowy.
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
Oczekujemy: daty wygaśnięcia albo „trwale aktywowany”, europejskiej strefy czasowej, prawdziwego źródła czasu zamiast lokalnego zegara, aktualizacji z dzisiaj lub wczoraj, wszystkich trzech profili firewalla na True, ograniczenia RemoteAddress zamiast Any, świeżej daty hasła przy koncie Administrator oraz wszystkich napędów z przypisaną literą.
Potem warto zrobić ostatni, często pomijany krok: nie rozłączaj sesji zwykłym zamknięciem okna, tylko wyloguj się porządnie. Rozłączone sesje zostają w pamięci razem ze swoim zużyciem, a na małym VPS sumuje się to przez tygodnie aż do momentu, w którym żadne nowe logowanie nie jest już możliwe.
Jeśli równolegle stawiasz serwer z Linuksem, te same tematy po drugiej stronie omawia Konfiguracja nowego serwera root: lista kontrolna, a Zabezpieczenie SSH i logowanie kluczem jest tam odpowiednikiem rozdziału o RDP.
Najczęstsze pytania
Czy licencja Windows Server jest wliczona w cenę serwera?
Co się dzieje, gdy 180 dni wersji ewaluacyjnej dobiegnie końca?
Dlaczego ciągle tracę dostęp do własnego serwera?
Jak podłączyć drugi dysk w Windows Server?
Co oznacza komunikat, że żądana funkcja nie jest obsługiwana?
Dlaczego firewall Windows blokuje, chociaż reguła istnieje?
2026 KernelHost GmbH. Wszelkie prawa zastrzeżone. Ten poradnik jest chroniony prawem autorskim. Publikowanie go w innych serwisach, w całości, we fragmentach lub w zmienionej formie, wymaga naszej pisemnej zgody. Cytaty z podaniem źródła i z linkiem są jak najbardziej mile widziane.

