Health Check automat pentru Windows Server via PowerShell

Configurare noua (How To)

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?

  1. Spațiul pe disc: Alertează dacă o partiție are sub 10% spațiu liber.

  2. Servicii Critice: Identifică serviciile setate pe “Automatic” care sunt oprite.

  3. Event Viewer: Extrage erorile critice apărute în ultimele 24 de ore.

  4. 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ță:

  1. Deschide Task Scheduler pe server.

  2. Create Basic Task -> Nume: “Daily_Health_Check”. (sau cum iti mai usor sa recunosti)

  3. Trigger: Daily, ora 08:00. (sau ora dorita de tine)

  4. Action: Start a Program.

    • Program/script: powershell.exe

    • Add arguments: -ExecutionPolicy Bypass -File "C:\Scripts\ServerHealthCheck.ps1"

  5. La final, bifează “Run whether user is logged on or not” și “Run with highest privileges”.

Tip solutie

Permanent

Voteaza

(2 din 5 persoane apreciaza acest articol)

Despre Autor

Leave A Comment?