Eine Administrationsaufgabe sicher automatisieren
Du entwickelst einen wiederholbaren PowerShell-Ablauf mit validierten Eingaben, Dry-Run, Protokollierung, Tests und Rollback.
Neue Projektordner sollen nachts vorbereitet werden
Die Riedtal Services GmbH betreibt einen Windows-Dateiserver. Für neue Kundenprojekte legt die Administration immer dieselbe Ordnerstruktur an: Eingang, Berichte und Archiv. Bisher überträgt eine Person die Projektdaten aus einer Tabelle und erstellt die Ordner einzeln. Das kostet Zeit und führt zu uneinheitlichen Namen.
Ein Skript soll die Aufgabe künftig aus einer CSV-Datei übernehmen. Es läuft zunächst in einer Testablage. Erst nach einer kontrollierten Freigabe darf ein geplantes Dienstkonto es im vorgesehenen Projektverzeichnis ausführen.
Nach dieser Lektion kannst du:
- eine Administrationsaufgabe in klar begrenzte Schritte zerlegen,
- Eingaben prüfen und Änderungen vorab mit
-WhatIfanzeigen, - einen wiederholbaren, idempotenten Ablauf entwerfen,
- Fehler, Rechte, Protokolle und Geheimnisse einordnen,
- Testfälle und einen begrenzten Rollback dokumentieren.
Du solltest Bedingungen, Schleifen und Funktionen grundsätzlich lesen können. Wenn diese Bausteine noch neu für dich sind, beginne mit der Lektion Programmiergrundlagen an einem Ablauf verstehen. Hier geht es nicht um allgemeine Sprachgrundlagen, sondern um den sicheren Betrieb einer konkreten Administrationsautomatisierung.
Automatisieren heißt, eine Änderung kontrolliert wiederholbar zu machen
Ein Skript ist nicht allein deshalb sicher, weil es dieselbe Arbeit schneller erledigt. Für die Projektordner braucht es einen kontrollierten Weg von der Eingabe bis zum nachweisbaren Ergebnis:
- Die CSV-Datei wird eingelesen und vollständig validiert.
- Aus gültigen Datensätzen entsteht der gewünschte Zielzustand.
- Der Dry-Run zeigt geplante Änderungen, ohne sie auszuführen.
- Nach der Freigabe setzt das Skript nur nötige Änderungen um.
- Das Protokoll hält neue, unveränderte und fehlgeschlagene Schritte fest.
- Tests vergleichen Soll und Ist; das Änderungsjournal begrenzt einen möglichen Rollback.
Die Reihenfolge schützt vor zwei typischen Fehlern. Eine ungültige Projektkennung erreicht das Dateisystem nicht. Außerdem sieht die zuständige Person die geplanten Ziele, bevor das Skript etwas verändert.
Sortieraufgabe
Bringe die sichere Ausführung in eine belastbare Reihenfolge
Ordne die Schritte vom Auftrag bis zur kontrollierten Wiederholung.
Ziehe die Einträge an die richtige Position. Geht auch per Tastatur über den Griff.
Die Reihenfolge stimmt.
Die Reihenfolge passt noch nicht.
Zuerst steht fest, was erlaubt ist. Testdaten prüfen diese Regeln. Der Dry-Run macht die geplante Wirkung sichtbar. Erst danach folgt die freigegebene Änderung. Protokoll und Soll-Ist-Test liefern den Nachweis; ein zweiter Lauf zeigt, ob das Skript wiederholbar arbeitet.
Gültige Eingaben begrenzen den Wirkungsbereich
Die CSV-Datei enthält nur fachliche Steuerdaten:
ProjectCode,DisplayName,OwnerGroup
KUND-2041,Kundenportal Nord,GG_KUND_2041_RW
NETZ-2042,Standortanbindung West,GG_NETZ_2042_RWFür die Projektkennung gilt im Beispiel das Muster VIER BUCHSTABEN, Bindestrich und VIER ZIFFERN. Der Gruppenname darf aus Großbuchstaben, Ziffern und Unterstrichen bestehen. Der Anzeigename darf weder leer noch länger als 80 Zeichen sein.
Diese Regeln sind keine allgemeingültigen Standards. Sie gehören zum neu erstellten Szenario. Im Betrieb würden Auftraggeber und Administration sie passend zum Namenskonzept festlegen.
Eine Prüfung mit regulären Ausdrücken hat hier auch eine Sicherheitsfunktion. Die Zeichenfolgen ../ oder ..\ passen nicht zum erlaubten Muster. Ein Datensatz kann dadurch das festgelegte Stammverzeichnis nicht über eine manipulierte Projektkennung verlassen. Zusätzlich wird das Stammverzeichnis fest konfiguriert und nicht pro CSV-Zeile übernommen.
Mehrfachauswahl
Wähle die Eingaben, die vor einer Änderung geprüft werden
Mehrere Prüfungen gehören zusammen. Wähle alle passenden Aussagen.
Alle passenden Antworten gefunden.
Die Auswahl ist noch nicht vollständig richtig.
Schema, erlaubte Zeichen und Eindeutigkeit machen die Eingabe vorhersagbar. Das Stammverzeichnis gehört in eine kontrollierte Konfiguration. Kennwörter und andere Geheimnisse gehören weder in die CSV-Datei noch in den Quelltext oder das Protokoll.
Der Zielzustand macht das Skript idempotent
Idempotent bedeutet hier: Mehrere Ausführungen mit derselben Eingabe führen zum selben gewünschten Zustand. Beim ersten Lauf legt das Skript fehlende Ordner an. Beim zweiten Lauf erkennt es die vorhandenen Ordner und verändert sie nicht erneut.
Das unterscheidet einen Zielzustand von einer blinden Befehlsfolge:
# Blinde Änderung: versucht bei jedem Lauf erneut, den Ordner anzulegen.
New-Item -ItemType Directory -Path $targetPath
# Zielzustand: ändert nur etwas, wenn der Ordner fehlt.
if (-not (Test-Path -LiteralPath $targetPath -PathType Container)) {
New-Item -ItemType Directory -Path $targetPath
}Test-Path allein reicht trotzdem nicht für jede denkbare Gleichzeitigkeit. Zwei parallele Läufe könnten beide denselben fehlenden Ordner sehen. Der geplante Job wird deshalb so konfiguriert, dass pro Zielablage höchstens eine Instanz läuft. Für verteilte Systeme wären weitergehende Sperr- oder Transaktionskonzepte nötig.
PowerShell zeigt Änderungen vor der Ausführung
Eine erweiterte PowerShell-Funktion kann mit SupportsShouldProcess die gemeinsamen Parameter -WhatIf und -Confirm anbieten. Vor jeder Änderung fragt die Funktion über $PSCmdlet.ShouldProcess(...), ob sie ausgeführt werden soll. Bei -WhatIf beschreibt PowerShell die Aktion und ShouldProcess gibt false zurück. Der Änderungsblock läuft dann nicht.
Der folgende Ausschnitt zeigt den Kern des Ablaufs. Das Beispiel ist bewusst auf eine Testablage begrenzt. Die eigentliche Rechtevergabe bleibt außerhalb dieses Ausschnitts, weil ACL-Befehle vom eingesetzten Dateisystem, vom vorhandenen Gruppenmodell und vom Freigabekonzept abhängen.
function Initialize-ProjectFolders {
[CmdletBinding(SupportsShouldProcess)]
param(
[Parameter(Mandatory)]
[ValidateScript({ Test-Path -LiteralPath $_ -PathType Leaf })]
[string] $CsvPath,
[Parameter(Mandatory)]
[ValidateScript({ Test-Path -LiteralPath $_ -PathType Container })]
[string] $RootPath
)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
$rows = @(Import-Csv -LiteralPath $CsvPath)
if ($rows.Count -eq 0) { throw 'Die CSV-Datei enthält keine Projekte.' }
$requiredColumns = 'ProjectCode', 'DisplayName', 'OwnerGroup'
$actualColumns = @($rows[0].PSObject.Properties.Name)
foreach ($column in $requiredColumns) {
if ($column -notin $actualColumns) { throw "Spalte fehlt: $column" }
}
$duplicates = $rows | Group-Object ProjectCode | Where-Object Count -gt 1
if ($duplicates) { throw 'Die CSV-Datei enthält doppelte Projektkennungen.' }
foreach ($row in $rows) {
if ($row.ProjectCode -cnotmatch '^[A-Z]{4}-[0-9]{4}$') {
throw "Ungültige Projektkennung: $($row.ProjectCode)"
}
if ($row.OwnerGroup -cnotmatch '^GG_[A-Z0-9_]{3,50}$') {
throw "Ungültiger Gruppenname für $($row.ProjectCode)"
}
if ([string]::IsNullOrWhiteSpace($row.DisplayName) -or
$row.DisplayName.Length -gt 80) {
throw "Ungültiger Anzeigename für $($row.ProjectCode)"
}
$projectPath = Join-Path $RootPath $row.ProjectCode
foreach ($name in '.', 'Eingang', 'Berichte', 'Archiv') {
$targetPath = if ($name -eq '.') { $projectPath } else {
Join-Path $projectPath $name
}
if (Test-Path -LiteralPath $targetPath -PathType Container) {
Write-Information "UNCHANGED folder=$targetPath"
continue
}
if ($PSCmdlet.ShouldProcess($targetPath, 'Ordner anlegen')) {
try {
New-Item -ItemType Directory -Path $targetPath | Out-Null
Write-Information "CREATED folder=$targetPath"
}
catch {
Write-Error "FAILED folder=$targetPath error=$($_.Exception.Message)"
throw
}
}
}
}
}Ein Dry-Run verwendet denselben Entscheidungsweg wie die spätere Ausführung:
Initialize-ProjectFolders `
-CsvPath '.\projekte.csv' `
-RootPath 'D:\Automation-Test\Projekte' `
-WhatIfDer Dry-Run ist eine Vorschau, kein Beweis für eine erfolgreiche Änderung. Zwischen Vorschau und Ausführung können sich Zustand oder Berechtigungen ändern. Deshalb folgen nach der echten Ausführung weiterhin Soll-Ist-Tests.
Protokollierung soll Entscheidungen erklären, aber keine Geheimnisse verraten
Die Meldungen CREATED, UNCHANGED und FAILED beantworten drei Fragen: Was wurde neu angelegt, was war bereits richtig und wo ist der Lauf abgebrochen? Ein geplanter Job kann diese Informations- und Fehlerströme in eine zugriffsgeschützte Protokolldatei oder in die zentrale Überwachung umleiten.
Ein brauchbarer Eintrag enthält mindestens Zeitpunkt, Laufkennung, Skriptversion, Zielobjekt, Aktion und Ergebnis. Bei Fehlern kommt eine verständliche Fehlerklasse hinzu. Die rohe CSV-Datei, Kennwörter, Zugriffstoken oder der Inhalt vertraulicher Dateien gehören nicht in das Protokoll.
Das Beispiel benötigt kein Kennwort. Der Job läuft unter einer dafür eingerichteten technischen Identität. Wenn eine spätere Erweiterung ein Geheimnis braucht, bezieht das Skript es zur Laufzeit aus einem geeigneten Geheimnisspeicher. Das Geheimnis steht weder im Quelltext noch in den Startparametern oder der CSV-Datei. Auch ein verschleierter Klartextwert im Repository wäre kein sicherer Geheimnisspeicher.
Rechte werden auf den Auftrag begrenzt
Für den geplanten Lauf gilt das Prinzip der geringsten Berechtigungen:
- Das Dienstkonto darf die freigegebene CSV-Datei lesen.
- Es darf ausschließlich unterhalb der vorgesehenen Projektablage Ordner anlegen.
- Es braucht kein Domänenadministrationsrecht und keine interaktive Anmeldung.
- Protokolle dürfen nur die zuständigen Betriebsrollen lesen und ändern.
- Die fachlichen Projektgruppen erhalten ihre Zugriffsrechte über einen getrennt geprüften ACL-Schritt.
Die Trennung ist bewusst. Ein Skript, das Ordner, Gruppen, Berechtigungen und Datenmigration zugleich verändert, vergrößert seinen Wirkungsbereich und erschwert einen sicheren Rollback.
Schnellcheck
Triff Entscheidungen für den sicheren Betrieb
Entscheide dich bei jeder Frage. Du bekommst die Erklärung direkt nach deiner Antwort.
Geschafft
von 3
Situationen richtig eingeordnet.
Fehler müssen sichtbar abbrechen
PowerShell unterscheidet unter anderem Fehler, die einen Befehl nicht automatisch beenden, und beendende Fehler. Ein catch-Block verarbeitet Fehler nur zuverlässig, wenn sie den umschlossenen Ablauf beenden. Im Beispiel setzt $ErrorActionPreference = 'Stop' nicht beendende Fehler für den Skriptbereich auf beendendes Verhalten. Alternativ kann ein einzelner kritischer Befehl -ErrorAction Stop verwenden.
Der Fehler wird nicht nur ausgegeben und anschließend verschluckt. Nach der Protokollmeldung wirft throw ihn erneut. Der geplante Job erhält dadurch einen fehlgeschlagenen Status und kann die Überwachung informieren.
Fehlersuche
Finde die Stelle, die einen falschen Erfolg meldet
Der Ordner konnte wegen fehlender Rechte nicht angelegt werden. Der Job endet trotzdem mit Erfolg. Wähle die Ursache.
Fehler gefunden.
Diese Stelle ist nicht die Ursache.
return beendet die Funktion hier regulär. Der aufrufende Job erkennt dadurch keinen Fehlerstatus. Nach der verständlichen Protokollmeldung sollte der catch-Block den Fehler mit throw weitergeben oder einen ausdrücklich ausgewerteten Fehlerstatus liefern.
Tests prüfen Zustand, Wiederholung und Schutzgrenzen
Ein einzelner erfolgreicher Lauf reicht nicht. Der Testplan verbindet Eingabe, Ausgangszustand und erwartetes Ergebnis:
| Test | Ausgangslage und Eingabe | Erwartetes Ergebnis |
|---|---|---|
| Normalfall | gültige CSV, Zielordner fehlen | Dry-Run nennt nur geplante Ziele; echter Lauf legt genau die vorgesehenen Ordner an |
| Wiederholung | gültige CSV, alle Zielordner vorhanden | keine neue Änderung; Protokoll meldet UNCHANGED |
| Teilzustand | Projektordner vorhanden, Archiv fehlt | nur Archiv wird angelegt |
| ungültige Kennung | ../../Daten als Projektkennung | Validierung bricht vor jeder Änderung ab |
| Duplikat | dieselbe Projektkennung zweimal | Validierung bricht vor jeder Änderung ab |
| fehlendes Recht | Dienstkonto darf in der Testablage nicht schreiben | Lauf endet als Fehler und nennt das betroffene Ziel, ohne Geheimnisse zu protokollieren |
| Parallelstart | eine Instanz läuft bereits | Zeitplanung startet keine zweite Instanz für dieselbe Ablage |
Normal-, Rand- und Fehlerfälle beantworten verschiedene Fragen. Der Wiederholungstest prüft das idempotente Verhalten. Der Negativtest mit fehlendem Schreibrecht zeigt, ob ein Betriebsfehler sichtbar wird. Die manipulierte Kennung prüft die Schutzgrenze vor dem Dateisystemzugriff.
Ein Rollback nimmt nur eindeutig eigene Änderungen zurück
Vor dem Produktivlauf bekommt jede Ausführung eine Laufkennung. Ein Änderungsjournal hält für jeden tatsächlich neu angelegten Ordner dessen vollständigen Pfad und die Laufkennung fest. Bereits vorhandene Ordner stehen nicht als eigene Änderung im Journal.
Der dokumentierte Rollback läuft in umgekehrter Reihenfolge:
- Die zuständige Person stoppt weitere Läufe und prüft die Laufkennung.
- Sie vergleicht die Journalpfade mit dem festgelegten Stammverzeichnis.
- Sie entfernt nur leere Ordner, die dieser Lauf neu angelegt hat.
- Enthält ein Ordner inzwischen Dateien, bleibt er bestehen und wird manuell bewertet.
- Der Rollback und ausgelassene Objekte werden protokolliert.
- Ein Soll-Ist-Test bestätigt den verbleibenden Zustand.
Ein pauschales Remove-Item -Recurse gehört nicht in diesen Rollback. Nach der Ausführung könnten andere Prozesse Dateien abgelegt haben. Diese Daten darf das Skript nicht allein deshalb löschen, weil es ursprünglich den Ordner angelegt hat.
Transferaufgabe
Entwirf eine sichere Automatisierung für temporäre Austauschordner
Ein Supportteam legt für Wartungsfälle temporäre Austauschordner an. Eine CSV-Datei enthält Ticketkennung, verantwortliche Gruppe und Ablaufdatum. Entwirf den Ablauf vom Eingang bis zur kontrollierten Rücknahme. Du brauchst keinen vollständigen Programmcode.
Musterlösung vergleichen
Musterlösung: Die CSV-Datei enthält TicketCode, OwnerGroup und ExpiresOn. Erlaubt sind eindeutige Ticketkennungen nach dem betrieblichen Muster, vorhandene freigegebene Gruppen und ein Ablaufdatum in einem vereinbarten Zeitraum. Das Skript liest alle Zeilen und bricht vor einer Änderung ab, wenn ein Pflichtfeld fehlt, eine Kennung doppelt vorkommt oder ein Datum nicht interpretierbar ist.
Der Zielzustand besteht aus genau einem Austauschordner pro gültigem Ticket sowie festgelegten Unterordnern. Vorhandene korrekte Ordner bleiben unverändert. -WhatIf zeigt Pfad und geplante Aktion. Nach der Freigabe läuft das Skript unter einem technischen Konto, das nur die Eingabe lesen und unterhalb der Austauschablage schreiben darf. Benötigte Geheimnisse kämen aus einem geeigneten Geheimnisspeicher; für das reine Anlegen der Ordner ist keines nötig.
Das Protokoll nennt Laufkennung, Skriptversion, Ticketkennung, Ziel, Aktion und Ergebnis. Es enthält weder vertrauliche Dateiinhalte noch Zugangsdaten. Ein Normaltest prüft die vollständige Anlage. Ein Wiederholungstest erwartet keine Änderung. Fehlerfälle prüfen eine doppelte Kennung, ein ungültiges Datum und fehlendes Schreibrecht. Jeder tatsächlich neu angelegte Ordner wird mit Laufkennung im Änderungsjournal erfasst.
Für den Rollback werden neue Läufe gestoppt und die Journalpfade gegen das feste Stammverzeichnis geprüft. Nur leere Ordner aus dem ausgewählten Lauf werden in umgekehrter Reihenfolge entfernt. Ordner mit inzwischen abgelegten Dateien bleiben bestehen und werden dem Supportteam zur Entscheidung gemeldet. Abschließend dokumentiert ein Soll-Ist-Test den verbleibenden Zustand.
Was du für den Betrieb mitnimmst
Eine sichere Administrationsautomatisierung beginnt bei einem begrenzten Auftrag. Validierte Eingaben und ein festes Stammverzeichnis halten die Wirkung im vorgesehenen Bereich. ShouldProcess ermöglicht eine Vorschau mit -WhatIf, ersetzt aber nicht den Test nach der Ausführung.
Der Zielzustand macht Wiederholungen berechenbar. Protokollierung unterscheidet neue, unveränderte und fehlgeschlagene Schritte. Ein begrenztes Dienstkonto reduziert den möglichen Schaden. Geheimnisse werden nur bei Bedarf aus einem geeigneten Speicher bezogen und nie in Quelltext oder Protokoll geschrieben.
Damit steht der Ablauf vom Auftrag bis zur Rücknahme. Die Automatisierung führt nicht nur Befehle aus. Sie macht ihre Voraussetzungen, Entscheidungen und Grenzen prüfbar.
Quellenbasis und Abgrenzung
Der Rahmenlehrplan ordnet das Bereitstellen von Serverdiensten und das Automatisieren von Administrationsaufgaben dem Lernfeld 10b zu. Die Ausbildungsordnung trägt die Bezüge zu Qualitätssicherung, IT-Sicherheit, Automatisierung von Teilaufgaben und Administration von IT-Systemen. Der Prüfungskatalog nennt wiederkehrende Systemabläufe mit PowerShell, Bash oder Python sowie Qualitätssicherung und Tests als mögliche Themenbreite.
Die Beispielprüfung wurde nur auf der Ebene der Aufgabenform ausgewertet: einen Ablauf lesen, Fehler erkennen und eine Korrektur begründen. Szenario, CSV-Daten, Code und Lösungen dieser Lektion sind neu erstellt. Sie treffen keine Aussage darüber, welches Thema in einem konkreten Prüfungstermin vorkommt.
Die Lektion behandelt den sicheren Ablauf einer überschaubaren Dateisystemautomatisierung. Allgemeine Kontrollstrukturen, objektorientierter Entwurf, produktspezifische Zugriffslisten, zentrale Überwachungsplattformen und verteilte Transaktionen brauchen eigene Lerneinheiten.
Belegmatrix
| Lernziel | Ordnungsmittel | Quellen | Lernaktivität |
|---|---|---|---|
| Aufgabe in Eingaben, Prüfungen, Änderungen und Ausgaben zerlegen | LF10b, A10, C3, SI-PB2 | Rahmenlehrplan; Ausbildungsordnung; Prüfungskatalog | Ablaufdiagramm, Sortieraufgabe |
| Validierung, Dry-Run und Idempotenz anwenden | LF10b, A6, A10, C3, SI-PB2 | Ausbildungsordnung; Prüfungskatalog; Microsoft Learn zu ShouldProcess | CSV-Szenario, Mehrfachauswahl, PowerShell-Beispiel, Quiz |
| Fehler, Protokolle, Rechte und Geheimnisse einordnen | LF10b, A5, A6, C3, SI-PB2 | Ausbildungsordnung; Microsoft Learn zu Fehlerbehandlung und SecretManagement | Fehlersuche, Quiz, Betriebskonzept |
| Tests und begrenzten Rollback dokumentieren | LF10b, A5, C3, SI-PB2 | Ausbildungsordnung; Prüfungskatalog; abstrahierte Aufgabenform der Beispielprüfung | Testmatrix, Rollback-Schritte, Transferaufgabe |
Durchgearbeitet?
Markiere die Lektion als erledigt, dein Fortschritt wird lokal gespeichert.