PowerShell: Windows Sunucularımda Disk Alanı azaldığında beni uyar (E-Posta Bildirimi)


Hiç şüphe yok ki sunucularınızın disk alanına dikkat etmelisiniz. Zamanla disk alanının azalması, giderek daha fazla dosya ve veri kaydedilmesi veya Windows Güncellemeleri nedeniyle pek çok sunucunun çöktüğünü gördüm. Exchange, SQL, AD çalıştırıyorlardı ve hepsi önemli yazılımlara sahip önemli sunuculardı. Şu anda boş disk alanlarını izlemiyorsanız ve elinizde SCCM gibi bir kurumsal araç yoksa bu makale tam size göre. Hepsini PowerShell ile yapıyoruz, başka ne var? Hadi içeri girelim.

Belirtildiği gibi amaç, tüm Windows Sunucularını izlemek için bir izleme çözümü uygulamaktır. Bunu başarmak için birkaç şeye ihtiyacımız var:

  • Ada Göre Tüm Windows Sunucuları (artık bilgisayar hesaplarının olmadığı, temizlenmiş bir Active Directory ortamıyla en iyisi)
  • Tüm sunuculardan boş disk alanı elde etmek için Get-WmiObject win32_logicaldisk içeren bir foreach döngüsü
  • Yalnızca düşük disk alanına sahip sunucular hakkında bildirim almak için döngüdeki bir if ifadesi
  • E-Posta Yapılandırması (belki içinde şifre bulunur, emin olun bu sorunla ilgileneceğim ve size çözüm sunacağım)

Amaç

Hedefi tanımlamak kolaydır. Sunuculardan biri düşük disk alanıyla çalışırken E-Posta almak istiyoruz. E-Posta şu şekilde görünmelidir:

Senaryo

Aşağıdaki komut dosyası, sunucularınızdan birinde %10'dan az disk alanı olması durumunda sizi uyarır.


### Getting all domain-joined Server by Names

$servers=(Get-ADComputer -Filter 'operatingsystem -like "*server*"').Name

### Get only DriveType 3 (Local Disks) foreach Server

ForEach ($s in $servers)

{$Report=Get-WmiObject win32_logicaldisk -ComputerName $s -Filter "Drivetype=3" -ErrorAction SilentlyContinue | Where-Object {($_.freespace/$_.size) -le '0.1'}
$View=($Report.DeviceID -join ",").Replace(":","")
### Send Mail if $Report (<=10%) is true

If ($Report)

{

$EmailTo = "p.gruenauer@domain.xy"
$EmailFrom = "alert@domain.xy"
$user = 'p.gruenauer@domain.xy'
$password = Unprotect-CmsMessage -Path C:\Temp\pw.txt
$Subject = "Alert: PowerShell Storage Report of $s"
$Body = "Server $s storage space has dropped to less than 10 % on $View"
$SMTPServer = "smtp.domain.xy"
$SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body)
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($user, $password)
$SMTPClient.Send($SMTPMessage)

}

}

17,18,19,20 ve 23. satırları kendinize göre düzenlemelisiniz.

20. satır çok ilginç. Bir E-Posta göndermek için genellikle hesabınızın kimliğini E-Posta sunucusunda doğrulamanız gerekir. Bu aynı zamanda şifrenin betiğinize kaydedilmesi gerektiği anlamına da gelir. Bunu önlemek için şifre dosyasını burada açıklandığı şekilde şifreleyin PowerShell: Sertifikalar (Genel Anahtar/Özel Anahtar) kullanarak Verileri Şifreleme ve Şifresini Çözme

Unprotect-CmsMessage, dosya içeriğinin şifresini çözer. Umarım özel anahtara sahip olan tek kişinin siz olduğunuzu ve dolayısıyla bu gezegende şifre dosyasının şifresini çözebilecek tek kişinin siz olduğunuzu unutmayın.

Beğendiyseniz PowerShell ISE oturumunuza kopyalayın ve C:\PowerShell\alert_diskspace.ps1 olarak kaydedin.

Zamanlanmış Görev Oluşturma

Son olarak betiğimizi her gün çalışan Zamanlanmış Görev olarak tamamlayacağız.

Aşağıdaki satırlar, günde bir kez (08:00) C:\PowerShell\alert_diskspace.ps1'i çalıştıran zamanlanmış bir görev oluşturur.

1. satırdaki dosya yolunu düzenlemek isteyebilirsiniz ve 4. satırdaki Kullanıcı Kimliğini değiştirmeniz gerekir.


$Action=New-ScheduledTaskAction -Execute "powershell" -Argument "C:\PowerShell\alert_diskspace.ps1"
$Trigger=New-ScheduledTaskTrigger -Daily -At 08am
$Set=New-ScheduledTaskSettingsSet
$Principal=New-ScheduledTaskPrincipal -UserId "sid-500\patrick" -LogonType S4U
$Task=New-ScheduledTask -Action $Action -Trigger $Trigger -Settings $Set -Principal $Principal -Description "Checks free disk space on all Servers. Sends an E-Mail notification if storage drops below 10%"
Register-ScheduledTask -TaskName "Free Disk Space Check" -InputObject $Task -User "sid-500\patrick" -Password (Read-Host 'Enter Password') -Force

Bu kadar. Sunucularınız izleniyor.

Bir dahaki sefere PowerShell ile tekrar görüşürüz!

İlgili makaleler