sunucu.com.tr
Windows Sunucular

Windows sunucu kiralama sonrası teslim kontrolü: PowerShell ile CPU, RAM, disk, lisans aktivasyonu ve ağ doğrulama betiği

Windows sunucu kiralama sonrası teslim aldığınız makinenin çekirdek, bellek, disk tipi, lisans aktivasyonu ve ağ ayarlarının sözleşmeye uyduğunu dört PowerShell betiğiyle doğrulayın, sonucu tek CSV ve HTML rapora dökün, itiraz edilecek noktaları ayırın.

14 dk okuma

Windows sunucu kiralama sürecinde siparişte yazan vCPU, RAM, disk ve lisans ile teslim alınan makinenin aynı olduğunu varsaymak yaygın bir hatadır. Bölümlenmemiş disk alanı, deneme (Evaluation) sürümüyle kurulmuş bir işletim sistemi ya da aktive edilmemiş bir lisans, ancak haftalar sonra fark edilir. Bu rehber, sunucuyu yeni teslim almış ya da deneme süresindeki sistem yöneticileri ve KOBİ sahipleri için hazırlandı: dört PowerShell betiğiyle donanımı, lisansı, diski ve ağı ölçüp sonucu tek rapora dökeceksiniz.

Windows sunucu kiralama sonrası neden teslim kontrolü yapılmalı

Kiralık sunucuda üç tür sapma görülebilir. Birincisi yapılandırma hatasıdır: sanal makineye 8 GB yerine 4 GB atanmıştır ya da 200 GB'lık diskin yalnız 60 GB'ı C: sürücüsüne bölümlenmiştir. İkincisi lisans durumudur: işletim sistemi aktive edilmemiş, KMS sunucusuna ulaşamıyor ya da 180 günlük deneme sürümüyle kurulmuştur. Üçüncüsü performanstır: "NVMe" yazan bir pakette disk HDD düzeyinde yanıt veriyordur.

Bunların hepsi okuma amaçlı birkaç komutla ortaya çıkar. Kontrolü deneme süresi ya da iade süresi bitmeden yapmak önemlidir; çünkü itirazınızın somut çıktıya dayanması gerekir. Sağlayıcıya "sunucu yavaş" demek yerine "4K rastgele okumada ortalama gecikme şu kadar, disk BusType değeri şu" diye yazmak sorunu daha hızlı çözer.

Ön koşullar

  • Windows Server 2019, 2022 ya da 2025 çalışan, RDP ile bağlanabildiğiniz bir sunucu.
  • Yönetici olarak açılmış Windows PowerShell 5.1 (sunucuda varsayılan olarak bulunur). Betikler PowerShell 7 ile de çalışacak biçimde yazıldı.
  • Disk testi için Microsoft'un açık kaynak aracı DiskSpd. Resmi DiskSpd deposundan son sürümü indirip C:\Araclar\diskspd klasörüne açın.
  • Elinizde sözleşme ya da sipariş özeti: vCPU sayısı, RAM, disk boyutu ve tipi, Windows sürümü ve baskısı, IP adresi.

Betikleri .ps1 olarak kaydederken Not Defteri'nde "UTF-8 with BOM" seçin; PowerShell 5.1 BOM olmayan dosyalardaki Türkçe karakterleri bozabilir. Kod içindeki metinler bu yüzden ASCII tutuldu. Betik çalıştırma ilkesi engel olursa yalnız o oturum için Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass kullanın; kalıcı ayar değişmez.

Betiklerin hiçbiri sistem ayarını değiştirmez, güvenlik duvarına kural eklemez. Hepsi sonuçlarını C:\TeslimRaporu klasörüne yazar. Geri almak için bu klasörü ve C:\TeslimTest klasörünü silmeniz yeterlidir. Henüz ilk ayarları yapmadıysanız bunu kontrolden sonra Windows bulut sunucu ilk kurulum betiği ile yapabilirsiniz; önce ölçün, sonra değiştirin.

Betik 1: Get-CimInstance ile CPU çekirdeği, RAM ve disk boyutu

