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-Serviceile 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
- PowerShell Komutları – Profesyonel Rehber
- PowerShell ile Sistem Envanteri ve Raporlama
- PowerShell File Server Yönetimi ve NTFS Permission Otomasyonu
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.
