PowerShell

PowerShell Windows Server Health Check ve Otomatik Raporlama

Saha notu / teknik rehber Son kontrol 6 Ekim 2026 Konu merkezine dön →
Tolga CEYHAN Sistem Yönetimi & IT

Windows Server Health Check, sunucuların CPU, bellek, disk, servis ve olay günlüğü gibi temel sağlık göstergelerini düzenli olarak kontrol etmeyi amaçlar. Çok sayıda Windows Server bulunan ortamlarda bu kontrollerin manuel yapılması sürdürülebilir değildir; PowerShell ile aynı kontroller standart ve tekrar edilebilir hale getirilebilir.

Amaç ve Kapsam

Bu rehberde PowerShell kullanarak temel bir Windows Server sağlık kontrolü oluşturuyoruz. Amaç; CPU ve RAM kullanımını, disk kapasitesini, kritik servisleri ve son sistem hatalarını tek bir akışta toplamak ve HTML raporu üretmektir.

Ön Koşullar

  • Windows Server üzerinde PowerShell erişimi
  • Kontrol edilecek servis ve loglar için gerekli yetkiler
  • Raporun yazılacağı klasörde yazma izni
  • Script’in üretim ortamında kullanılmadan önce test sisteminde doğrulanması

Kontrol Edilecek Bileşenler

  • CPU kullanımı
  • RAM kullanımı
  • Disk kapasitesi ve boş alan
  • Kritik Windows servisleri
  • Son 24 saatteki System Event Log hataları
  • İsteğe bağlı ağ ve DNS kontrolleri
  • HTML raporu oluşturma
  • İsteğe bağlı e-posta dağıtımı

1. CPU Kullanımını Kontrol Etme

$cpuSample = Get-Counter -Counter 'Processor(_Total)% Processor Time'
$cpuLoad = [math]::Round(
    $cpuSample.CounterSamples.CookedValue,
    2
)

$cpuLoad

Get-Counter, Windows Performance Counter verilerini PowerShell üzerinden okuyabilmek için kullanılabilir.

2. RAM Kullanımını Kontrol Etme

$os = Get-CimInstance Win32_OperatingSystem

$totalRamGB = [math]::Round($os.TotalVisibleMemorySize / 1MB, 2)
$freeRamGB  = [math]::Round($os.FreePhysicalMemory / 1MB, 2)
$usedRamGB  = [math]::Round($totalRamGB - $freeRamGB, 2)

[PSCustomObject]@{
    TotalGB = $totalRamGB
    UsedGB  = $usedRamGB
    FreeGB  = $freeRamGB
}

3. Disk Doluluk Durumunu Kontrol Etme

$disks = Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3" |
    Select-Object DeviceID,
        @{Name='TotalGB';Expression={[math]::Round($_.Size / 1GB, 2)}},
        @{Name='FreeGB';Expression={[math]::Round($_.FreeSpace / 1GB, 2)}},
        @{Name='FreePercent';Expression={
            if ($_.Size -gt 0) {
                [math]::Round(($_.FreeSpace / $_.Size) * 100, 2)
            }
        }}

Yüzdesel boş alan bilgisini rapora eklemek, farklı disk boyutlarını karşılaştırmayı kolaylaştırır.

4. Kritik Servisleri Kontrol Etme

$criticalServices = @(
    'Dnscache',
    'W32Time',
    'LanmanServer',
    'WinRM'
)

$serviceStatus = foreach ($serviceName in $criticalServices) {
    Get-Service -Name $serviceName -ErrorAction SilentlyContinue |
        Select-Object Name, DisplayName, Status, StartType
}

Kritik servis listesi sunucunun rolüne göre değiştirilmelidir. Domain Controller, DNS, DHCP veya File Server için aynı servis setini kullanmak doğru değildir.

5. Event Log Hatalarını Analiz Etme

$events = Get-WinEvent -FilterHashtable @{
    LogName   = 'System'
    Level     = 2
    StartTime = (Get-Date).AddDays(-1)
} -ErrorAction SilentlyContinue |
Select-Object TimeCreated, Id, ProviderName, LevelDisplayName, Message

Bu sorgu System logunda son 24 saatte oluşan Error seviyesindeki kayıtları getirir. Çok fazla kayıt bulunan sistemlerde Event ID veya ProviderName bazlı ek filtreleme yapılabilir.

6. Basit Ağ Kontrolü

$targets = @('SRV-DC01', 'SRV-FS01', 'SRV-APP01')

$networkStatus = foreach ($target in $targets) {
    [PSCustomObject]@{
        ComputerName = $target
        Reachable = Test-Connection -ComputerName $target -Count 1 -Quiet -ErrorAction SilentlyContinue
    }
}

Bu kontrol yalnızca temel erişilebilirlik bilgisini verir. Uygulama sağlığı için ilgili TCP portları veya servislerin ayrıca test edilmesi gerekir.

