Situatie
Ca SysAdmin, una dintre cele mai plictisitoare sarcini este verificarea manuală a serverelor în fiecare dimineață. Pentru a economisi timp și a fi proactiv, am creat un script de PowerShell care generează un raport de stare (Health Check) și îl trimite automat pe e-mail.
Solutie
Pasi de urmat
Ce verifică acest script?
-
Spațiul pe disc: Alertează dacă o partiție are sub 10% spațiu liber.
-
Servicii Critice: Identifică serviciile setate pe “Automatic” care sunt oprite.
-
Event Viewer: Extrage erorile critice apărute în ultimele 24 de ore.
-
Uptime: Calculează de cât timp rulează serverul (util pentru a vedea dacă s-a restartat neprogramat).
<#
.SYNOPSIS
Raport zilnic de sănătate pentru Windows Server cu output HTML stilizat.
.NOTES
Creat pentru comunitatea Ask IT – Versiunea 2026.
#>
# — CONFIGURARE —
$Config = @{
ServerName = $env:COMPUTERNAME
ThresholdPercent = 10
EmailTo = “admin@compania.ro”
EmailFrom = “reports@compania.ro”
SMTPServer = “smtp.office365.com” # Sau serverul tău local
SMTPPort = 587
}
# — COLECTARE DATE —
# 1. Uptime
$Uptime = (Get-Date) – (Get-CimInstance Win32_OperatingSystem).LastBootUpTime
$UptimeString = “{0} zile, {1} ore” -f $Uptime.Days, $Uptime.Hours
# 2. Discuri (cu logică de alertare)
$DiskInfo = Get-CimInstance Win32_LogicalDisk -Filter “DriveType=3” | Select-Object DeviceID,
@{N=’SizeGB’;E={[math]::round($_.Size/1GB,1)}},
@{N=’FreeGB’;E={[math]::round($_.FreeSpace/1GB,1)}},
@{N=’FreePerc’;E={[math]::round(($_.FreeSpace / $_.Size) * 100,1)}}
# 3. Servicii Critice oprite
$CriticalServices = Get-Service | Where-Object { $_.Status -eq “Stopped” -and $_.StartType -eq “Automatic” }
# — GENERARE HTML & CSS —
$CSS = @”
<style>
body { font-family: ‘Segoe UI’, Tahoma, Geneva, Verdana, sans-serif; background-color: #f4f7f6; color: #333; }
.container { width: 90%; margin: auto; background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); }
h2 { border-bottom: 2px solid #2c3e50; color: #2c3e50; padding-bottom: 10px; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th { background-color: #2c3e50; color: white; padding: 12px; text-align: left; }
td { padding: 10px; border-bottom: 1px solid #ddd; }
.critical { background-color: #e74c3c !important; color: white; font-weight: bold; }
.ok { background-color: #2ecc71 !important; color: white; }
.footer { margin-top: 30px; font-size: 0.8em; color: #7f8c8d; }
</style>
“@
$ReportBody = @”
<div class=”container”>
<h2>Raport Sănătate: $($Config.ServerName)</h2>
<p><strong>Generat la:</strong> $(Get-Date)</p>
<p><strong>Uptime:</strong> $UptimeString</p>
<h3>Stare Partitii</h3>
<table>
<tr><th>Drive</th><th>Size (GB)</th><th>Free (GB)</th><th>Free (%)</th></tr>
“@
foreach ($disk in $DiskInfo) {
$class = if ($disk.FreePerc -lt $Config.ThresholdPercent) { “critical” } else { “” }
$ReportBody += “<tr class=’$class’><td>$($disk.DeviceID)</td><td>$($disk.SizeGB)</td><td>$($disk.FreeGB)</td><td>$($disk.FreePerc)%</td></tr>”
}
$ReportBody += “</table>”
if ($CriticalServices) {
$ReportBody += “<h3>⚠️ Servicii Critice Oprite</h3><table><tr><th>Nume</th><th>Display Name</th></tr>”
foreach ($svc in $CriticalServices) {
$ReportBody += “<tr><td>$($svc.Name)</td><td>$($svc.DisplayName)</td></tr>”
}
$ReportBody += “</table>”
} else {
$ReportBody += “<p style=’color:green;’><strong>Toate serviciile automate rulează corect.</strong></p>”
}
$ReportBody += “<div class=’footer’>Acest raport a fost generat automat de PowerShell Task Scheduler.</div></div>”
$FinalHTML = “<html><head>$CSS</head><body>$ReportBody</body></html>”
# — TRIMITERE (Try-Catch) —
try {
# NOTA: Pentru Office 365 e nevoie de autentificare. Aici e varianta simplificată.
Send-MailMessage -To $Config.EmailTo -From $Config.EmailFrom -Subject “Health Check: $($Config.ServerName)” -Body $FinalHTML -BodyAsHtml -SmtpServer $Config.SMTPServer -Port $Config.SMTPPort -UseSsl -ErrorAction Stop
} catch {
Write-Warning “Eroare la trimiterea mail-ului: $($_.Exception.Message)”
}
Instrucțiuni de implementare:
Creează folderul C:\Scripts.
-
Salvează scriptul sub numele
DailyCheck.ps1
Pentru ca acest raport să ajungă la tine la ora 08:00 în fiecare dimineață:
-
Deschide Task Scheduler pe server.
-
Create Basic Task -> Nume: “Daily_Health_Check”. (sau cum iti mai usor sa recunosti)
-
Trigger: Daily, ora 08:00. (sau ora dorita de tine)
-
Action: Start a Program.
-
Program/script:
powershell.exe -
Add arguments:
-ExecutionPolicy Bypass -File "C:\Scripts\ServerHealthCheck.ps1"
-
-
La final, bifează “Run whether user is logged on or not” și “Run with highest privileges”.
Leave A Comment?