Bu betik Win32_ComputerSystem, Win32_Processor, Win32_PhysicalMemory, Win32_LogicalDisk sınıflarını ve Get-Disk çıktısını okur. Windows Server 2019, 2022, 2025 ve PowerShell 5.1 için hazırlandı. Yalnız okuma yapar; geri alma gerekmez, oluşan CSV dosyasını silmeniz yeterli. Sınıfların ayrıntısı için Get-CimInstance belgesine bakabilirsiniz.

powershell
# 1-donanim.ps1 : CPU, RAM ve disk boyutu envanteri (yalniz okur)
# Windows Server 2019/2022/2025, PowerShell 5.1 ve 7 icin hazirlandi.
$RaporKlasoru = 'C:\TeslimRaporu'
New-Item -Path $RaporKlasoru -ItemType Directory -Force | Out-Null

$cs  = Get-CimInstance -ClassName Win32_ComputerSystem
$os  = Get-CimInstance -ClassName Win32_OperatingSystem
$cpu = @(Get-CimInstance -ClassName Win32_Processor)
$ramToplam = (Get-CimInstance -ClassName Win32_PhysicalMemory |
              Measure-Object -Property Capacity -Sum).Sum

$sonuc = New-Object System.Collections.Generic.List[object]
function Ekle($kategori, $ad, $deger) {
    $sonuc.Add([pscustomobject]@{ Kategori = $kategori; Ad = $ad; Deger = "$deger" })
}

# Sanal mi fiziksel mi: Model alani ipucu verir (Virtual Machine, KVM, VMware vb.)
Ekle 'Donanim' 'Uretici / Model' "$($cs.Manufacturer) / $($cs.Model)"
Ekle 'Donanim' 'Islemci modeli' ($cpu[0].Name.Trim())
Ekle 'Donanim' 'Soket sayisi' $cpu.Count
Ekle 'Donanim' 'Fiziksel cekirdek (toplam)' (($cpu | Measure-Object NumberOfCores -Sum).Sum)
Ekle 'Donanim' 'Mantiksal islemci (vCPU)' $cs.NumberOfLogicalProcessors
Ekle 'Donanim' 'Takili RAM (GB)' ([math]::Round($ramToplam / 1GB, 1))
# TotalVisibleMemorySize KB cinsindendir; 1MB'a bolmek GB verir
Ekle 'Donanim' 'Isletim sisteminin gordugu RAM (GB)' ([math]::Round($os.TotalVisibleMemorySize / 1MB, 1))

# Fiziksel/sanal disk boyutu ve bolumlenmemis alan
foreach ($d in Get-Disk) {
    $bos = [math]::Round(($d.Size - $d.AllocatedSize) / 1GB, 1)
    Ekle 'Disk' "Disk $($d.Number) boyut (GB)" ([math]::Round($d.Size / 1GB, 1))
    Ekle 'Disk' "Disk $($d.Number) bolumlenmemis alan (GB)" $bos
}

# Sabit surucu harfleri: boyut ve bos alan
foreach ($v in Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType=3") {
    Ekle 'Disk' "$($v.DeviceID) boyut (GB)" ([math]::Round($v.Size / 1GB, 1))
    Ekle 'Disk' "$($v.DeviceID) bos (GB)"  ([math]::Round($v.FreeSpace / 1GB, 1))
}

$sonuc | Export-Csv -Path (Join-Path $RaporKlasoru '1-donanim.csv') -NoTypeInformation -Encoding UTF8
$sonuc | Format-Table -AutoSize

Çıktıyı nasıl okumalı

  • Mantıksal işlemci (vCPU): Sözleşmedeki vCPU sayısıyla birebir aynı olmalı. Sanal sunucuda hipervizör vCPU'ları soket ya da çekirdek olarak farklı dağıtabilir; karşılaştırmayı bu satırla yapın.
  • Fiziksel çekirdek: Fiziksel sunucuda sözleşme "X çekirdek" diyorsa bu satıra bakın. Hyper-Threading açıksa mantıksal işlemci bunun iki katıdır.
  • Takılı RAM ve görülen RAM: İkisi arasında birkaç yüz MB fark normaldir. Gigabaytlarca fark varsa dinamik bellek açık olabilir; sağlayıcıya sorun.
  • Bölümlenmemiş alan: Sıfırdan büyükse disk alanı size verilmiş ama C: sürücüsüne eklenmemiştir. Bu bir itiraz değil, bir düzeltme konusudur; Disk Yönetimi'nden birimi genişletebilirsiniz. Yine de sağlayıcının kurulum şablonunu sormakta yarar var.

