Monitorowanie miejsca na dysku – powiadomienie email.

Ostatnio zaszła potrzeba aby jeden z moich serwerów wysłał mi maila gdy miejsce na dysku zacznie się kończyć. Popełniłem taki oto skrypcik. Ma on wadę. Mianowicie zapisane jest w nim hasło do konta email czystym tekstem. Jestem w stanie to ominąć za pomocą Windows Credential Menager’a. Jeśli ktoś będzie zainteresowany mogę się podzielić wiedzą. Zainteresowanych proszę o maila.

Skrypt oprócz wysyłki maila zapisuje również do dziennika aplikacji zdarzenie – informacje lub błąd w zależności czy próg został przekroczony czy nie.

Aby poniższy skrypt zadziałał musimy mieć rzecz jasna konto z którego wyślemy maila. Polecam założenie dedykowanego konta mailowego na nasze alerty – gdy go założysz, musisz przygotować go włączając opcję 'Zezwalaj na mniej bezpieczne aplikacje’.

zezw

Następnie uzupełniamy zmienne:

$MinLevel = tutaj podajesz poniżej jakiej wartości ma wysłać się email.

$Drive = literka dysku – wiadomo.

Zmieniamy również #Dane do maila – $From, $To, $Subject, $PSW. Resztę możesz zostawić.

Następnie tworzymy zadanie w harmonogramie zadań. Wyzwalaczem musi być polecenie Powershell.exe -File Naszskrypt.ps1

 

#
# Skrypt sprawdza miejsce na dysku, w przypadku przekroczenia wyznaczonej wielkości wysyła email i zapisuje zdarzenie w logu aplikacji.
#
# Poziom alertu wyrażony w GB
$MinLevel = 5
$Drive = 'c:'


#Sprawdzamy miejsce na dysku
$TimeStamp = Get-Date -UFormat "%Y%m%d-%H%M%S"
$Filter = "DeviceID='$Drive'"
$disk = Get-WmiObject Win32_LogicalDisk -ComputerName localhost -Filter $Filter |
Select-Object FreeSpace
$FreeSpace = (($Disk.FreeSpace / 1024)/1024)/1024
$FreeGB = [math]::Round($FreeSpace, 1)

#zapis zdarzeń do eventlog'a

$logSourceExists = [System.Diagnostics.EventLog]::SourceExists('FreeSpace') 
if ($logSourceExists -eq $false) {
    New-EventLog -LogName "Application" -Source "FreeSpace"
}

# Dane do maila
$From = "adres_z_ktorego_wysylasz@gmail.com"
$U = $From
$To = "adres_decelowy@domena.pl"
$Subject = "Alert! Tu wpisz temat maila"
$Body = "UWAGA. Kończy się miejsce na dysku $Drive. Wolne miejsce na dysku wynosi $FreeGB GB. Próg alertu to $MinLevel GB. Sprawdzono w dniu $TimeStamp. Możesz również sprawdzić logowanie w eventlogu (dziennik:application, source:FreeSpace, eventID:3001). Ta wiadomość została wygenerowana automatycznie. Nie odpowiadaj na nią."
$SMTPServer = "smtp.gmail.com"
$SMTPPort = "587"
$PSW=’Tu_wpisz_haslo’
$SecurePassword = ConvertTo-SecureString $PSW –AsPlainText –force
$Cred=New-object System.Management.Automation.PSCredential ($U,$SecurePassword)


# Sprawdzam
If ($FreeGB -lt $MinLevel){
    #Write-Host "Jest mniej niż $MinLevel GB na dysku $Drive. Aktualna wartość to $FreeGB. Dziękuje"
    write-eventlog -logname Application -source FreeSpace -eventID 3001 -entrytype Error -message "Jest mniej niż $MinLevel GB na dysku $Drive. Aktualna wartość to $FreeGB GB." -category 1 -rawdata 10,20
    Send-MailMessage -From $From -to $To -Subject $Subject -Body $Body -SmtpServer $SMTPServer -port $SMTPPort -UseSsl -Encoding Unicode -Credential (New-object System.Management.Automation.PSCredential $U,$SecurePassword)
    }
    else {
        #Write-Host "Jest więcej niż $MinLevel GB na dysku $Drive. Email nie zostanie wyslany"
        write-eventlog -logname Application -source FreeSpace -eventID 3001 -entrytype Information -message "Jest WIECEJ niz $MinLevel GB na dysku $Drive. Aktualna wartosc to $FreeGB GB." -category 1 -rawdata 10,20
        }