Windows Server: konfiguracja systemu z użyciem skryptu PowerShell

Każdy z administratorów wielokrotnie konfiguruje system operacyjny zaraz po jego instalacji, zaczynając od adresacji, nazewnictwa, włączenia usługi RDP aż po ustawienia czasu czy profile zasilania. Stawianie wielu środowisk testowych wymaga ich powtarzalności i dokładności w konfiguracji. Z pomocą w takich przypadkach przychodzi nam PowerShell. Jak skonfigurować Windows z użyciem skryptu Powershell? Poniżej przedstawiam sprawdzony sposób.

Zacznijmy od początku, mając gotowy system operacyjny administrator zaraz po jego instalacji musimy wiedzieć co chce w nim skonfigurować. Jakie opcje zmienić tak aby rozpocząć prace. W przykładzie użyjemy mojego „minimum” opcji do ustawienia na świeżym systemie Windows Server:

  • włączenie RDP
  • ustawienie profilu zasilania
  • ustawienie strefy czasowej
  • ustawienie adresacji IP (IP, maska, brama, DNS)
  • włączenie ICMP ping
  • uruchomienie udostępnianiania plików i drukarek
  • włączenie WinRM do zdalnego zarządzania
  • ustawienia ExecutionPolicy dla skryptów PowerShell
  • ustawienie nazwy dla połączenia sieciowego
  • konfiguracja zwiększonych zabezpieczeń Internet Explorer
  • zmiana nazwy komputera/hostname

Jak widzicie jest co klikać na starcie, a przecież może być jeszcze więcej opcji do skonfigurowania. UWAGA: bardzo ważna jest natomiast kolejność ich konfiguracji – jak widzicie ostatnia opcja wymaga restartu i umiejscowienie jej na końcu ma sens o ile chcemy aby nasz skrypt wykonał się jednorazowo w całości.

Przygotowujemy listę czynności konfiguracyjnych (ich odpowiedników w poleceniach Powershell, parametryzujemy nasze polecenia) i zapisujemy ją jako skrypt z rozszerzeniem .ps1:

#first to run sript by sprawdzone.it


#rdp enable
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -name "fDenyTSConnections" -value 0
Enable-NetFirewallRule -DisplayGroup "Remote Desktop"

#power profile set to High Performance
powercfg.exe -SETACTIVE 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c

#set time zone
Set-TimeZone -id "Central European Standard Time"

#set network address to first physical
$ipifIndex = (Get-NetAdapter -Name * -Physical).ifIndex
$ipaddress = Read-Host -Prompt "Enter IP Address" 
$ipprefix = Read-Host -Prompt "Enter Prefix" 
$ipgateway = Read-Host -Prompt "Enter Gateway Address"
$dns1 = Read-Host -Prompt "Enter first DNS Address"
$dns2 = Read-Host -Prompt "Enter second DNS Address"
$dns = @{
InterfaceIndex = $ipifIndex
ServerAddresses = ("$dns1","$dns2")
}
New-NetIPAddress -InterfaceIndex $ipifIndex -IPAddress $ipaddress -PrefixLength $ipprefix -DefaultGateway $ipgateway
Set-DnsClientServerAddress @dns


#icmp ping IP4 / IP6
New-NetFirewallRule -DisplayName "ICMP Allow Ping V4" -Direction Inbound -Protocol ICMPv4 -IcmpType 8 -Action Allow
New-NetFirewallRule -DisplayName "ICMP Allow Ping V6" -Direction Inbound -Protocol ICMPv6 -IcmpType 8 -Action Allow

#network file & printer sharing enable
Set-NetFirewallRule -DisplayGroup "File And Printer Sharing" -Enabled True -Profile Any

#enable winrm - attention! safety risk
winrm quickconfig -quiet

#set executionpolicy for scripts - attention! safety risk
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force

#set network name
$nname = (Get-NetAdapter -Name * -Physical).Name
$lname = Read-Host -Prompt "Enter new network adapter name"
Rename-NetAdapter $nname -NewName $lname

#disable enhanced security in IE for admins
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}' -name "IsInstalled" -value 0

#change hostname
$cname = Read-Host -Prompt "Enter new hostname"
Rename-Computer -NewName $cname -Restart

Mamy gotowy skrypt, działa doskonale ale na jednej maszynie – co zrobić gdy chcemy tak samo skonfigurować nowe środowisko lub kilka VM? Przecież pulpit zdalny nie działa, a my nie możemy skopiować jego zawartości przez konsole hypervisora.

Z pomocą przychodzi nam polecenie PowerShell Invoke-RestMethod które wysyła żądanie HTTP lub HTTPS…czyli zakładamy że mamy dostęp do internetu a nasz skrypt konfiguracyjny jest gdzieś dostępny w przestrzeni publicznej.

W naszym przykładzie użyjemy repozytorium Github gdzie umieścimy nasz skrypt aby był dostępny z każdego IP na świecie:

Jak widzicie adres do naszego skryptu jest dość skomplikowany https://github.com/sprawdzoneit/powershell_scripts/blob/main/firsttorun.ps1 aby móc swobodnie się nim posługiwać, utworzymy i przekierujemy subdomenę firsttorun.sprawdzone.it na jego zawartość w postaci linku RAW:

Konfiguracja rekordów DNS jest zależna od dostawcy gdzie utrzymujecie domenę i ten etap tu pomijamy podając tylko przykładowe rekordy jakie mamy wpisane w usłudze OVH:

firsttorun.sprawdzone.it. 3600 IN A 213.186.33.5
firsttorun.sprawdzone.it. 60 IN	TXT "4|https://raw.githubusercontent.com/sprawdzoneit/powershell_scripts/main/firsttorun.ps1"

Teraz już mamy „z górki”, skrypt jest dostępny w internecie pod określonym i łatwym do zapamiętania adresem internetowym, należy go pobrać i zapisać do pliku .ps1. Następnie uruchomić – a wszystko na nowym systemie operacyjnym w konsoli PowerShell otwartej jako administrator :

Invoke-RestMethod firsttorun.sprawdzone.it > first.ps1
.\first.ps1

Nasz skrypt błyskawicznie startuje, pytając nas kolejno o niezbędne informacje np nowy adres IP

Prawda że proste? Teraz konfiguracja nowego środowiska zajmie wam mniej niż minute, sprawdźcie sami poniżej.

Pomyślcie ile rzeczy możecie dodać do takiego skryptu albo co jeszcze można w ten sposób zautomatyzować? W naszym repozytorium Github znajdziecie przykładowy skrypt który skonfiguruje dla Was kontroler domeny dc4lab.sprawdzone.it


Jeżeli mój wpis Ci się spodobał, pomógł w pracy? Chcesz mnie wspierać? Postaw kawę! To dzięki waszemu wsparciu nie ma reklam! Poniżej kod QR do płatności który jest jednocześnie linkiem do PayPal możesz też wpłacić BLIK z użyciem Przelewy24.pl