7. HTML Sağlık Raporu Oluşturma

$server = $env:COMPUTERNAME
$reportRoot = 'C:HealthReports'
$reportPath = Join-Path $reportRoot "HealthReport_$(Get-Date -Format yyyyMMdd_HHmm).html"

if (-not (Test-Path $reportRoot)) {
    New-Item -Path $reportRoot -ItemType Directory -Force | Out-Null
}

$summary = [PSCustomObject]@{
    Server    = $server
    CPU       = "$cpuLoad %"
    UsedRAMGB = $usedRamGB
    TotalRAMGB = $totalRamGB
    Generated = Get-Date
}

$html = @()
$html += $summary | ConvertTo-Html -Fragment -PreContent '

Özet

' $html += $disks | ConvertTo-Html -Fragment -PreContent '

Disk Durumu

' $html += $serviceStatus | ConvertTo-Html -Fragment -PreContent '

Kritik Servisler

' $html += $events | ConvertTo-Html -Fragment -PreContent '

System Event Log Hataları

' $html += $networkStatus | ConvertTo-Html -Fragment -PreContent '

Ağ Kontrolü

' ConvertTo-Html -Title "Windows Server Health Check - $server" -Body $html | Out-File -FilePath $reportPath -Encoding utf8 $reportPath

8. E-posta ile Gönderim

Rapor e-posta ile dağıtılacaksa SMTP parolasını script içine düz metin olarak yazmayın. Kimlik bilgilerini güvenli bir yöntemle alın ve kullandığınız mail altyapısına uygun gönderim yöntemini tercih edin.

Mevcut ortamınızda Send-MailMessage kullanıyorsanız kimlik bilgisini en azından çalışma anında alın:

$credential = Get-Credential

Send-MailMessage `
    -From 'noreply@example.com' `
    -To 'it@example.com' `
    -Subject "Windows Server Health Check - $server" `
    -Body 'HTML sağlık raporu ektedir.' `
    -Attachments $reportPath `
    -SmtpServer 'smtp.example.com' `
    -Port 587 `
    -UseSsl `
    -Credential $credential

Doğrulama

  • HTML dosyasının beklenen klasörde oluştuğunu kontrol edin.
  • CPU ve RAM değerlerini Task Manager veya Performance Monitor ile karşılaştırın.
  • Disk değerlerini Windows Explorer veya Disk Management ile karşılaştırın.
  • Servis durumlarını Get-Service ile ayrıca doğrulayın.
  • Event Log çıktısındaki Event ID ve Provider bilgilerini Event Viewer ile kontrol edin.

Troubleshooting

Get-Counter Veri Döndürmüyor

Performance Counter altyapısının ve ilgili sayaçların sistemde kullanılabilir olduğunu kontrol edin.

Event Log Sorgusu Erişim Hatası Veriyor

Script’i gerekli yetkilere sahip bir hesapla çalıştırın ve ilgili loga erişim yetkisini doğrulayın.

Servis Bulunamadı

Her Windows Server aynı role sahip değildir. Servis listesini sunucunun rolüne göre oluşturun ve bulunamayan servislerde -ErrorAction SilentlyContinue kullanın.

Güvenlik ve Best Practice

  • Script içine parola, token veya API anahtarı gömmeyin.
  • Sunucu listelerini ve servis setlerini ortam rolüne göre ayırın.
  • Rapor klasörünün NTFS izinlerini sınırlandırın.
  • Script değişikliklerini önce test ortamında doğrulayın.
  • Health Check sonucunu doğrudan “sunucu sağlıklı” şeklinde yorumlamak yerine eşik ve servis bağlamıyla değerlendirin.

Sonuç

PowerShell ile Windows Server Health Check yaklaşımı, tekrar eden sağlık kontrollerini standartlaştırmak için kullanılabilir. CPU, RAM, disk, servis ve Event Log verilerinin tek raporda birleştirilmesi özellikle düzenli operasyon kontrollerinde önemli zaman kazandırır.

İlgili Rehberler

Microsoft Dokümantasyonu

PowerShell Operasyon Merkezi

Temel cmdlet, pipeline, filtreleme ve raporlama yaklaşımı için PowerShell Komutları ana referansına; hızlı hazır komutlar için Komut Kütüphanesi bölümüne geçebilirsiniz. Tekrarlanan işlemleri script haline getirirken PowerShell Script Nedir ve Nasıl Yazılır? rehberini kullanabilirsiniz.

PROFESYONEL PROFİL

Bu teknik içeriğin arkasındaki deneyimi inceleyin.

Microsoft altyapıları, Active Directory, SCCM, PowerShell, Windows Server ve VMware odaklı teknik profil ve proje çalışmaları.

Projeler & Vaka Çalışmalarıİngilizce Profil

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir