Automatiseer Windows Server monitoring en rapportage met PowerShell
description
Met deze prompt kun je een op maat gemaakt PowerShell-script krijgen dat je helpt om je Windows Server effectief te monitoren en automatisch rapportages te genereren. Dit verbetert je serverbeheer door proactief inzicht te geven in prestaties en problemen, waardoor downtime en incidenten worden verminderd. Het is beter dan handmatige methoden omdat het tijd bespaart en consistentie waarborgt.
prompt
Help me een PowerShell-script te maken om mijn Windows Server continue te monitoren en periodieke rapportages te genereren. Server versie: <voer de Windows Server versie in die je gebruikt>
Te monitoren componenten: <beschrijf welke servercomponenten of services je wilt monitoren, bijvoorbeeld CPU-gebruik, schijfruimte, netwerkverkeer>
Rappo ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Hier is een voorbeeld PowerShell-script dat je kunt gebruiken om je Windows Server 2016 continu te monitoren en dagelijks rapportages te genereren over CPU-gebruik en schijfruimte. Het script bevat ook waarschuwingen bij het overschrijden van drempels en kan gemakkelijk worden uitgebreid.
**Stap 1: Het script**
```powershell
# Monitoring Script voor Windows Server 2016
# Dit script controleert CPU-gebruik en schijfruimte, en genereert een rapport met waarschuwingen.
# Configuratie
$rapportPad = "C:\Rapporten" # Map voor rapporten
$rapportNaam = "Rapport_" + (Get-Date -Format "yyyyMMdd") + ".txt"
$cpuDrempel = 80
$schijfDrempel = 10 # percentage vrij
# Zorg dat de rapportmap bestaat
if (!(Test-Path $rapportPad)) {
New-Item -ItemType Directory -Path $rapportPad | Out-Null
}
# Start rapport
$rapport = @()
$rapport += "Monitoring Rapport - " + (Get-Date) - 00:00
$rapport += "--------------------------------------------------"
$rapport += ""
# CPU-gebruik
# Opmerking: Voor CPU gebruik op Windows Server 2016 kan PerformanceCounter worden gebruikt
# of 'Get-Counter' commando
try {
$cpuGebruik = (Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples.CookedValue
$cpuGebruik = [math]::Round($cpuGebruik, 2)
$rapport += "CPU-gebruik: $cpuGebruik %"
if ($cpuGebruik -gt $cpuDrempel) {
$rapport += "WAARSCHUWING: CPU-gebruik boven drempel van $cpuDrempel%!"
}
} catch {
$rapport += "Fout bij het ophalen van CPU-gebruik."
}
# Schijfruimte
# Loop door alle stations
$schijven = Get-PSDrive -PSProvider FileSystem
foreach ($schijf in $schijven) {
$freePercent = ($schijf.Free / $schijf.Used + $schijf.Free) * 100
# Alternatief: gebruik WMI voor preciezere gegevens
$wmi = Get-WmiObject Win32_LogicalDisk -Filter "DeviceID='$($schijf.Name):'"
if ($wmi) {
$freePercent = [math]::Round(($wmi.FreeSpace / $wmi.Size) * 100, 2)
$gebruikPercent = 100 - $freePercent
$rapport += "Stationsletter: $($schijf.Name):"
$rapport += " Vrije ruimte: $freePercent %"
$rapport += " Gebruikte ruimte: $gebruikPercent %"
if ($freePercent -lt $schijfDrempel) {
$rapport += " WAARSCHUWING: Schijfruimte onder drempel van $schijfDrempel%!"
}
$rapport += ""
}
}
# Rapport opslaan
$rapportBestand = Join-Path $rapportPad $rapportNaam
$rapport | Out-File -FilePath $rapportBestand -Encoding UTF8
# Optioneel: e-mail versturen bij waarschuwingen
# (Hier kun je je SMTP-instellingen toevoegen)
Write-Output "Rapport gegenereerd: $rapportBestand"
```
**Stap 2: Automatisering**
Gebruik Taakplanner om dit script dagelijks uit te voeren:
1. Open Taakplanner (`taskschd.msc`)
2. Maak een nieuwe taak
3. Kies voor een dagelijkse planning
4. Voeg een actie toe: voer `powershell.exe` uit met argumenten zoals:
```powershell
-ExecutionPolicy Bypass -File "C:\PadNaarScript\monitoring.ps1"
```
**Uitbreidingsmogelijkheden:**
- Toevoegen van meer componenten zoals geheugen- of netwerkgebruik.
- E-mail notificaties bij waarschuwingen via `Send-MailMessage`.
- Logboek bijhouden van prestaties over tijd.
- Grafieken genereren met bijvoorbeeld Excel of grafieken in PowerShell.
**Belangrijk:**
- Pas de paden en drempels aan naar jouw situatie.
- Test het script handmatig voordat je automatische taken instelt.
Ik hoop dat dit je een goede start geeft voor continue monitoring en rapportage!
provider: deepseek
model: deepseek-chat
Hier is een uitgebreid PowerShell monitoring script voor Windows Server 2016 met duidelijke uitleg:
```powershell
# Server Monitoring Script voor Windows Server 2016
# Monitor CPU-gebruik en schijfruimte met dagelijkse rapportage
# Configuratie parameters - eenvoudig aanpasbaar
$Config = @{
CPUDrempel = 80 # Waarschuwing bij CPU-gebruik > 80%
SchijfDrempel = 10 # Waarschuwing bij schijfruimte < 10%
LogPad = "C:\Monitoring\Logs\"
RapportPad = "C:\Monitoring\Rapporten\"
ServerNaam = $env:COMPUTERNAME
}
# Functie om mappen aan te maken indien niet bestaand
function Initializeer-Mappen {
param($Config)
if (!(Test-Path $Config.LogPad)) {
New-Item -ItemType Directory -Path $Config.LogPad -Force
}
if (!(Test-Path $Config.RapportPad)) {
New-Item -ItemType Directory -Path $Config.RapportPad -Force
}
}
# Functie om CPU-gebruik te monitoren
function Monitor-CPU {
param($Drempel)
try {
$CPUUsage = (Get-Counter "\Processor(_Total)\% Processor Time" -SampleInterval 1 -MaxSamples 5 |
Select-Object -ExpandProperty CounterSamples |
Select-Object -ExpandProperty CookedValue |
Measure-Object -Average).Average
$CPUStatus = if ($CPUUsage -gt $Drempel) { "WAARSCHUWING" } else { "NORMAAL" }
return @{
Usage = [math]::Round($CPUUsage, 2)
Status = $CPUStatus
Drempel = $Drempel
}
}
catch {
return @{
Usage = "N/A"
Status = "FOUT"
Drempel = $Drempel
Fout = $_.Exception.Message
}
}
}
# Functie om schijfruimte te monitoren
function Monitor-Schijfruimte {
param($Drempel)
try {
$Schijven = Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType=3" |
Select-Object DeviceID,
@{Name="VrijeRuimteGB"; Expression={[math]::Round($_.FreeSpace/1GB, 2)}},
@{Name="TotaleRuimteGB"; Expression={[math]::Round($_.Size/1GB, 2)}},
@{Name="PercentageVrij"; Expression={[math]::Round(($_.FreeSpace/$_.Size)*100, 2)}}
$Resultaten = @()
foreach ($Schijf in $Schijven) {
$Status = if ($Schijf.PercentageVrij -lt $Drempel) { "WAARSCHUWING" } else { "NORMAAL" }
$Resultaten += @{
Station = $Schijf.DeviceID
VrijeRuimteGB = $Schijf.VrijeRuimteGB
TotaleRuimteGB = $Schijf.TotaleRuimteGB
PercentageVrij = $Schijf.PercentageVrij
Status = $Status
Drempel = $Drempel
}
}
return $Resultaten
}
catch {
return @{
Station = "N/A"
Status = "FOUT"
Fout = $_.Exception.Message
}
}
}
# Functie om rapport te genereren
function Genereer-Rapport {
param($Config, $CPUData, $SchijfData)
$RapportBestand = "$($Config.RapportPad)ServerRapport_$(Get-Date -Format 'yyyyMMdd_HHmmss').html"
$Tijdstip = Get-Date -Format "dd-MM-yyyy HH:mm:ss"
# HTML rapport opbouw
$HTMLRapport = @"
<!DOCTYPE html>
<html>
<head>
<title>Server Monitoring Rapport - $($Config.ServerNaam)</title>
<style>
body { font-family: Arial, sans-serif; margin: 20px; }
.header { background-color: #f0f0f0; padding: 10px; border-radius: 5px; }
.waarschuwing { background-color: #ffcccc; padding: 10px; margin: 5px 0; border-left: 5px solid red; }
.normaal { background-color: #ccffcc; padding: 10px; margin: 5px 0; border-left: 5px solid green; }
.fout { background-color: #ffffcc; padding: 10px; margin: 5px 0; border-left: 5px solid orange; }
table { width: 100%; border-collapse: collapse; margin: 10px 0; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
</style>
</head>
<body>
<div class="header">
<h1>Server Monitoring Rapport</h1>
<p><strong>Server:</strong> $($Config.ServerNaam)</p>
<p><strong>Datum/Tijd:</strong> $Tijdstip</p>
</div>
<h2>CPU Monitoring</h2>
<div class="$($CPUData.Status.ToLower())">
<p><strong>Gebruik:</strong> $($CPUData.Usage)%</p>
<p><strong>Status:</strong> $($CPUData.Status)</p>
<p><strong>Drempel:</strong> $($CPUData.Drempel)%</p>
"@
if ($CPUData.Fout) {
$HTMLRapport += "<p><strong>Fout:</strong> $($CPUData.Fout)</p>"
}
$HTMLRapport += @"
</div>
<h2>Schijfruimte Monitoring</h2>
<table>
<tr>
<th>Station</th>
<th>Vrije Ruimte (GB)</th>
<th>Totale Ruimte (GB)</th>
<th>Percentage Vrij</th>
<th>Status</th>
</tr>
"@
foreach ($Schijf in $SchijfData) {
$HTMLRapport += @"
<tr>
<td>$($Schijf.Station)</td>
<td>$($Schijf.VrijeRuimteGB)</td>
<td>$($Schijf.TotaleRuimteGB)</td>
<td>$($Schijf.PercentageVrij)%</td>
<td>$($Schijf.Status)</td>
</tr>
"@
}
$HTMLRapport += @"
</table>
</body>
</html>
"@
$HTMLRapport | Out-File -FilePath $RapportBestand -Encoding UTF8
return $RapportBestand
}
# Functie om logboek bij te houden
function Schrijf-Log {
param($Bericht, $Config)
$LogBestand = "$($Config.LogPad)MonitoringLog_$(Get-Date -Format 'yyyyMMdd').txt"
$LogEntry = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - $Bericht"
Add-Content -Path $LogBestand -Value $LogEntry
}
# Hoofd monitoring functie
function Start-Monitoring {
param($Config)
# Initialiseer mappen
Initializeer-Mappen -Config $Config
# Verzamel monitoring data
Schrijf-Log -Bericht "Monitoring gestart" -Config $Config
$CPUData = Monitor-CPU -Drempel $Config.CPUDrempel
$SchijfData = Monitor-Schijfruimte -Drempel $Config.SchijfDrempel
# Genereer rapport
$RapportPad = Genereer-Rapport -Config $Config -CPUData $CPUData -SchijfData $SchijfData
# Log resultaten
Schrijf-Log -Bericht "CPU: $($CPUData.Usage)% - Status: $($CPUData.Status)" -Config $Config
foreach ($Schijf in $SchijfData) {
Schrijf-Log -Bericht "Schijf $($Schijf.Station): $($Schijf.PercentageVrij)% vrij - Status: $($Schijf.Status)" -Config $Config
}
Schrijf-Log -Bericht "Rapport gegenereerd: $RapportPad" -Config $Config
return @{
CPU = $CPUData
Schijven = $SchijfData
RapportPad = $RapportPad
}
}
# UITVOERING - Verwijder commentaar om direct uit te voeren
# $Resultaat = Start-Monitoring -Config $Config
# Write-Host "Monitoring voltooid. Rapport: $($Resultaat.RapportPad)"
```
## Automatisering met Taakplanner:
Maak een scheduled task aan met dit PowerShell commando:
```powershell
# Script opslaan als C:\Monitoring\ServerMonitor.ps1
# Taakplanner commando (uitvoeren als Administrator):
$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File `"C:\Monitoring\ServerMonitor.ps1`""
$Trigger = New-ScheduledTaskTrigger -Daily -At "08:00"
Register-ScheduledTask -TaskName "ServerDailyMonitoring" -Action $Action -Trigger $Trigger -Description "Dagelijkse server monitoring en rapportage"
```
## Uitbreidingsmogelijkheden:
1. **E-mail notificaties** toevoegen:
```powershell
function Verstuur-EmailWaarschuwing {
param($Config, $CPUData, $SchijfData)
# Gebruik Send-MailMessage of SMTP client
}
```
2. **Extra monitoring parameters**:
```powershell
# Geheugen gebruik
Get-Counter "\Memory\Available MBytes"
# Netwerk statistieken
Get-NetAdapterStatistics
```
3. **Database logging** toevoegen voor historische data
4. **Real-time monitoring** met While-loop en Start-Sleep
Het script is modulair opgebouwd voor eenvoudig onderhoud en uitbreidingen. Elke functie heeft een specifieke taak en de configuratie is centraal beheerd.
error: Generation failed [deepseek] prompt_id=4852 locale=pt err=DeepSeek connection/timeout | Generation failed [deepseek] prompt_id=4852 locale=es err=DeepSeek connection/timeout