Betik 2: slmgr ve SoftwareLicensingProduct ile lisans ve aktivasyon durumu

Bu betik Windows'un lisans kaydını SoftwareLicensingProduct sınıfından okur, baskı bilgisini kayıt defterinden alır ve slmgr.vbs çıktısını metin olarak saklar. Windows Server 2019, 2022, 2025 ve PowerShell 5.1 için hazırlandı. Hiçbir anahtar girmez, aktivasyon denemesi yapmaz; geri alma gerekmez. slmgr seçeneklerinin açıklaması Microsoft'un slmgr.vbs belgesinde yer alır.

powershell
# 2-lisans.ps1 : Windows surum, baski ve aktivasyon durumu (yalniz okur)
$RaporKlasoru = 'C:\TeslimRaporu'
New-Item -Path $RaporKlasoru -ItemType Directory -Force | Out-Null

$sonuc = New-Object System.Collections.Generic.List[object]
function Ekle($kategori, $ad, $deger) {
    $sonuc.Add([pscustomobject]@{ Kategori = $kategori; Ad = $ad; Deger = "$deger" })
}

$os  = Get-CimInstance -ClassName Win32_OperatingSystem
$reg = Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion'
Ekle 'Lisans' 'Isletim sistemi' $os.Caption
Ekle 'Lisans' 'Surum / derleme' "$($os.Version) / $($reg.DisplayVersion)"
# EditionID 'Eval' ile bitiyorsa deneme surumudur (ornek: ServerStandardEval)
Ekle 'Lisans' 'EditionID' $reg.EditionID
Ekle 'Lisans' 'Kurulum tarihi' $os.InstallDate

# Windows uygulama kimligi sabittir; yalniz anahtari yuklu kayit alinir
$durumlar = @{ 0='Unlicensed'; 1='Licensed'; 2='OOBGrace'; 3='OOTGrace';
               4='NonGenuineGrace'; 5='Notification'; 6='ExtendedGrace' }
$filtre = "ApplicationID='55c92734-d682-4d71-983e-d6ec3f16059f' AND PartialProductKey IS NOT NULL"
$lisans = Get-CimInstance -ClassName SoftwareLicensingProduct -Filter $filtre

foreach ($l in $lisans) {
    Ekle 'Lisans' 'Urun adi' $l.Name
    Ekle 'Lisans' 'Kanal' $l.Description
    Ekle 'Lisans' 'Anahtar son 5 hane' $l.PartialProductKey
    Ekle 'Lisans' 'LicenseStatus' "$($l.LicenseStatus) ($($durumlar[[int]$l.LicenseStatus]))"
    # GracePeriodRemaining dakika cinsindendir
    Ekle 'Lisans' 'Kalan sure (gun)' ([math]::Round($l.GracePeriodRemaining / 1440, 0))
    if ($l.DiscoveredKeyManagementServiceMachineName) {
        Ekle 'Lisans' 'Bulunan KMS sunucusu' $l.DiscoveredKeyManagementServiceMachineName
    }
}
if (-not $lisans) { Ekle 'Lisans' 'Uyari' 'Yuklu Windows urun anahtari bulunamadi' }

# Uzak Masaustu Oturum Ana Bilgisayari rolu kurulu mu (yalniz Server'da calisir)
try {
    $rds = Get-WindowsFeature -Name RDS-RD-Server -ErrorAction Stop
    Ekle 'Lisans' 'RD Session Host rolu' $rds.InstallState
} catch { Ekle 'Lisans' 'RD Session Host rolu' 'Sorgulanamadi' }

