Exchange Server Backup Report PowerShell

Bu yazımızda kendi ortamım için kullanmış olduğum ve düzenlemiş olduğum backup report script’i sizlerle paylaşacağım ve nasıl çalıştığından bahsedeceğiz.

Öncelikle 12 – 18 satırlarında bulunan değişkenleri kendi ortamınızı göre düzenlemeniz gerekmektedir, ilgili değişlkenler Mail server, from, to vb. gibi parametreleri içermektedir.

# Mail, Subject and File
$From = "[email protected]"
$To = "[email protected]"
$SMTPServer = "[email protected]"
$Port = 587
$Priority = "High"
$Subject = "Exchange Server Backup Report"
$CredentialFile = "C:\Backup Report\credentials.backup"

Daha sonra script C:\Backup Report klasörünü kontrol eder ve ilgili klasör yoksa klasörü oluşturur, klasör oluşturma işlemini powershell ekranında çıktı olarak görebilmektesiniz. Daha sonra sizden get-credential komutu ile From hesabınızın bilgilerini sorar ve bu hesap bilgilerini .xml olarak oluşturulan Backup Report klasörüne kaydeder, scriptin tekrar çalışması durumunda tekrar kontrol işlemi yapılır hesap bilgileri Import edilir.

# Backup Report Folder
if (!(Test-Path "C:\Backup Report")) {
    New-Item -ItemType Directory -Path "C:\Backup Report"
}

# Credential Check and Save
if (!(Test-Path $CredentialFile)) {
    Get-Credential -Message "Lütfen $From hesabı ile hesap bilgilerini doğrulayın."| Export-Clixml -Path $CredentialFile
}
$Credential = Import-Clixml -Path $CredentialFile

Exchange Server Backup Report scripti mail gönderimini HTML formatında yapmaktadır, ilgili Database için database boyutu, mailbox sayısı, Mounted/Dissmounted durumarını, DAG bilgisini ve yedekleme tipini göstermektedir.

<#
=============================================================================================
Name = Cengiz YILMAZ
Microsoft Certified Trainer (MCT)
Date = 23.03.2023
www.cengizyilmaz.net
www.cozumpark.com/author/cengizyilmaz
============================================================================================
#>

# Mail, Subject and File
$From = "[email protected]"
$To = "[email protected]"
$SMTPServer = "[email protected]"
$Port = 587
$Priority = "High"
$Subject = "Exchange Server Backup Report"
$CredentialFile = "C:\Backup Report\credentials.backup"

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn

# Backup Report Folder
if (!(Test-Path "C:\Backup Report")) {
    New-Item -ItemType Directory -Path "C:\Backup Report"
}

# Credential Check and Save
if (!(Test-Path $CredentialFile)) {
    Get-Credential -Message "Lütfen $From hesabı ile hesap bilgilerini doğrulayın."| Export-Clixml -Path $CredentialFile
}
$Credential = Import-Clixml -Path $CredentialFile

# Database Info
$Databases = Get-MailboxDatabase -Status | Select Name, Server, Mounted, LastFullBackup, LastIncrementalBackup, DatabaseSize, MasterType, MasterServerOrAvailabilityGroup, @{Name='Mailboxes';Expression={(Get-Mailbox -Database $_.Name).Count}}

# Number of unsupported databases
$UnbackedUpCount = ($Databases | Where-Object {-not $_.LastFullBackup -and -not $_.LastIncrementalBackup}).Count
$BackedUpCount = ($Databases.Count) - $UnbackedUpCount

#
$AllDbCount = ($Databases).Count
$BackedUpCount = ($Databases | Where-Object { $_.LastFullBackup }).Count
$UnbackedUpCount = $AllDbCount - $BackedUpCount

# Creating an HTML report
$HTMLReport = @"
<!DOCTYPE html>
<html>
<head>
<style>
table {
    width: 100%;
    border-collapse: collapse;
}
table, th, td {
    border: 1px solid black;
}
th, td {
    padding: 15px;
    text-align: left;
}
th {
    background-color: #f2f2f2;
}
.fail {
    color: red;
    background-color: #fdd;
}
.success {
    background-color: #dfd;
}
.incremental {
    background-color: #ffea7f;
}
</style>
</head>
<body>

<h2>Exchange Server Backup Report</h2>
<p>Toplamda $AllDbCount DB bulunmaktadir. Bunlardan $BackedUpCount tanesi yedeklenmistir ve $UnbackedUpCount tanesi yedeklenmemistir.</p>

<h3>Yedeklenmemis Databases</h3>
<table>
<tr>
    <th>Name</th>
    <th>Server</th>
    <th>DAG</th>
    <th>Health</th>
    <th>Backup Type</th>
    <th>Backup Time</th>
    <th>Database Size</th>
    <th>Mailboxes</th>
</tr>

$($Databases | Where-Object {-not $_.LastFullBackup -and -not $_.LastIncrementalBackup} | ForEach-Object {
    $backupType = "<td class='fail'>Fail</td>"
    $backupTime = 'N/A'
    $health = "$($_.Mounted) / $($_.MasterType)"
    @"
    <tr>
        <td>$($_.Name)</td>
        <td>$($_.Server)</td>
        <td>$($_.MasterServerOrAvailabilityGroup)</td>
        <td>$health</td>
        $backupType
        <td>$backupTime</td>
        <td>$($_.DatabaseSize)</td>
        <td>$($_.Mailboxes)</td>
    </tr>
"@})
</table>

<h3>Yedeklenmis Databases</h3>
<table>
<tr>
    <th>Name</th>
    <th>Server</th>
    <th>DAG</th>
    <th>Health</th>
    <th>Backup Type</th>
    <th>Backup Time</th>
    <th>Database Size</th>
    <th>Mailboxes</th>
</tr>
$($Databases | Where-Object { $_.LastFullBackup -or $_.LastIncrementalBackup } | ForEach-Object {
    $backupType = if ($_.LastFullBackup) { "<td class='success'>Full</td>" } elseif ($_.LastIncrementalBackup) { "<td class='incremental'>Incremental</td>" } else { "<td class='fail'>Fail</td>" }
    $backupTime = if ($_.LastFullBackup) { $_.LastFullBackup } elseif ($_.LastIncrementalBackup) { $_.LastIncrementalBackup } else { 'N/A' }
    $health = "$($_.Mounted) / $($_.MasterType)"
    @"
    <tr>
        <td>$($_.Name)</td>
        <td>$($_.Server)</td>
        <td>$($_.MasterServerOrAvailabilityGroup)</td>
        <td>$health</td>
        $backupType
        <td>$backupTime</td>
        <td>$($_.DatabaseSize)</td>
        <td>$($_.Mailboxes)</td>
    </tr>
"@})
</table>
</body>
</html>
"@

# Sending the report by e-mail
$MessageParameters = @{
    From = $From
    To = $To
    Subject = $Subject
    Priority = $Priority
    Body = $HTMLReport
    BodyAsHtml = $true
    SmtpServer = $SMTPServer
    Port = $Port
    Credential = $Credential
}

Send-MailMessage @MessageParameters

Yorum yapın