Windows bulut sunucu ilk kurulum: PowerShell betiğiyle ad, IP, RDP, güvenlik duvarı ve güncelleme ayarları
Yeni teslim aldığınız Windows bulut sunucu için ilk ayarları tek bir PowerShell betiğiyle yapın: bilgisayar adı, saat dilimi, DNS, RDP portu ve IP kısıtlaması, güncelleme zamanlaması ve Defender. Betiği tekrar tekrar çalıştırabilir, her adımı günlükte görebilir ve gerekirse geri alabilirsiniz.
Batuhan Çelikel14 dk okuma
Yeni bir Windows bulut sunucu teslim aldığınızda RDP portu genellikle varsayılan 3389'dadır ve internetin her yerinden erişilebilir. Bilgisayar adı rastgele, saat dilimi de çoğu zaman yanlış olur. Bu ayarları her sunucuda elle yapmak hem zaman alır hem de unutulan bir adım bırakır. Bu rehber, sistem yöneticileri ve kendi sunucusunu yöneten KOBİ sahipleri için hazırlandı. Tek bir PowerShell betiğiyle ad, bölge, ağ, RDP, güvenlik duvarı, Windows Update ve Defender ayarlarını tekrarlanabilir şekilde yapacaksınız.
Windows bulut sunucu teslim alındığında ilk saatte yapılacaklar
Sunucuya ilk RDP bağlantısını kurduğunuz anda şu listeyi tamamlamayı hedefleyin:
- Yönetici parolasını değiştirin. Sağlayıcının gönderdiği parola e-postada ya da panelde açık metin olarak durmuş olabilir.
- Bilgisayar adını anlamlı bir adla değiştirin (ör.
ERP-SQL01). Günlüklerde, yedeklerde ve izleme ekranlarında hangi sunucuya baktığınızı buradan anlarsınız. - Saat dilimini Türkiye'ye çekin. Zamanlanmış görevler, yedek saatleri ve olay günlükleri bu saate göre çalışır.
- RDP erişimini daraltın: NLA açık olsun, port değişsin, en önemlisi yalnız bilinen IP adreslerinden bağlantı kabul edilsin.
- Güncelleme ve antivirüs taramasını mesai dışı bir saate alın.
- İhtiyacınız olmayan rolleri kaldırın, gerekenleri ekleyin.
İlk adım dışındakilerin hepsini aşağıdaki betik yapıyor. Parolayı betiğe yazmak doğru olmadığı için onu Ctrl+Alt+End ile açılan ekrandan ya da net user Administrator * komutuyla elle değiştirin.
Ön koşullar: PowerShell sürümü, yönetici yetkisi ve çalıştırma ilkesi
Betik Windows Server 2022 ve Windows Server 2025, Windows PowerShell 5.1 için hazırlandı. Bu sürüm iki işletim sisteminde de hazır gelir. PowerShell 7 de kuruluysa betiği yine powershell.exe ile çalıştırın. Install-WindowsFeature komutunu sağlayan ServerManager modülü 5.1'de doğrudan çalışır, PowerShell 7'de ise uyumluluk katmanı üzerinden yüklenir ve bu bazen beklenmedik çıktılar verir.
Kontrol listesi:
- Yönetici yetkisi: Betiğin ilk satırındaki
#Requires -RunAsAdministratoryükseltilmemiş oturumda çalışmayı durdurur. - Konsol erişimi: Sağlayıcı panelindeki VNC ya da web konsolunun açıldığını önceden deneyin. RDP ayarı yanlış giderse sunucuya tek giriş yolunuz burası olur.
- Kendi çıkış IP adresiniz: Ofisinizin ya da VPN'inizin sabit dış IP adresini bilin. Mobil bağlantı gibi IP'si sık değişen hatlardan yönetim yapıyorsanız IP kısıtlaması yerine RD Gateway ya da VPN düşünün.
- Çalıştırma ilkesi: İlkeyi kalıcı olarak gevşetmek yerine yalnız o işlem için
-ExecutionPolicy Bypasskullanacağız. İnternetten indirilen dosyalar içinUnblock-Filegerekir.
Sunucunuz henüz yoksa aynı adımları İstanbul ya da Strasbourg lokasyonlu bir bulut sunucu üzerinde uygulayabilirsiniz.
Bilgisayar adı, saat dilimi ve bölge ayarları
Bu üç ayarın PowerShell karşılıkları basit:
Rename-Computer -NewName ERP-SQL01 -Force: Ad değişikliği yeniden başlatmadan sonra geçerli olur. NetBIOS sınırı yüzünden ad en fazla 15 karakter olmalıdır.Set-TimeZone -Id 'Turkey Standard Time': Hemen geçerli olur, yeniden başlatma istemez.Set-WinSystemLocale tr-TR,Set-Culture tr-TRveSet-WinHomeLocation -GeoId 235: Sistem yerel ayarı Unicode olmayan uygulamaların kod sayfasını belirler ve yeniden başlatma ister. GeoId 235 Türkiye'nin kodudur.
Karar ölçütü şudur: Sunucuda Türkçe karakterli veri işleyen eski bir muhasebe ya da ERP uygulaması çalışacaksa sistem yerel ayarını tr-TR yapın. Yalnız İngilizce arayüzlü modern uygulamalar çalışacaksa yerel ayarı değiştirmeden sadece saat dilimini ayarlamak yeterlidir. Betikte bunun için -BolgeAyari '' parametresiyle bölge adımını atlayabilirsiniz.
Set-Culture yalnız betiği çalıştıran kullanıcının tarih ve sayı biçimini değiştirir. Ondalık ayıracın virgüle dönmesi, CSV okuyan bazı betikleri bozabilir. Bu yüzden servis hesaplarıyla çalışan uygulamaları ayrıca test edin.
Ağ ayarları: sabit IP, DNS ve IPv6 kontrolü
Bulut sunucuların çoğu IP adresini DHCP ile, sağlayıcının ayırdığı sabit adres olarak alır. Yani adres zaten değişmez. Sağlayıcı açıkça istemediği sürece ağ kartını elle statik IP'ye çevirmeyin. Yanlış ağ geçidi ya da önek uzunluğu sunucuyu ağdan koparır.
Mevcut durumu görmek için:
# Varsayılan ağ geçidi olan kartın IP, ağ geçidi ve DNS bilgisini gösterir
Get-NetIPConfiguration | Where-Object { $_.IPv4DefaultGateway } |
Select-Object InterfaceAlias, InterfaceIndex, IPv4Address, IPv4DefaultGateway, DNSServer
Beklenen çıktıda IPv4Address alanında sağlayıcının size verdiği adresi (örnekte 192.0.2.10) görmelisiniz. Microsoft'un ağ görevleri belgesi bu komutların ayrıntılarını Türkçe olarak anlatır.
Betik ağ tarafında üç şey yapar:
- DNS:
-DnsSunuculariparametresini doldurursanızSet-DnsClientServerAddressile ayarlar, boş bırakırsanız dokunmaz. Sunucu bir Active Directory etki alanına katılacaksa DNS olarak etki alanı denetleyicisini yazmalısınız. Genel DNS adresleri bu durumda işe yaramaz. - Sabit IP:
-SabitIpdoluysa DHCP'yi kapatıp adresi elle tanımlar. Bu işlem bağlantıyı kısa süre koparacağı için betik RDP oturumunda çalıştığını anlarsa bu adımı atlar ve uyarı verir. Statik IP gerekiyorsa betiği sağlayıcı konsolundan çalıştırın. - IPv6: Yalnız durumu raporlar. IPv6'yı kapatmak Microsoft'un önerdiği bir yöntem değildir ve bazı Windows bileşenleri ona dayanır. Sağlayıcınız IPv6 adresi verdiyse, güvenlik duvarı kurallarınızın IPv6 kaynaklarını da kapsadığını kontrol edin.
RDP güvenliği: NLA, port değişikliği ve güvenlik duvarında IP kısıtlama
Bu bölüm betiğin en kritik kısmı. Sıra yanlış olursa sunucuya erişiminizi kaybedersiniz.
Kendini kilitleme uyarısı: Güvenlik duvarı kuralları ve RDP portu, yeni porta izin veren kural oluşturulmadan değiştirilirse sunucuya RDP ile bir daha bağlanamazsınız. Betik önce yeni port için izin kuralını oluşturur, sonra portu değiştirir. Eski 3389 kurallarını ise ancak siz yeni porttan bağlandığınızı doğruladıktan sonra, ayrı bir çalıştırmada kapatır. Başlamadan önce sağlayıcı panelinden konsol erişiminin çalıştığını mutlaka deneyin.
Adımlar şöyle:
- NLA açılır.
UserAuthentication = 1, kullanıcı oturum ekranı açılmadan önce kimlik doğrulamayı zorunlu kılar. Bu, kimliği doğrulanmamış bağlantıların sunucu kaynağı harcamasını azaltır. - Yeni port için iki kural oluşturulur. Biri TCP, biri UDP olmak üzere,
RemoteAddressalanında yalnız sizin IP'leriniz bulunur. - Port değiştirilir.
PortNumberdeğeri kayıt defterinde güncellenir. Yeni port Uzak Masaüstü Hizmetleri yeniden başladığında, yani sunucu yeniden başlatıldığında geçerli olur. - Eski kurallar kapatılır. Bu adım yalnız
-EskiRdpKurallariniKapatanahtarıyla, yeni port dinlemedeyken çalışır.
Port değiştirmek tek başına güvenlik sağlamaz, yalnız otomatik taramaların gürültüsünü azaltır. Asıl koruma IP kısıtlamasıdır. IP kısıtlaması yapamıyorsanız başarısız oturum açma denemelerini izleyip saldırgan adresleri otomatik engellemek için RDP brute force engelleme rehberindeki 4625 olay raporunu kurun.
Sağlayıcınızın panelinde ayrıca bir ağ güvenlik duvarı ya da güvenlik grubu varsa, yeni portu orada da açmanız gerekir. Aksi halde Windows tarafı doğru olsa bile bağlantı kurulamaz.
Rol ve özellikler: Install-WindowsFeature ile ekleme ve kaldırma
Önce kurulu olanları listeleyin:
# Kurulu rol ve özellikleri ad ve görünen adla listeler
Get-WindowsFeature | Where-Object Installed | Select-Object Name, DisplayName
Kaldırma konusunda temkinli olun. Kurulu bir özelliği yalnız ne işe yaradığını biliyorsanız kaldırın. Betikte örnek olarak SMB 1.0 desteği (FS-SMB1) kaldırılıyor. Bu eski protokol güncel Windows Server sürümlerinde zaten varsayılan olarak kurulu gelmez, kuruluysa kaldırılması güvenli bir adımdır. Eklenecekler listesinde ise örnek olarak Windows Server Yedekleme (Windows-Server-Backup) var. Kendi ihtiyacınıza göre listeyi parametreyle değiştirin. Örneğin web sunucusu için Web-Server, birden fazla kullanıcının masaüstüne bağlanacağı bir sunucu için RDS rolleri eklenebilir. RDS kurulumu lisans ve rol dağılımı açısından ayrı bir konudur, ayrıntısı uzak masaüstü sunucusu kurulumu yazısında.
Windows Update ve Defender zamanlaması
Betik Windows Update için grup ilkesi kayıt defteri anahtarlarını kullanır:
AUOptions = 4: Güncellemeleri otomatik indir, belirlenen gün ve saatte kur.ScheduledInstallDay: 0 her gün, 1 pazar, 7 cumartesi demektir. Varsayılan 1 (pazar).ScheduledInstallTime: 0 ile 23 arası saat. Varsayılan 3.NoAutoRebootWithLoggedOnUsers = 1: Oturum açık kullanıcı varken otomatik yeniden başlatmayı engeller.
Bu yöntem basit ve ek modül istemez. Güncellemeleri tek tek listelemek, belirli KB'leri hariç tutmak ve yeniden başlatmayı kendi kontrolünüze almak istiyorsanız PowerShell ile Windows Update yazısındaki PSWindowsUpdate yaklaşımı daha esnektir.
Defender tarafında hızlı tarama her gün 04:00'e, imza güncellemesi 8 saatte bire alınır. Parametrelerin anlamı için Microsoft'un Set-MpPreference belgesine bakabilirsiniz. Sunucuda SQL Server gibi yoğun disk kullanan bir yazılım çalışacaksa, üreticinin önerdiği klasör ve süreç dışlamalarını ayrıca ekleyin. Betik dışlama eklemez, çünkü bu karar uygulamaya bağlıdır.
Tam betik: tek dosyada ilk kurulum ve günlük kaydı
Aşağıdaki betik Windows Server 2022 ve 2025, Windows PowerShell 5.1 için hazırlandı. Her adım önce mevcut durumu kontrol eder ve yalnız gerekiyorsa değişiklik yapar, yani tekrar çalıştırmak güvenlidir. Tüm çıktı C:\Kurulum altında tarihli bir günlük dosyasına yazılır. ORNEK-SUNUCU01, 198.51.100.0/24 ve 192.0.2.10 değerlerini kendi bilgilerinizle değiştirin. Geri alma adımları betikten sonraki bölümde.
#Requires -RunAsAdministrator
<#
ilk-kurulum.ps1
Windows bulut sunucu ilk ayarları. Windows Server 2022/2025 ve Windows PowerShell 5.1 için hazırlandı.
Değiştirilecek örnek değerler: ORNEK-SUNUCU01, 198.51.100.0/24, 192.0.2.10
#>
[CmdletBinding()]
param(
[ValidateLength(1,15)]
[string] $SunucuAdi = 'ORNEK-SUNUCU01',
[string] $BolgeAyari = 'tr-TR', # '' verilirse bölge adımı atlanır
[ValidateRange(1024,65535)]
[int] $RdpPort = 33890,
[string[]]$IzinliIpler = @('198.51.100.0/24','192.0.2.10'),
[string[]]$DnsSunuculari = @(), # boşsa DNS'e dokunulmaz
[string] $SabitIp = '', # yalnız sağlayıcı istiyorsa doldurun
[int] $OnEk = 24,
[string] $AgGecidi = '',
[string[]]$EklenecekOzellikler = @('Windows-Server-Backup'),
[string[]]$KaldirilacakOzellikler = @('FS-SMB1'),
[ValidateRange(0,7)] [int] $GuncellemeGunu = 1, # 0 her gün, 1 pazar
[ValidateRange(0,23)] [int] $GuncellemeSaati = 3,
[switch] $EskiRdpKurallariniKapat,
[switch] $YenidenBaslat
)
$ErrorActionPreference = 'Stop'
$gunlukKlasoru = 'C:\Kurulum'
if (-not (Test-Path $gunlukKlasoru)) { New-Item -ItemType Directory -Path $gunlukKlasoru | Out-Null }
$gunluk = Join-Path $gunlukKlasoru ('ilk-kurulum-{0:yyyyMMdd-HHmmss}.log' -f (Get-Date))
Start-Transcript -Path $gunluk | Out-Null
$yenidenBaslatmaGerekli = $false
try {
# ---------- 1. Bilgisayar adı ----------
# Bekleyen ad (yeniden başlatma öncesi) bu anahtarda tutulur; tekrar çalıştırmada çift işlem olmaz
$bekleyenAd = (Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName').ComputerName
if ($bekleyenAd -ne $SunucuAdi) {
Rename-Computer -NewName $SunucuAdi -Force
$yenidenBaslatmaGerekli = $true
Write-Host "[AD] Yeni ad $SunucuAdi, yeniden başlatmadan sonra geçerli."
} else { Write-Host "[AD] Ad zaten $SunucuAdi." }
# ---------- 2. Saat dilimi ve bölge ----------
if ((Get-TimeZone).Id -ne 'Turkey Standard Time') {
Set-TimeZone -Id 'Turkey Standard Time'
Write-Host '[SAAT] Turkey Standard Time ayarlandı.'
}
if ($BolgeAyari) {
if ((Get-WinSystemLocale).Name -ne $BolgeAyari) {
Set-WinSystemLocale -SystemLocale $BolgeAyari
$yenidenBaslatmaGerekli = $true
Write-Host "[BOLGE] Sistem yerel ayarı $BolgeAyari (yeniden başlatma gerekli)."
}
if ((Get-Culture).Name -ne $BolgeAyari) { Set-Culture -CultureInfo $BolgeAyari }
if ((Get-WinHomeLocation).GeoId -ne 235) { Set-WinHomeLocation -GeoId 235 } # 235 = Türkiye
}
# ---------- 3. Ağ ----------
$ag = Get-NetIPConfiguration | Where-Object { $_.IPv4DefaultGateway } | Select-Object -First 1
if (-not $ag) { throw 'Varsayılan ağ geçidi olan ağ kartı bulunamadı.' }
$ifIndex = $ag.InterfaceIndex
Write-Host "[AG] Kart: $($ag.InterfaceAlias), IPv4: $($ag.IPv4Address.IPAddress)"
if ($SabitIp) {
$mevcutIp = Get-NetIPAddress -InterfaceIndex $ifIndex -AddressFamily IPv4 -ErrorAction SilentlyContinue |
Where-Object { $_.IPAddress -eq $SabitIp -and $_.PrefixOrigin -eq 'Manual' }
if ($mevcutIp) {
Write-Host "[AG] $SabitIp zaten elle tanımlı."
} elseif ($env:SESSIONNAME -like 'RDP-Tcp*') {
Write-Warning '[AG] RDP oturumunda statik IP değişikliği atlandı. Konsoldan çalıştırın.'
} elseif (-not $AgGecidi) {
Write-Warning '[AG] -AgGecidi verilmedi, statik IP atlandı.'
} else {
Set-NetIPInterface -InterfaceIndex $ifIndex -AddressFamily IPv4 -Dhcp Disabled
Get-NetIPAddress -InterfaceIndex $ifIndex -AddressFamily IPv4 -ErrorAction SilentlyContinue |
Remove-NetIPAddress -Confirm:$false
Get-NetRoute -InterfaceIndex $ifIndex -DestinationPrefix '0.0.0.0/0' -ErrorAction SilentlyContinue |
Remove-NetRoute -Confirm:$false
New-NetIPAddress -InterfaceIndex $ifIndex -IPAddress $SabitIp -PrefixLength $OnEk -DefaultGateway $AgGecidi | Out-Null
Write-Host "[AG] Statik IP $SabitIp/$OnEk tanımlandı."
}
}
if ($DnsSunuculari.Count -gt 0) {
$mevcutDns = (Get-DnsClientServerAddress -InterfaceIndex $ifIndex -AddressFamily IPv4).ServerAddresses
if ((@($mevcutDns) -join ',') -ne ($DnsSunuculari -join ',')) {
Set-DnsClientServerAddress -InterfaceIndex $ifIndex -ServerAddresses $DnsSunuculari
Write-Host "[DNS] $($DnsSunuculari -join ', ') ayarlandı."
}
}
$ipv6 = Get-NetAdapterBinding -InterfaceAlias $ag.InterfaceAlias -ComponentID ms_tcpip6
Write-Host "[AG] IPv6 bağlaması etkin: $($ipv6.Enabled) (yalnız rapor, değiştirilmedi)"
# ---------- 4. RDP ve güvenlik duvarı ----------
$tsYol = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server'
$rdpYol = "$tsYol\WinStations\RDP-Tcp"
Set-ItemProperty -Path $tsYol -Name fDenyTSConnections -Value 0 # RDP açık
Set-ItemProperty -Path $rdpYol -Name UserAuthentication -Value 1 # NLA zorunlu
Set-NetFirewallProfile -Profile Domain,Private,Public -Enabled True
# Önce yeni port için izin kuralları (kilitlenmeyi önlemek için sıra önemli)
foreach ($protokol in 'TCP','UDP') {
$kuralAdi = "RDP-Ozel-$protokol"
if (Get-NetFirewallRule -Name $kuralAdi -ErrorAction SilentlyContinue) {
Set-NetFirewallRule -Name $kuralAdi -LocalPort $RdpPort -RemoteAddress $IzinliIpler -Enabled True
} else {
New-NetFirewallRule -Name $kuralAdi -DisplayName "RDP ozel port ($protokol)" `
-Direction Inbound -Protocol $protokol -LocalPort $RdpPort `
-RemoteAddress $IzinliIpler -Action Allow -Profile Any | Out-Null
}
Write-Host "[FW] $kuralAdi : port $RdpPort, kaynak $($IzinliIpler -join ', ')"
}
# Sonra port değişikliği (Uzak Masaüstü hizmeti yeniden başlayınca geçerli)
$mevcutPort = (Get-ItemProperty -Path $rdpYol -Name PortNumber).PortNumber
if ($mevcutPort -ne $RdpPort) {
Set-ItemProperty -Path $rdpYol -Name PortNumber -Value $RdpPort
$yenidenBaslatmaGerekli = $true
Write-Host "[RDP] Port $mevcutPort -> $RdpPort (yeniden başlatma sonrası)."
}
# Eski 3389 kurallarını yalnız yeni port dinlemedeyken ve açıkça istenirse kapat
if ($EskiRdpKurallariniKapat) {
$dinliyor = Get-NetTCPConnection -LocalPort $RdpPort -State Listen -ErrorAction SilentlyContinue
if ($dinliyor) {
Get-NetFirewallRule -Name 'RemoteDesktop-UserMode-In-TCP','RemoteDesktop-UserMode-In-UDP' -ErrorAction SilentlyContinue |
Disable-NetFirewallRule
Write-Host '[FW] Varsayılan RDP kuralları kapatıldı.'
} else {
Write-Warning "[FW] $RdpPort dinlenmiyor; eski kurallar kapatılmadı. Önce yeniden başlatıp yeni porttan bağlanın."
}
}
# ---------- 5. Rol ve özellikler ----------
if (Get-Command Install-WindowsFeature -ErrorAction SilentlyContinue) {
foreach ($ozellik in $EklenecekOzellikler) {
$f = Get-WindowsFeature -Name $ozellik
if ($f -and -not $f.Installed) {
$sonuc = Install-WindowsFeature -Name $ozellik
if ($sonuc.RestartNeeded -eq 'Yes') { $yenidenBaslatmaGerekli = $true }
Write-Host "[ROL] $ozellik kuruldu."
}
}
foreach ($ozellik in $KaldirilacakOzellikler) {
$f = Get-WindowsFeature -Name $ozellik
if ($f -and $f.Installed) {
$sonuc = Uninstall-WindowsFeature -Name $ozellik
if ($sonuc.RestartNeeded -eq 'Yes') { $yenidenBaslatmaGerekli = $true }
Write-Host "[ROL] $ozellik kaldırıldı."
}
}
}
# ---------- 6. Windows Update zamanlaması ----------
$auYol = 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU'
if (-not (Test-Path $auYol)) { New-Item -Path $auYol -Force | Out-Null }
$auAyarlari = [ordered]@{
NoAutoUpdate = 0
AUOptions = 4 # indir ve zamanında kur
ScheduledInstallDay = $GuncellemeGunu
ScheduledInstallTime = $GuncellemeSaati
NoAutoRebootWithLoggedOnUsers = 1
}
foreach ($anahtar in $auAyarlari.Keys) {
New-ItemProperty -Path $auYol -Name $anahtar -Value $auAyarlari[$anahtar] -PropertyType DWord -Force | Out-Null
}
Write-Host "[WU] Gün $GuncellemeGunu, saat $GuncellemeSaati olarak zamanlandı."
# ---------- 7. Defender ----------
if (Get-Command Set-MpPreference -ErrorAction SilentlyContinue) {
Set-MpPreference -ScanParameters 1 -ScanScheduleDay 0 -ScanScheduleTime '04:00:00' -SignatureUpdateInterval 8
try { Update-MpSignature } catch { Write-Warning "[AV] İmza güncellenemedi: $($_.Exception.Message)" }
Write-Host '[AV] Günlük hızlı tarama 04:00, imza güncelleme 8 saatte bir.'
}
}
catch {
Write-Error "Betik durdu: $($_.Exception.Message)"
}
finally {
Write-Host "Günlük dosyası: $gunluk"
Stop-Transcript | Out-Null
}
if ($yenidenBaslatmaGerekli) {
if ($YenidenBaslat) { Restart-Computer -Force }
else { Write-Warning 'Yeniden başlatma gerekiyor. Hazır olduğunuzda Restart-Computer çalıştırın.' }
}
Çalıştırmak için dosyayı C:\Kurulum\ilk-kurulum.ps1 olarak kaydedin ve yükseltilmiş PowerShell penceresinde şunu çalıştırın:
# İndirilen dosyanın engelini kaldır, ilkeyi yalnız bu işlem için atla
Unblock-File -Path C:\Kurulum\ilk-kurulum.ps1
powershell.exe -ExecutionPolicy Bypass -File C:\Kurulum\ilk-kurulum.ps1 `
-SunucuAdi ERP-SQL01 -RdpPort 33890 -IzinliIpler 198.51.100.0/24,192.0.2.10
Yeniden başlattıktan sonra yeni porttan (192.0.2.10:33890 biçiminde) bağlanın. Bağlantı çalışıyorsa betiği bu kez -EskiRdpKurallariniKapat anahtarıyla bir kez daha çalıştırın.
Doğrulama
Yeniden başlatmadan sonra şu kontrolleri yapın:
# Ad, saat dilimi ve sistem yerel ayarı
hostname; (Get-TimeZone).Id; (Get-WinSystemLocale).Name
# RDP portu ve NLA
Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' |
Select-Object PortNumber, UserAuthentication
# Yeni kuralların kaynak adresleri ve eski kuralların durumu
Get-NetFirewallRule -Name 'RDP-Ozel-*' | Get-NetFirewallAddressFilter | Select-Object RemoteAddress
Get-NetFirewallRule -Name 'RemoteDesktop-UserMode-In-*' | Select-Object Name, Enabled
Beklenen sonuç: PortNumber 33890, UserAuthentication 1, eski kurallarda Enabled False. Kendi bilgisayarınızdan Test-NetConnection 192.0.2.10 -Port 33890 komutu TcpTestSucceeded : True döndürmelidir. İzinli listede olmayan bir hattan (ör. telefon hotspot) aynı test False dönmelidir.
Geri alma
Port değişikliğini ve kuralları eski haline getirmek için aşağıdaki komutları konsoldan ya da hâlâ açık bir oturumdan çalıştırın. Komutlar aynı Windows Server ve PowerShell sürümleri için hazırlandı.
# RDP portunu 3389'a döndür ve varsayılan kuralları aç
Set-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name PortNumber -Value 3389
Enable-NetFirewallRule -Name 'RemoteDesktop-UserMode-In-TCP','RemoteDesktop-UserMode-In-UDP'
# Betiğin eklediği özel kuralları kaldır
Remove-NetFirewallRule -Name 'RDP-Ozel-TCP','RDP-Ozel-UDP' -ErrorAction SilentlyContinue
# Windows Update ilke değerlerini kaldır (yalnız betiğin yazdığı anahtar)
Remove-Item -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU' -Recurse -ErrorAction SilentlyContinue
Restart-Computer
Sık yapılan hatalar
RDP'den kilitlenme. En sık görülen neden, portun değiştirilip güvenlik duvarında yeni porta izin verilmemesidir. Bir diğeri sağlayıcı panelindeki ağ güvenlik duvarının unutulmasıdır. Üçüncüsü de izinli IP listesine ofisin değil evin IP adresinin yazılmasıdır. Önce kural, sonra port, en son eski kuralların kapatılması sırasını bozmayın ve konsol erişiminizi hazır tutun.
Yeniden başlatma sırası. Ad, sistem yerel ayarı ve RDP portu yeniden başlatmadan sonra geçerli olur. Yeniden başlatmadan "port çalışmıyor" diye ayarları geri almaya çalışmayın. Aynı şekilde, sunucu bir etki alanına katılacaksa önce adı değiştirip yeniden başlatın, etki alanına sonra katılın. Aksi halde Active Directory'de eski adla bilgisayar nesnesi oluşur.
Dil paketi ile bölge ayarını karıştırmak. Set-WinSystemLocale arayüz dilini Türkçe yapmaz, yalnız kod sayfasını ve biçimleri değiştirir. Arayüz dili için ayrıca dil paketi gerekir. Sunucu yönetiminde İngilizce arayüz, hata mesajlarını aramak açısından genellikle daha pratiktir.
Statik IP'yi RDP içinden değiştirmek. Bağlantı kopar ve yanlış bir değer girildiyse geri dönemezsiniz. Betik bu yüzden RDP oturumunda bu adımı atlar.
Sık sorulan sorular
Windows Server lisansını ayrıca almam gerekir mi?
Bulut sunucularda Windows Server lisansı çoğunlukla sağlayıcı tarafından hizmetle birlikte verilir, satın almadan önce bunu teklifte yazılı olarak doğrulayın. Yönetim amaçlı en fazla iki eşzamanlı RDP oturumu ek lisans istemez. Daha fazla kullanıcı aynı anda masaüstüne bağlanacaksa RDS rolü ve RDS CAL lisansı gerekir.
Windows Server 2022 mi, 2025 mi seçmeliyim?
Yeni kurulumda, çalıştıracağınız yazılım destekliyorsa 2025'i seçin, çünkü destek süresi daha uzun. Muhasebe, ERP ya da sektörel bir yazılım kuracaksanız önce üreticinin desteklenen işletim sistemleri listesine bakın. Liste yalnız 2022'yi içeriyorsa 2022 ile başlayın. Destek bitiş tarihlerini Microsoft yaşam döngüsü sayfasından kontrol edin.
Kaç GB bellek yeterli olur?
Microsoft'un Masaüstü Deneyimli kurulum için belirttiği değer yalnız işletim sisteminin açılabilmesi içindir, üretim için ölçüt olamaz. Pratik bir başlangıç olarak, yalnız yönetim ve hafif servisler için 4 GB, SQL Server ya da çok kullanıcılı bir ERP için 8 GB ve üzeri düşünün. Sonra Görev Yöneticisi'nde ya da Get-Counter '\Memory\Available MBytes' ile gerçek kullanımı izleyip boyutu ayarlayın.
Betik PowerShell 7 ile çalışır mı?
Komutların çoğu çalışır, ancak Install-WindowsFeature gibi ServerManager komutları PowerShell 7'de uyumluluk katmanı üzerinden yüklenir. Sorunsuz sonuç için betiği Windows Server ile hazır gelen powershell.exe (5.1) ile çalıştırın.
Betiği birden fazla sunucuda kullanabilir miyim?
Evet. Betik her adımda mevcut durumu kontrol ettiği için aynı sunucuda tekrar çalıştırmak da, farklı sunucularda farklı parametrelerle çalıştırmak da güvenlidir. Sunucu adını her seferinde parametreyle verin ve oluşan günlük dosyalarını bir yerde saklayın.
Sonuç
Yeni bir Windows bulut sunucuda ilk saatte yapılacak işler belli: anlamlı ad, doğru saat dilimi, NLA'lı ve IP kısıtlı RDP, mesai dışına alınmış güncelleme ve tarama. Bu ayarları bir betikte toplamak, her sunucuyu aynı standartta açmanızı ve neyin değiştiğini günlükten görmenizi sağlar. Kilitlenmeyi önleyen kural basit: önce izin kuralı, sonra port, en son eski kurallar. Her adımı yeni porttan bağlanabildiğinizi doğruladıktan sonra atın.
- #windows bulut sunucu
- #powershell
- #windows server 2025
- #rdp güvenliği
- #güvenlik duvarı
- #windows update
- #ilk kurulum
Yazar
Kurucu, sunucu.com.tr · Bulut altyapısı ve yapay zeka otomasyonları
sunucu.com.tr ve Sunucu UK'in kurucusu. Bulut altyapısı, sanallaştırma ve sunucu yönetimi üzerine çalışıyor; şirketlerin iş yazılımlarını, web sitelerini ve yapay zeka iş yüklerini güvenli sunuculara taşıyor. Blogdaki rehberler sahada karşılaşılan kurulum, güvenlik ve taşıma işlerinden derlenir; yazılar yapay zeka desteğiyle hazırlanır ve kaynaklarla doğrulanır.