2-removebg-preview2-removebg-preview2-removebg-preview2-removebg-preview
  • Anasayfa
  • Hakkımda
    • Kısa Notlar
  • Blog
    • MS-Active Directory
    • MS-Exchange Server
    • MS-PowerShell
    • Windows Server
  • İletişim
✕

PowerShell ile Sistem Loglarını E-Posta Raporuna Dönüştürme

Temmuz 16, 2025
MS-Exchange, Powershell, Windows Server
Automation Script, Event Log, Exchange Search, Get-WinEvent, Health Report, Log Monitoring, powershell, Send-MailMessage, System Monitoring
 

Kurumsal IT altyapılarında bir sistemin yalnızca çalışıyor gibi görünmesi maalesef ki yeterli değildir. Gerçekten düzgün çalışıp çalışmadığını, arka planda oluşan hataların veya uyarıların tespit edilmesi gerçekten önemlidir. 

Windows Event Viewer kritik logları içerisinde barındırır. 

  • Manuel log kontrolü hem zaman alıcıdır hem de olayların gözden kaçma ihtimali yüksektir.
  • Dağıtık yapılarda bir izleme sistemi olmadan sağlıklı denetim sağlamak neredeyse imkansızdır.
  • Bazı kritik arızalar, sadece tek bir Event ID ile kendini gösterir ve bu fark edilmediğinde kesintilere yol açabilir.

Bu nedenle, belirli event id'leri filitreleyerek anlamlı bir rapora dönüştüren, bu raporu HTML formatında görsel olarak sunan ve günlük olarak sistem yöneticilerine mail ileten bir PowerShell scripti hazırladım.

Örnek Senaryo

Aşağıda vereceğim örnek, Microsoft Exchange Server üzerinde çalışan Search servisleri için yazılmıştır. Ancak mantık aynı şekilde SQL Server, IIS, DNS, AD, SCCM gibi pek çok hizmete kolayca uygulanabilir.

  • AD Replication (1311,2087,1865)

  • DNS sorunları (4015,4004)

  • IIS uygulama hataları

  • SQL Server servis ya da query timeout logları

  • SCCM client hataları

Tek yapılması gereken:

  • Event ID listesini değiştirmek,

  • Servis adlarını özelleştirmek,

  • Rapor başlığını değiştirmek.

Exchange Komutlarına Erişim

Exchange PowerShell cmdlet’lerine bağlanmamızı sağlar.

Search Servislerinin Durum Kontrolü

Kritik Search servislerinin running olup olmadığı kontrol edilir.

$services = Get-Service MSExchangeFastSearch, HostControllerService | Select DisplayName, Status, StartType

 

Event Log’dan Belirli ID’leri Çekme

Bu yapı, son 24 saate ait kritik Search loglarını filtreler. Hangi event id yi raporlamak istiyorsanız buraya yazmalısınız.

Event ID’lerin anlamları:

Event ID Açıklama
1009 Content indexing hatası
1012 Log alanı dolu, veri kaybı olabilir
109-110 FAST Search servis uyarıları
123-124 Arama bileşeni, içerik index uyarıları
 

$eventErrors = Get-WinEvent -LogName "Application" | Where-Object {
$_.TimeCreated -gt (Get-Date).AddDays(-1) -and
($_.Id -in 1009,1012,109,110,123,124)}

 

HTML Formatında Rapor Oluşturma

Veriler, estetik ve okunabilir HTML tablosuna dönüştürülür.

$html = $eventErrors | ConvertTo-Html -Property TimeCreated, Id, ProviderName, Message

E-Posta Gönderimi

Oluşturulan HTML rapor, bir sistem e-posta adresi üzerinden yöneticilere gönderilir.

Send-MailMessage -From ... -To ... -SmtpServer ... -BodyAsHtml -Body $fullHtml

<#
.SYNOPSIS
Exchange Server Search servisleri ve ilgili Event Log'ları kontrol ederek HTML formatında sağlık raporu oluşturur ve e-posta ile gönderir.

.DESCRIPTION
Bu script, Exchange Server üzerinde çalışan MSExchangeFastSearch ve HostControllerService servislerinin durumunu kontrol eder,
son 24 saat içerisinde oluşan kritik Search Event ID'lerini (1009, 1012, 109, 110, 123, 124) analiz eder ve HTML tabanlı rapor olarak üretir.
Oluşturulan rapor, sistem yöneticisinemail iletir.

.AUTHOR
Elif Uçhan

.NOTES
Script, yerel SMTP relay yapılandırması gerektirir.

.LASTUPDATED
16/07/2025
#>



. 'C:Program FilesMicrosoftExchange ServerV15binRemoteExchange.ps1'
Connect-ExchangeServer -auto -ClientApplication:ManagementShell

$reportTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss"


$html = @"
<h2>Exchange Search Service Health Report</h2>
<p>Rapor zamani: $reportTime</p>
"@


$services = Get-Service MSExchangeFastSearch, HostControllerService | Select DisplayName, Status, StartType
$serviceHtml = $services | ConvertTo-Html -Fragment -PreContent "<h3>1. Search Servis Durumu</h3>"
$html += $serviceHtml


$eventErrors = Get-WinEvent -LogName "Application" | Where-Object {
    $_.TimeCreated -gt (Get-Date).AddDays(-1) -and
   ($_.Id -in 1009,1012,109,110,123,124)
    
} | Select TimeCreated, Id, ProviderName, Message

if ($eventErrors.Count -gt 0) {
    $eventHtml = $eventErrors | ConvertTo-Html -Property TimeCreated, Id, ProviderName, Message -Fragment -PreContent "<h3>2. Search ve ilgili Hatalar (Event Log)</h3>"
} else {
    $eventHtml = "<h3>2. Search ve ilgili Hatalar (Event Log)</h3><p><strong>Son 24 saatte 1009,1012,109,110,123,124 Event ID'leri icin log bulunamadi.</strong></p>"
}
$html += $eventHtml



$fullHtml = @"
<html>
<head>
<style>
    body { font-family: Arial; font-size: 13px; }
    table { border-collapse: collapse; width: 100%; margin-bottom: 20px; }
    th, td { border: 1px solid #ccc; padding: 6px; text-align: left; }
    th { background-color: #f2f2f2; }
    h2, h3 { color: #003366; }
</style>
</head>
<body>
$html
</body>
</html>
"@

#mail
$smtpServer = $env:COMPUTERNAME  
$from = "exchangesearchindex@test.local"
$to = "exchangesearchindex@test.local"
$subject = "<ExchangeSunucu> Search Service Health Report - $reportTime"

Send-MailMessage -From $from -To $to -Subject $subject -SmtpServer $smtpServer -BodyAsHtml -Body $fullHtml

Write-Host "Sağlik raporu e-posta olarak gönderildi." -ForegroundColor Green

Scriptin Task'a bağlanması

İlgili Script kaydedilir.

  1.  Ben şimdilik Desktop a kaydettim. C dizininde olması doğrudur. Aşağıdaki gibi her gün gece saat 00:00'da çalışacak şekilde task schedular'a bağlayabilirsiniz.

Spread the love

Comments are closed.

PowerShell ile Sistem Loglarını E-Posta Raporuna Dönüştürme


Bilgi Paylaştıkça Çoğalır


© 2026. Tüm hakları saklıdır. Ziyaretiniz için teşekkürler!