# slmgr ciktisini da metin olarak sakla (sozlesme yazismasi icin)
$slmgr = Join-Path $env:SystemRoot 'System32\slmgr.vbs'
cscript.exe //nologo $slmgr /dli | Out-File (Join-Path $RaporKlasoru '2-slmgr-dli.txt') -Encoding UTF8
cscript.exe //nologo $slmgr /xpr | Out-File (Join-Path $RaporKlasoru '2-slmgr-xpr.txt') -Encoding UTF8

$sonuc | Export-Csv -Path (Join-Path $RaporKlasoru '2-lisans.csv') -NoTypeInformation -Encoding UTF8
$sonuc | Format-Table -AutoSize -Wrap

Çıktıyı nasıl okumalı

  • LicenseStatus 1 (Licensed): Beklenen değer budur. 0 ya da 2 ile 6 arasındaki değerler etkin olmayan ya da süreli bir durumu gösterir.
  • EditionID "Eval" ile bitiyorsa: Sunucu deneme sürümüyle kurulmuştur. Deneme sürümü 180 gün sonra düzenli kapanmaya başlar. Lisans dahil bir pakette bu kabul edilecek bir durum değildir.
  • Kanal: Sağlayıcı lisansında (SPLA) genellikle "VOLUME_KMSCLIENT" görürsünüz; bu, sunucunun sağlayıcının KMS sunucusundan periyodik olarak aktivasyon yenilediği anlamına gelir. Kalan süre yaklaşık 180 gün görünür ve yenilendikçe sıfırlanır. Kendi lisansınızı getirdiyseniz kanal "RETAIL" ya da "VOLUME_MAK" olabilir.
  • Baskı: Caption alanında Standard ya da Datacenter yazar; siparişte hangisi varsa o olmalı.

Lisans modelleri ve RDS CAL konusunu ayrıntılı tartışan Windows bulut sunucu lisansı yazısı, çıktıdaki kanal bilgisini sözleşmeyle eşlemenize yardım eder. Bu betik RDS lisans sunucusunu denetlemez; yalnız rolün kurulu olup olmadığını gösterir.

Betik 3: disk tipi ve basit okuma yazma testi (diskspd)

Bu betik önce Get-PhysicalDisk ile disk tipi ve veri yolunu okur, ardından DiskSpd ile üç kısa test yapar: 4K rastgele okuma, 4K rastgele yazma ve 1 MB sıralı okuma. Windows Server 2019, 2022, 2025 ve PowerShell 5.1 için hazırlandı. Test 2 GB'lık geçici bir dosya oluşturur ve iş bitince yalnız bu dosyayı siler. Geri almak için C:\TeslimTest klasörünü silmeniz yeterlidir.

Test diske birkaç dakikalık yük bindirir. Sunucuda canlı iş varsa mesai dışında çalıştırın.

powershell
# 3-disk.ps1 : disk tipi ve DiskSpd ile kisa performans testi
$RaporKlasoru = 'C:\TeslimRaporu'
$TestKlasoru  = 'C:\TeslimTest'                                # test dosyasinin konacagi yer
$DiskspdYolu  = 'C:\Araclar\diskspd\amd64\diskspd.exe'         # indirdiginiz yola gore degistirin
$SureSaniye   = 30                                             # her testin suresi
New-Item -Path $RaporKlasoru, $TestKlasoru -ItemType Directory -Force | Out-Null

$sonuc = New-Object System.Collections.Generic.List[object]
function Ekle($kategori, $ad, $deger) {
    $sonuc.Add([pscustomobject]@{ Kategori = $kategori; Ad = $ad; Deger = "$deger" })
}

# Disk tipi: sanal sunucularda MediaType cogu zaman 'Unspecified' gorunur
foreach ($p in Get-PhysicalDisk) {
    Ekle 'DiskTipi' "$($p.FriendlyName)" "MediaType=$($p.MediaType); BusType=$($p.BusType); GB=$([math]::Round($p.Size/1GB,1))"
}

