PowerShell ile Sunucu Disk Kullanım Raporu Oluşturma

Giriş

İşletim sistemlerinin günlük yönetiminde, sunucuların disk kullanımını düzenli olarak takip etmek kritik bir öneme sahiptir.Piyasada sistem sağlığını takip etmemize olanak sağlayan sayısız araç olmasına rağmen ben bu makalede, PowerShell kullanarak basit bir şekilde sunucu disk kullanım raporu oluşturmanın adımlarını açıklayacağım. Siz kendi ortamınıza göre scripti özelleştirebilirsiniz.

İlk Adımlar

İlk olarak, scriptimizde kullanılacak olan fonksiyonu tanımlayacağız. ConvertTo-GB fonksiyonu, byte cinsinden boyutu alır ve gigabayta dönüştürerek geri verir. Bu, daha okunabilir raporlar oluşturmamıza yardımcı olacaktır.
# Function to convert bytes to GB
function ConvertTo-GB {
    param([int64]$size)
    $size / 1GB
}

Sunucu ve Sürücü Bilgilerini Almak

Daha sonra, disk kullanımını izleyeceğimiz sunucuları ve raporlarda hariç tutmak istediğimiz bir sürücü harfini belirleyeceğiz. Ayrıca, raporlarda belirli eşik değerlerini tanımlayacağız.
Burada $FSGBThreshold olarak tanımladığımız değer  GB cinsinden kalan boş alanın hangi değerden sonra dikkate alınması gerektiğini belirtir. 
# List of servers
$servers = "Server01", "Server02", "Server03"

# Excluded drive letter
$excludedDrive = "H:" 

# Free Space (GB) threshold value
$FSGBThreshold = 50
# Free Space Percentage (second level)(%) threshold value
$FSPThresholdOrange = 20
# Free Space Percentage (first level)(%) threshold value
$FSPThresholdRed = 10

Bu örnekte 50 GB ve altında kalan bir boş alan kalması durumunda raporda ilgili renklendirme kuralları tetiklenir. Aynı şekilde $FSPThresholdOrange değeri warning eşiğini ve $FSPThresholdRed critical eşiğini % cinsinden belirlememize olanak sağlar.

HTML Raporunu Oluşturmak

HTML raporu oluşturmak için aşağıdaki şablonu kullanacağız. Bu rapor, her sunucu ve disk için ayrı ayrı bilgiler içerecek ve renk kodlarıyla görsel olarak bilgi verecektir.
# Create HTML report
$htmlReport = @"
<style>
<!DOCTYPE html>
<html>
<head>
    <style>
        table {
            font-family: Arial, sans-serif;
            border-collapse: collapse;
            width: 100%;
        }
        th, td {
            border: 1px solid #dddddd;
            text-align: left;
            padding: 8px;
        }
        th {
            background-color: #f2f2f2;
        }
        .red {
            background-color: #ff8080; /* Red */
        }
        .orange {
            background-color: #ffb366; /* Orange */
        }
        .green {
            background-color: #b3ffcc; /* Green */
        }
        .yellow {
            background-color: #FFFACD; /* Yellow */
        }
    </style>
</head>
<body>

<h2>Server Disk Usage Report</h2>

<table>
    <tr>
        <th>Server</th>
        <th>Drive</th>
        <th>Volume Name</th>
        <th>File System</th>
        <th>Total Size (GB)</th>
        <th>Free Space (GB)</th>
        <th>Used Space (GB)</th>
        <th>Free Space Percentage</th>
    </tr>
"@

Sunucu ve Disk Bilgilerini İşleme

Sunucular ve disk bilgilerini almak için WMI (Windows Management Instrumentation) kullanacağız. 

WMI Nedir ?

WMI (Windows Management Instrumentation), Microsoft'un Windows işletim sistemlerinde bulunan bir yönetim altyapısıdır. WMI, sistem ve ağ yönetimi için bir çerçeve sağlayarak, uzaktan yönetim ve izleme işlemleri gerçekleştirmek için kullanılır. WMI, Windows'un yönetim ve izleme işlevselliğini standartlaştıran bir arabirim sunar ve genellikle PowerShell ve diğer yönetim araçları gibi birçok farklı programlama dilinde kullanılır.
Her bir disk için gerekli bilgileri çekecek ve renk kodlarını belirleyeceğiz.

Renk Kodlarını Belirleme ve Raporu Doldurma

