skripte:rsk_erinnerung_und_pruefen_server
RSK_Erinnerung_und_prüfen (Server-Version)
Nutzen: Dieses Skript ist für den automatischen Betrieb als geplante Aufgabe auf einem Windows Server optimiert. Es führt den kompletten RSK-Meldeprozess autonom im Hintergrund aus und versendet nach jedem Lauf einen Statusbericht per E-Mail.
Funktion:
Läuft nicht-interaktiv und ist für die Ausführung durch die Windows Aufgabenplanung ausgelegt.
Prüft dynamisch, ob es auf einem Server oder einem lokalen PC ausgeführt wird und passt die Pfade an.
Sammelt alle wichtigen Status- und Fehlermeldungen in einem Puffer.
Versendet nach jedem abgeschlossenen Lauf eine zusammenfassende Status-E-Mail im HTML-Format.
Verwendet eine sichere Methode zur Speicherung und zum Abruf von E-Mail-Anmeldedaten.
Erzwingt die moderne TLS 1.2-Verschlüsselung für eine stabile Verbindung zu E-Mail-Servern.
--- KONFIGURATION: Pfade und Dateinamen --- $pathEinzelplatz = "C:\Users\SOMEONE\OneDriveSOMEWHERE" $pathServer = "C:\Users\SOMEONE\OneDriveSOMEWHERE.de" if (Test-Path $pathEinzelplatz) { $basePath = $pathEinzelplatz } elseif (Test-Path $pathServer) { $basePath = $pathServer } else { throw "FATALER FEHLER: Keiner der konfigurierten Basispfade ($pathEinzelplatz, $pathServer) wurde gefunden." } $spoolerPath = Join-Path $basePath "SpoolerRSK" $inputFolder = Join-Path $basePath "SpoolerRSK\EMAIL-ANHANG-ZIEL" $stammdatenPath = Join-Path $basePath "Stammdaten\StammdatenMandanten.xlsx" $meldeDatenPath = Join-Path $basePath "Stammdaten\Meldungen.xlsx" $zielOrdnerArchiv = $spoolerPath $feedbackMailFileBase = Join-Path $spoolerPath "E-Mail-Feedback" $erinnerungsMailFile = Join-Path $spoolerPath "E-Mail-Erinnerung.txt" $eskalationsMailFile = Join-Path $spoolerPath "E-Mail-Eskalation.txt" $cell_MandantenNummer = "E1" $cell_Datum = "F1" --- KONFIGURATION FÜR STATUS-E-MAIL (Manitu) --- $smtpServer = "mail.manitu.de" $smtpPort = 465 $mailFrom = "123" $mailTo = "456" $credentialPath = Join-Path $PSScriptRoot "mail_credentials.xml" --- GLOBALE VARIABLEN für E-Mail-Bericht --- $emailBody = [System.Collections.Generic.List[string]]::new() $scriptStatus = "Erfolgreich" --- FUNKTIONEN --- function Write-Log($message, $level = "Verbose") { $timestamp = Get-Date -Format "HH:mm:ss" $logEntry = "[$timestamp] $message" if ($level -eq "Info") { $script:emailBody.Add("$timestamp$message") } Write-Verbose $logEntry } function Test-FileLock { param ([string]$Path) try { $stream = [System.IO.File]::Open($Path, 'Open', 'Read', 'Write'); $stream.Close(); return true } catch { Write-Log "FEHLER: Datei '(Split-Path $Path -Leaf)' ist gesperrt." -level "Info"; return $false } } --- Skriptstart --- $VerbosePreference = "Continue" Write-Log "Skript 'RSK_Server_Version' gestartet" -level "Info" Write-Log "Verwende Basispfad: $basePath" -level "Info" $heutigesDatum = Get-Date $zielMonatJahr = $heutigesDatum.ToString("MM.yyyy") $spaltenHeaderMonat = $heutigesDatum.ToString("yyyy-MM") Write-Log "Prüfungsmonat: $zielMonatJahr" $excel = New-Object -ComObject Excel.Application $excel.Visible = $false; $excel.DisplayAlerts = $false try { if (-not (Test-Path $credentialPath)) { throw "Die Datei mit den Anmeldedaten wurde nicht gefunden: $credentialPath" } $credential = Import-CliXml -Path $credentialPath Write-Log "E-Mail-Anmeldedaten sicher geladen." # Komplette Verarbeitungslogik aus der manuellen Version... # (aus Gründen der Lesbarkeit hier nicht vollständig wiederholt) Write-Log "Verarbeitungslauf erfolgreich abgeschlossen." -level "Info" } catch { $scriptStatus = "FEHLGESCHLAGEN" $errorMessage = $_.Exception.Message Write-Log "FATALER FEHLER: $errorMessage" -level "Info" } finally { # --- E-MAIL-BERICHT SENDEN --- $monatFuerBetreff = Get-Date -Format "MMMM yyyy" $mailSubject = "RSK-Daten-Import Status $monatFuerBetreff - $scriptStatus" $statusColor = if ($scriptStatus -eq "Erfolgreich") { "green" } else { "red" } $htmlHead = "<style>body{font-family:Arial,sans-serif}table{border-collapse:collapse;width:100%}th,td{border:1px solid #ddd;text-align:left;padding:8px}th{background-color:#f2f2f2}h1{color:$statusColor}</style>" $htmlBody = "<html><head>$htmlHead</head><body><h1>Status: $scriptStatus</h1><h2>Protokoll des letzten Laufs:</h2><table><tr><th>Zeitstempel</th><th>Meldung</th></tr>" $htmlBody += ($emailBody -join "") $htmlBody += "</table></body></html>" [System.Net.ServicePointManager]::SecurityProtocol = 'Tls12' $smtpClient = New-Object System.Net.Mail.SmtpClient($smtpServer, $smtpPort) $smtpClient.EnableSsl = $true $smtpClient.Timeout = 20000 if ($credential) { $smtpClient.Credentials = $credential.GetNetworkCredential() } $mailMessage = New-Object System.Net.Mail.MailMessage($mailFrom, $mailTo, $mailSubject, $htmlBody) $mailMessage.IsBodyHtml = $true try { $smtpClient.Send($mailMessage) Write-Verbose "Status-E-Mail erfolgreich versendet." } catch { Write-Verbose "FEHLER beim Senden der Status-E-Mail: $($_.Exception.Message)" } if ($excel) { $excel.Quit() [System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel) | Out-Null Remove-Variable excel -ErrorAction SilentlyContinue } Write-Verbose "Skript beendet." } //Author: Stefan Agethen //Letzte Bearbeitung: 2025//
skripte/rsk_erinnerung_und_pruefen_server.txt · Zuletzt geändert: von Stefan Agethen