$testDosyasi = Join-Path $TestKlasoru 'diskspd-test.dat'
$bos = (Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='C:'").FreeSpace
if (-not (Test-Path $DiskspdYolu)) {
    Ekle 'DiskTesti' 'Uyari' 'diskspd.exe bulunamadi, test atlandi'
} elseif ($bos -lt 5GB) {
    Ekle 'DiskTesti' 'Uyari' 'C: uzerinde 5 GB bos alan yok, test atlandi'
} else {
    # -Sh: Windows ve donanim onbellegini kapatir, -L: gecikme olcer, -Rxml: XML cikti
    $testler = @(
        @{ Ad = '4K rastgele okuma';  Arg = @('-b4K','-r','-o32','-t4','-w0')   },
        @{ Ad = '4K rastgele yazma';  Arg = @('-b4K','-r','-o32','-t4','-w100') },
        @{ Ad = '1M sirali okuma';    Arg = @('-b1M','-o8','-t1','-w0')         }
    )
    foreach ($t in $testler) {
        $argumanlar = @('-c2G', "-d$SureSaniye", '-W5', '-Sh', '-L', '-Rxml') + $t.Arg + $testDosyasi
        [xml]$x = & $DiskspdYolu @argumanlar
        $sn = [double]$x.Results.TimeSpan.TestTimeSeconds
        $io = 0; $bayt = 0
        foreach ($h in $x.Results.TimeSpan.Thread.Target) {
            $io   += [double]$h.ReadCount + [double]$h.WriteCount
            $bayt += [double]$h.ReadBytes + [double]$h.WriteBytes
        }
        $lat = $x.Results.TimeSpan.Latency
        $ort = if ($t.Arg -contains '-w100') { $lat.AverageWriteMilliseconds } else { $lat.AverageReadMilliseconds }
        Ekle 'DiskTesti' "$($t.Ad) IOPS"          ([math]::Round($io / $sn, 0))
        Ekle 'DiskTesti' "$($t.Ad) MB/s"          ([math]::Round($bayt / 1MB / $sn, 1))
        Ekle 'DiskTesti' "$($t.Ad) ort. gecikme ms" ([math]::Round([double]$ort, 3))
    }
    # Yalniz kendi olusturdugumuz test dosyasini sil
    Remove-Item -LiteralPath $testDosyasi -Force -ErrorAction SilentlyContinue
}

$sonuc | Export-Csv -Path (Join-Path $RaporKlasoru '3-disk.csv') -NoTypeInformation -Encoding UTF8
$sonuc | Format-Table -AutoSize -Wrap

Çıktıyı nasıl okumalı

Sanal sunucuda MediaType çoğunlukla "Unspecified", BusType ise "SCSI" ya da "SAS" görünür; bu, altta NVMe olmadığı anlamına gelmez. Hipervizör gerçek disk tipini gizler. Bu yüzden karar ölçütü ölçülen değerlerdir.

Genel bir çerçeve olarak, mekanik diskte 4K rastgele okuma birkaç yüz IOPS düzeyinde kalır ve ortalama gecikme milisaniyeler mertebesindedir. SSD ve NVMe tabanlı depolamada binlerce ile on binlerce IOPS ve milisaniyenin altında gecikme görülür. Paket tanımında bir IOPS sınırı yazıyorsa ölçtüğünüz değerin bu sınıra yakın olup olmadığına bakın. Testi günün farklı saatlerinde iki üç kez tekrarlayın; tek ölçüm, komşu yükü ya da anlık dalgalanma nedeniyle yanıltıcı olabilir.

Linux tarafında aynı yaklaşımı fio ve sysbench ile uygulayan sunucu seçimi için Linux test betiği yazısındaki karşılaştırma mantığı burada da geçerlidir.

Betik 4: genel IP, ping ve Test-NetConnection ile ağ kontrolü

Bu betik ağ kartı hızını, yerel IP'leri, varsayılan ağ geçidini, DNS sunucularını, RDP dinleme portunu ve dışarıdan görünen genel IP'yi okur. Ardından ağ geçidine ve belirttiğiniz hedeflere ping ve TCP bağlantı testi yapar. Windows Server 2019, 2022, 2025 ve PowerShell 5.1 için hazırlandı. Güvenlik duvarına dokunmaz; geri alma gerekmez. Test-NetConnection ayrıntıları Microsoft belgesinde yer alır.

Genel IP, OpenDNS'in myip.opendns.com kaydıyla DNS üzerinden sorgulanır; web sitesine istek gönderilmez.

powershell
# 4-ag.ps1 : IP, DNS, genel IP, ping ve port testi (yalniz okur)
$RaporKlasoru     = 'C:\TeslimRaporu'
$BeklenenGenelIp  = '192.0.2.10'                 # sozlesmedeki IP ile degistirin
$Hedefler         = @('example.com')             # erisim gereken sunucularla degistirin
$Portlar          = @(443)                       # kontrol edilecek TCP portlari
New-Item -Path $RaporKlasoru -ItemType Directory -Force | Out-Null

$sonuc = New-Object System.Collections.Generic.List[object]
function Ekle($kategori, $ad, $deger) {
    $sonuc.Add([pscustomobject]@{ Kategori = $kategori; Ad = $ad; Deger = "$deger" })
}
function OrtalamaPing($hedef) {
    $r = Test-Connection -ComputerName $hedef -Count 10 -ErrorAction SilentlyContinue
    if (-not $r) { return 'Yanit yok' }
    # PS 5.1 ResponseTime, PS 7 Latency kullanir
    $ms = $r | ForEach-Object { if ($null -ne $_.ResponseTime) { $_.ResponseTime } else { $_.Latency } }
    "{0} ms ({1}/10 yanit)" -f [math]::Round(($ms | Measure-Object -Average).Average, 1), @($r).Count
}

foreach ($a in Get-NetAdapter | Where-Object Status -eq 'Up') {
    Ekle 'Ag' "Kart: $($a.Name)" "Hiz=$($a.LinkSpeed); MAC=$($a.MacAddress)"
}
foreach ($ip in Get-NetIPAddress -AddressFamily IPv4 | Where-Object IPAddress -ne '127.0.0.1') {
    Ekle 'Ag' "Yerel IPv4 ($($ip.InterfaceAlias))" "$($ip.IPAddress)/$($ip.PrefixLength)"
}
$gw = (Get-NetIPConfiguration | Where-Object IPv4DefaultGateway | Select-Object -First 1).IPv4DefaultGateway.NextHop
Ekle 'Ag' 'Varsayilan ag gecidi' $gw
$dns = (Get-DnsClientServerAddress -AddressFamily IPv4 | ForEach-Object ServerAddresses | Select-Object -Unique) -join ', '
Ekle 'Ag' 'DNS sunuculari' $dns

$rdpPort = (Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp').PortNumber
Ekle 'Ag' 'RDP dinleme portu' $rdpPort

try {
    $genel = (Resolve-DnsName -Name myip.opendns.com -Server resolver1.opendns.com -Type A -ErrorAction Stop).IPAddress
    $esit  = if ($genel -eq $BeklenenGenelIp) { 'ESLESIYOR' } else { 'FARKLI' }
    Ekle 'Ag' 'Genel IP' "$genel ($esit, beklenen $BeklenenGenelIp)"
} catch { Ekle 'Ag' 'Genel IP' 'Sorgulanamadi (DNS 53 cikisi kapali olabilir)' }

if ($gw) { Ekle 'Ag' "Ping ag gecidi ($gw)" (OrtalamaPing $gw) }
foreach ($h in $Hedefler) {
    Ekle 'Ag' "Ping $h" (OrtalamaPing $h)
    foreach ($p in $Portlar) {
        $acik = Test-NetConnection -ComputerName $h -Port $p -InformationLevel Quiet -WarningAction SilentlyContinue
        Ekle 'Ag' "TCP $h`:$p" $(if ($acik) { 'Acik' } else { 'Kapali' })
    }
}

$sonuc | Export-Csv -Path (Join-Path $RaporKlasoru '4-ag.csv') -NoTypeInformation -Encoding UTF8
$sonuc | Format-Table -AutoSize -Wrap

Çıktıyı nasıl okumalı

  • Genel IP "FARKLI": Sunucu NAT arkasında olabilir ya da size başka bir IP atanmış olabilir. Sözleşmede adanmış IP yazıyorsa sorun.
  • Ping yanıtsız: Bazı ağ geçitleri ve hedefler ICMP'ye yanıt vermez. Bu tek başına hata değildir; TCP port testi açıksa bağlantı vardır.
  • Kart hızı: Sanal kartlar çoğunlukla 10 Gbps gibi sabit bir değer gösterir; gerçek bant genişliği değildir. Bant genişliği taahhüdünü ölçmek için kendi kontrolünüzdeki bir sunucuyla iperf3 testi yapın.
  • Ofisten gecikme: Kullanıcılarınızın deneyimini belirleyen değer budur. Ofisteki bir bilgisayardan Test-NetConnection 192.0.2.10 -Port 3389 ile RDP portuna erişimi ve Test-Connection ile gecikmeyi ölçün.

Sonuçları tek HTML ya da CSV rapora dökme

Dört betik aynı sütun yapısını (Kategori, Ad, Değer) kullandığı için birleştirmek kolaydır. Bu betik klasördeki CSV'leri okur, tek CSV ve tek HTML rapor üretir. Windows Server 2019, 2022, 2025 ve PowerShell 5.1 için hazırlandı. Her çalıştırmada rapor dosyalarının üzerine yazar; geri almak için iki rapor dosyasını silin.

powershell
# 5-rapor.ps1 : CSV'leri birlestirip HTML ve CSV rapor uretir
$RaporKlasoru = 'C:\TeslimRaporu'
$zaman = Get-Date -Format 'yyyy-MM-dd HH:mm'

$tum = Get-ChildItem -Path $RaporKlasoru -Filter '[1-4]-*.csv' |
       Sort-Object Name | ForEach-Object { Import-Csv -Path $_.FullName }

$tum | Export-Csv -Path (Join-Path $RaporKlasoru 'teslim-raporu.csv') -NoTypeInformation -Encoding UTF8

$stil = '<style>body{font-family:Segoe UI,Arial;font-size:13px}table{border-collapse:collapse}
td,th{border:1px solid #999;padding:4px 8px}th{background:#eee}</style>'
$ust  = "<h2>Teslim kontrol raporu: $env:COMPUTERNAME</h2><p>Olusturma: $zaman</p>"

$tum | ConvertTo-Html -Head $stil -PreContent $ust -Title "Teslim raporu $env:COMPUTERNAME" |
    Out-File -FilePath (Join-Path $RaporKlasoru 'teslim-raporu.html') -Encoding UTF8

Write-Host "Rapor hazir: $RaporKlasoru\teslim-raporu.html"

Doğrulama için Get-ChildItem C:\TeslimRaporu çalıştırın: dört CSV, iki slmgr metin dosyası, teslim-raporu.csv ve teslim-raporu.html görmelisiniz. HTML dosyasını açtığınızda Donanım, Disk, Lisans, DiskTipi, DiskTesti ve Ağ kategorilerinde satırlar listelenir. Bir kategori eksikse ilgili betiği tekrar çalıştırıp kırmızı hata satırına bakın.

Sözleşmeyle karşılaştırma: neye itiraz edilir

Raporu sipariş özetinin yanına koyup satır satır karşılaştırın.

Sözleşmedeki kalem Rapordaki satır İtiraz ölçütü
vCPU ya da çekirdek sayısı Mantıksal işlemci / fiziksel çekirdek Sayı eksikse
RAM Takılı RAM, görülen RAM Gigabayt düzeyinde eksiklik
Disk boyutu Disk boyut (GB) Disk boyutu eksikse; yalnız bölümlenmemiş alan varsa düzeltme talebi
Disk tipi (SSD, NVMe) DiskTesti IOPS ve gecikme Tekrarlanan ölçümlerde mekanik disk düzeyinde sonuç
Windows sürümü ve baskısı İşletim sistemi, EditionID Farklı sürüm ya da "Eval" baskı
Lisans dahil LicenseStatus 1 dışında bir değer
Adanmış IP Genel IP FARKLI sonucu

İtiraz ederken HTML raporu, 2-slmgr-dli.txt dosyasını ve disk testini yaptığınız saatleri ekleyin. Yorum yerine ölçüm göndermek, sağlayıcının sorunu kendi tarafında hızlıca doğrulamasını sağlar.

Sık yapılan hatalar

  • PowerShell'i yönetici olarak açmamak: Get-PhysicalDisk ve bazı lisans alanları boş döner, yanlış sonuca varılır.
  • Disk testini önbellekle yapmak: -Sh olmadan DiskSpd, Windows önbelleğini ölçer ve gerçek dışı yüksek değerler verir.
  • Tek ölçüme güvenmek: Paylaşımlı altyapıda anlık değer dalgalanabilir. En az iki farklı saatte ölçün.
  • MediaType "Unspecified" görünce itiraz etmek: Sanal sunucuda bu beklenen bir değerdir; ölçülen IOPS ve gecikmeye bakın.
  • Kontrolü ilk kurulumdan sonra yapmak: Önce ayar değiştirip sonra ölçerseniz teslim durumunu kanıtlayamazsınız.

Sık sorulan sorular

Betikler sunucuda bir şeyi değiştirir mi?

Hayır. Tüm betikler okuma yapar ve yalnız C:\TeslimRaporu ile C:\TeslimTest klasörlerine yazar. DiskSpd testi 2 GB'lık geçici bir dosya oluşturur ve test bitince yalnız o dosyayı siler. Güvenlik duvarına, lisansa ya da hizmetlere dokunulmaz.

LicenseStatus 1 ama kalan süre 180 gün görünüyor, sorun var mı?

KMS ile aktive edilen sunucularda bu normaldir. Sunucu aktivasyonu belirli aralıklarla sağlayıcının KMS sunucusundan yeniler ve süre her yenilemede baştan başlar. Kalan süre birkaç güne düşmüşse sunucu KMS'e ulaşamıyor olabilir; slmgr /dli çıktısını sağlayıcıya iletin.

DiskSpd yerine başka bir araç kullanabilir miyim?

Kullanabilirsiniz; önemli olan aynı aracı aynı parametrelerle tekrar çalıştırmaktır. DiskSpd, Microsoft'un kendi aracı olduğu ve önbelleği kapatma, gecikme ölçme seçenekleri bulunduğu için bu rehberde tercih edildi. Farklı sağlayıcıları karşılaştırırken parametreleri değiştirmeyin.

CPU sayısı doğru ama sunucu yavaş, bu betik bunu gösterir mi?

Bu betikler kaynakların varlığını doğrular, uzun süreli performansı değil. vCPU sınırlaması ya da yoğun saatlerde düşen performans için CPU kullanımını ve kuyruk uzunluğunu birkaç gün boyunca performans sayaçlarıyla izlemek gerekir.

Fiziksel sunucuda da aynı betikleri kullanabilir miyim?

Evet. Fiziksel sunucuda Model alanında sunucu üreticisinin modeli görünür, MediaType ve BusType genellikle gerçek disk tipini (SSD, NVMe, SAS) gösterir. RAID denetleyicisi arkasındaki diskler mantıksal birim olarak görünebilir; bu durumda denetleyicinin kendi yönetim aracına da bakın.

Sonuç

Teslim kontrolü, yarım saatlik bir işle sonraki aylarda çıkabilecek tartışmaları önler. Dört betik sırasıyla donanımı, lisansı, diski ve ağı ölçer; beşincisi bunları sağlayıcıya iletilebilecek tek rapora dönüştürür. Ölçümü deneme süresinde, ayar değiştirmeden önce ve en az iki farklı saatte yapın. Lisans dahil ve RDP ile hazır gelen bir makinede aynı kontrolleri uygulamak isterseniz Windows sunucu kiralama sayfasındaki paket tanımları, karşılaştırma tablosundaki sözleşme sütununu doldurmak için kullanılabilir.

  • #windows server
  • #powershell
  • #teslim kontrolü
  • #lisans aktivasyonu
  • #diskspd
  • #windows sunucu kiralama
  • #donanım doğrulama

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.

Tüm yazılarıProfil