Her disk için belirlenen eşik değerlere göre renk kodlarını belirleyeceğiz ve raporu dolduracağız.
Bu kod, belirli koşullara göre iki farklı renk sınıfı ($FSPcolorClass ve $FSGBcolorClass) belirler. Eğer Free Space(%) %10 'un altındaysa ve aynı zamanda Free Space (GB) alanı 50GB'ın altındaysa, o zaman hücre rengi "kırmızı" olur; aksi halde "sarı" olur. Çünkü disk boyutu çok büyük olduğunda %10 bir boş alan değeri dahi büyük GB alanalarına denk gelmektedir. Örnek vermek gerekirse 1 TB bir diskin %10'luk bir boş alanı 100 GB'a denk geldiğinden critical seviye olarak değerlendirilebilmesi için GB cinsinden belirlenen eşik sınırına bakılır. 
Aynı şekilde eğer Free Space(%)%20'nin altındaysa ve aynı zamanda Free Space (GB) alanı 50GB'ın altındaysa, o zaman hücre rengi "turuncu" olur; aksi halde "sarı" olur. Eğer bu koşulların hiçbirisi sağlanmazsa, yani diskte toplam boyutunun %20'sinden daha fazla boş alan varsa renk sınıfı "yeşil" olur. Bu kod, disk kullanım durumuna göre renk sınıflarını belirleyerek bir tür görsel geri bildirim sağlamak için kullanılır.
foreach ($server in $servers) {
    $diskInfo = Get-WmiObject -ComputerName $server -Query "SELECT * FROM Win32_LogicalDisk"

    foreach ($disk in $diskInfo) {
        $driveLetter = $disk.DeviceID

        # Skip excluded drive
        if ($driveLetter -eq $excludedDrive) {
            continue
        }
        $volumeName = $disk.VolumeName
        $fileSystem = $disk.FileSystem
        $totalSize = [math]::Round((ConvertTo-GB $disk.Size),1)
        $freeSpace = [math]::Round((ConvertTo-GB $disk.FreeSpace),1)
        $usedSpace = $totalSize - $freeSpace
        $freeSpacePercentage = [math]::Round(($freeSpace / $totalSize) * 100, 2)
        $FSGBcolorClass = ''
        $FSPcolorClass = ''
        if ($freeSpacePercentage -le $FSPThresholdRed) 
        {
            if($freeSpace -le $FSGBThreshold)
            {
                $FSPcolorClass = 'red'
                $FSGBcolorClass = 'transparent'
            }
            else
            {
                $FSPcolorClass = 'yellow'
                $FSGBcolorClass = 'green'
            }
        }
        elseif ($freeSpacePercentage -le $FSPThresholdOrange) 
        {
            if($freeSpace -le $FSGBThreshold)
            {
                $FSPcolorClass = 'orange'
                $FSGBcolorClass = 'transparent'
            }
            else 
            {
                $FSPcolorClass = 'yellow'
                $FSGBcolorClass = 'green'
            }
        }
        else
        {
            $FSPcolorClass = 'green'
        }

Raporu Tamamlama

Son olarak, her disk için elde edilen bilgileri rapora ekleyeceğiz.
	$htmlReport += @"
    <tr>
        <td>$server</td>
        <td>$driveLetter</td>
        <td>$volumeName</td>
        <td>$fileSystem</td>
        <td>$totalSize</td>
        <td class="$FSGBcolorClass">$freeSpace</td>
        <td>$usedSpace</td>
        <td class="$FSPcolorClass">$freeSpacePercentage%</td>
    </tr>
    </table>
</body>
</html>
	"@
    }
}

Raporu Mail Olarak Gönderme

Tamamladığımız rapor içeriğini mail olarak göndermek için aşağıdaki kod bloğunu kullanacağız.

    # Mail configuration
$smtpServer = "smtp.yourdomain.com"
$smtpFrom = "your-email@yourdomain.com"
$smtpTo = "recipient-email@theirDomain.com"
$messageSubject = "Server Disk Usage Report"
$messageBody = $htmlReport
$smtp = New-Object Net.Mail.SmtpClient($smtpServer)
$mailmessage = New-Object Net.Mail.MailMessage($smtpFrom, $smtpTo, $messageSubject, $messageBody)
$mailmessage.IsBodyHTML = $true

# Send the mail
try
{
    $smtp.Send($mailmessage)
    Write-Host "Server Disk usage report sent successfully."
}
catch 
{
    Write-Host "Server Disk usage report could not sent to:$smtpTo address"
}
    
Bu kod, aşağıdaki adımları gerçekleştirir:
  1. Mail Konfigürasyonu: SMTP sunucusu, gönderen e-posta adresi, alıcı e-posta adresi, e-posta konusu ve e-posta gövdesi gibi e-posta gönderimine ilişkin konfigürasyon bilgilerini içerir. Burada ilgili alanları kendi sisteminize göre tanımlamanız gerekmektedir.
  2. SMTP İstemcisi Oluşturma: Net.Mail.SmtpClient sınıfından bir örnek oluşturularak SMTP istemcisi (client) konfigüre edilir.
  3. Mail Mesajı Oluşturma: Net.Mail.MailMessage sınıfından bir örnek oluşturularak e-posta mesajı konfigüre edilir. HTML gövdeli bir e-posta olduğunu belirtmek için IsBodyHTML özelliği true olarak ayarlanır.
  4. E-posta Gönderimi: Send metodu kullanılarak e-posta gönderilir. Gönderim başarılıysa, bir başarı mesajı yazdırılır. Eğer gönderim sırasında bir hata olursa, catch bloğu çalışır ve bir hata mesajı yazdırılır.


Raporu Dosyaya Kaydetme

HTML raporu bir dosyaya kaydetmek için aşağıdaki kodu kullanabilirsiniz. 
# Save HTML report to file
try
{
    $htmlReport | Out-File -FilePath $htmlFilePath
    Write-Host "Disk usage report generated successfully. Path: $htmlFilePath"
}
catch 
{
    Write-Host "Disk usage report could not generated"
}
        

Sonuç

Bu PowerShell scriptini, belirlediğiniz sunucuların disk kullanım durumunu izlemek, raporlamak ve gerektiğinde uyarılar almak için kullanabilirsiniz. Raporun HTML formatında olması, bilgileri kolayca paylaşma ve okuma imkanı sağlar.

Umarım bu makale, PowerShell kullanarak sunucu disk kullanımını izleme ve raporlama konusunda size rehberlik eder. Başka sorularınız veya önerileriniz varsa, lütfen yorum bölümünde paylaşın. İyi çalışmalar!

Please click to access the English article.

Yorumlar

Bu blogdaki popüler yayınlar

Reporting Exchange Mail Traffic and Login Statistics with PowerShell

Exchange Server 2016/2019 Sertifika Yenileme

Bulk Resetting Active Directory User Passwords