Ein Abschnitt oder ein einzelner Schritt erscheint nur, wenn seine Bedingung zutrifft — abhaengig von einer Variable des Laufs oder vom Zustand eines anderen Schritts. Der echte Fall steht im Seed: "Mitarbeiter-Onboarding" traegt beide Konto-Abschnitte, fuenf AD-Schritte und vier fuer Entra ID, und `konto_typ` sagt beim Start, welcher gilt. Bisher klickte ein Techniker die anderen neun bei jedem Onboarding weg. Entscheidungen, alle im Issue begruendet: - Laufend ausgewertet, nicht beim Start festgeschrieben. Fuer die Abteilungsabschnitte (#031) ist Festschreiben richtig; fuer Bedingungen nicht — die Antwort auf "ist Pruefen fehlgeschlagen?" entsteht erst waehrend der Arbeit. Ein struktureller Test prueft, dass alle drei Schichten (Abschlussregel, Abarbeitung, Druck) die Auswertung rufen. - Nicht entscheidbar heisst: gilt. Ein Lauf ohne konto_typ zeigt beide Abschnitte — genau wie vorher. Ein Abschnitt zu viel ist sichtbar und korrigierbar, ein fehlender faellt niemandem auf. - OFFEN ist eine Antwort, keine Luecke: waere es unentscheidbar, waere ein bedingter Abschnitt von Anfang an sichtbar. - Eine Bedingung, kein Ausdrucksbaum. Kein und, kein oder. - Verwiesen wird ueber Titel-Pfade, nicht ueber Kennungen: vier Wege schreiben eine Struktur neu und geben neue Kennungen. Zwei stille Datenverluste gefunden, der zweite aelter als dieser Meilenstein: - Der Import verwarf `nurFuerAbteilungen`. Der Export schreibt es seit #031, das Schema nimmt es an, der Import setzte es nicht — eine exportierte Vorlage verlor ihre Abteilungsabschnitte und galt dort fuer alle. - Die tiefe Kopie verwarf es ebenfalls, womit jedes "Bearbeiten" einer Vorlage alle Einschraenkungen verlor. Ursache war ein von Hand getippter Zwischentyp, der weniger Felder nannte als die Abfrage liefert; jetzt aus Prisma abgeleitet, beide Kopierwege teilen eine Stelle, und ein Test vergleicht Kopie und Original Feld fuer Feld. Gefunden hat beides die Klickprobe am gebauten Stand, nicht die Suite: im Editor stand "Bedingung gesetzt", nach "Bearbeiten" war sie weg. Dreizehn Gegenproben liefen, alle wurden rot — und der teuerste Befund lag ausserhalb von allen. 1499 Vitest-Tests (vorher 1457), 115 E2E-Ablaeufe gruen. Closes #39 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
261 lines
12 KiB
JSON
261 lines
12 KiB
JSON
{
|
|
"format": 1,
|
|
"name": "Mitarbeiter-Onboarding",
|
|
"seedSchluessel": "mitarbeiter-onboarding",
|
|
"beschreibung": "Neues Benutzerkonto im Active Directory oder in Entra ID anlegen, Hardware bereitstellen und den ersten Arbeitstag begleiten.",
|
|
"kategorie": "Benutzer",
|
|
"schlagworte": ["onboarding", "eintritt", "benutzerkonto", "active directory", "entra id"],
|
|
"struktur": {
|
|
"variablen": [
|
|
{
|
|
"schluessel": "konto_typ",
|
|
"beschriftung": "Kontotyp",
|
|
"typ": "AUSWAHL",
|
|
"optionen": ["Active Directory", "Entra ID"],
|
|
"pflicht": true
|
|
},
|
|
{
|
|
"schluessel": "vorname",
|
|
"beschriftung": "Vorname",
|
|
"typ": "TEXT",
|
|
"pflicht": true
|
|
},
|
|
{
|
|
"schluessel": "nachname",
|
|
"beschriftung": "Nachname",
|
|
"typ": "TEXT",
|
|
"pflicht": true
|
|
},
|
|
{
|
|
"schluessel": "upn",
|
|
"beschriftung": "UPN (User Principal Name)",
|
|
"typ": "TEXT",
|
|
"pflicht": true
|
|
},
|
|
{
|
|
"schluessel": "sam",
|
|
"beschriftung": "Anmeldename (sAMAccountName)",
|
|
"typ": "TEXT"
|
|
},
|
|
{
|
|
"schluessel": "mail",
|
|
"beschriftung": "Mail-Adresse",
|
|
"typ": "TEXT"
|
|
},
|
|
{
|
|
"schluessel": "abteilung",
|
|
"beschriftung": "Abteilung",
|
|
"typ": "TEXT",
|
|
"pflicht": true
|
|
},
|
|
{
|
|
"schluessel": "ou",
|
|
"beschriftung": "Ziel-OU (leer lassen: nimmt die Ziel-OU der Abteilung)",
|
|
"typ": "TEXT"
|
|
},
|
|
{
|
|
"schluessel": "gruppen",
|
|
"beschriftung": "Gruppen, kommagetrennt (leer lassen: nimmt die Standardgruppen der Abteilung)",
|
|
"typ": "TEXT"
|
|
},
|
|
{
|
|
"schluessel": "eintrittsdatum",
|
|
"beschriftung": "Eintrittsdatum",
|
|
"typ": "DATUM",
|
|
"pflicht": true
|
|
},
|
|
{
|
|
"schluessel": "vorgesetzter",
|
|
"beschriftung": "Vorgesetzter",
|
|
"typ": "TEXT"
|
|
}
|
|
],
|
|
"abschnitte": [
|
|
{
|
|
"titel": "Vorbereitung",
|
|
"schritte": [
|
|
{
|
|
"titel": "Anforderung vollständig: Abteilung, Vorgesetzter, Eintrittsdatum, benötigte Zugriffe, Hardware",
|
|
"hilfetext": "Eintritt am {{eintrittsdatum}} — bis dahin müssen Konto, Postfach und Gerät stehen. Fehlt eine dieser Angaben, steht der Lauf später fest. Einmal beim Vorgesetzten nachfragen ist billiger, als Konto, OU und Gruppen hinterher zu korrigieren.",
|
|
"pflicht": true
|
|
},
|
|
{
|
|
"titel": "Referenzbenutzer für Berechtigungen (falls genannt)",
|
|
"hilfetext": "Ein bestehendes Konto derselben Rolle als Vorbild für Gruppen und Ablagerechte. Nicht blind kopieren: gewachsene Sonderrechte wandern sonst mit. Ist keiner genannt, das hier vermerken.",
|
|
"typ": "TEXT",
|
|
"pflicht": true
|
|
},
|
|
{
|
|
"titel": "Namensschema geprüft: UPN {{upn}}, Anmeldename {{sam}}, Mail {{mail}}",
|
|
"hilfetext": "Vorschläge kommen aus den Namensregeln in den Einstellungen, OU und Gruppen aus der Abteilung. Vor dem Anlegen im Verzeichnis prüfen, ob der Name schon vergeben ist.",
|
|
"pflicht": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"titel": "Konto anlegen (Active Directory)",
|
|
"bedingung": {
|
|
"art": "variable",
|
|
"schluessel": "konto_typ",
|
|
"operator": "ist",
|
|
"wert": "Active Directory"
|
|
},
|
|
"schritte": [
|
|
{
|
|
"titel": "Konto anlegen",
|
|
"hilfetext": "Dieser Abschnitt gilt nur für den Kontotyp „Active Directory“ (gewählt: {{konto_typ}}). Trifft er nicht zu, wird er als Ganzes über „Abschnitt trifft nicht zu“ erledigt — nicht Schritt für Schritt abgehakt.\n\nDas Passwort im Befehl entsteht bei jeder Anzeige neu und wird nirgends gespeichert — weder im Schrittergebnis noch im Protokoll oder im Ausdruck. Deshalb: Befehl ausführen und das Passwort im selben Zug in den Passwortmanager übertragen.",
|
|
"typ": "BEFEHL",
|
|
"pflicht": true,
|
|
"konfig": {
|
|
"shell": "powershell",
|
|
"befehl": "New-ADUser -Name \"{{vorname}} {{nachname}}\" -GivenName \"{{vorname}}\" -Surname \"{{nachname}}\" `\n -DisplayName \"{{vorname}} {{nachname}}\" -SamAccountName \"{{sam}}\" -UserPrincipalName \"{{upn}}\" `\n -EmailAddress \"{{mail}}\" -Department \"{{abteilung}}\" -Path \"{{ou}}\" `\n -AccountPassword (ConvertTo-SecureString \"{{generiertes_passwort}}\" -AsPlainText -Force) `\n -ChangePasswordAtLogon $true -Enabled $true"
|
|
}
|
|
},
|
|
{
|
|
"titel": "Initialpasswort im Passwortmanager hinterlegt und sicher an den Benutzer bzw. Vorgesetzten übermittelt",
|
|
"hilfetext": "Das Passwort aus dem Befehl oben wird nicht gespeichert.",
|
|
"pflicht": true
|
|
},
|
|
{
|
|
"titel": "Gruppen zuweisen",
|
|
"hilfetext": "Setzt die Standardgruppen der Abteilung aus {{gruppen}}. Leerzeichen um die Kommata sind unschädlich, `Trim()` entfernt sie; die Gruppen müssen im Verzeichnis aber genau so heißen.",
|
|
"typ": "BEFEHL",
|
|
"konfig": {
|
|
"shell": "powershell",
|
|
"befehl": "\"{{gruppen}}\".Split(\",\") | ForEach-Object { Add-ADGroupMember -Identity $_.Trim() -Members \"{{sam}}\" }"
|
|
}
|
|
},
|
|
{
|
|
"titel": "Vorgesetzten setzen",
|
|
"hilfetext": "`{{vorgesetzter_sam}}` ist ein eingebauter Platzhalter und kommt aus dem Mitarbeiter am Lauf. Solange die Verknüpfung fehlt, den Anmeldenamen von {{vorgesetzter}} von Hand einsetzen.",
|
|
"typ": "BEFEHL",
|
|
"konfig": {
|
|
"shell": "powershell",
|
|
"befehl": "Set-ADUser -Identity \"{{sam}}\" -Manager \"{{vorgesetzter_sam}}\""
|
|
}
|
|
},
|
|
{
|
|
"titel": "Kontrolle",
|
|
"hilfetext": "Zeigt Name, UPN, Abteilung, Vorgesetzten und Gruppen in einer Liste. Die Ausgabe wirklich lesen: eine fehlende Gruppe fällt sonst erst als fehlender Zugriff auf.",
|
|
"typ": "BEFEHL",
|
|
"konfig": {
|
|
"shell": "powershell",
|
|
"befehl": "Get-ADUser -Identity \"{{sam}}\" -Properties MemberOf, Department, Manager | Format-List Name, UserPrincipalName, Department, Manager, MemberOf"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"titel": "Konto anlegen (Entra ID)",
|
|
"bedingung": {
|
|
"art": "variable",
|
|
"schluessel": "konto_typ",
|
|
"operator": "ist",
|
|
"wert": "Entra ID"
|
|
},
|
|
"schritte": [
|
|
{
|
|
"titel": "Konto anlegen",
|
|
"hilfetext": "Dieser Abschnitt gilt nur für den Kontotyp „Entra ID“ (gewählt: {{konto_typ}}). Trifft er nicht zu, wird er als Ganzes über „Abschnitt trifft nicht zu“ erledigt — nicht Schritt für Schritt abgehakt.\n\n`Connect-MgGraph` fragt einmal nach Anmeldung und Zustimmung. Das Passwort im Befehl entsteht bei jeder Anzeige neu und wird nirgends gespeichert, also sofort weiterverarbeiten.",
|
|
"typ": "BEFEHL",
|
|
"pflicht": true,
|
|
"konfig": {
|
|
"shell": "powershell",
|
|
"befehl": "Connect-MgGraph -Scopes \"User.ReadWrite.All\",\"Group.ReadWrite.All\"\nNew-MgUser -DisplayName \"{{vorname}} {{nachname}}\" -GivenName \"{{vorname}}\" -Surname \"{{nachname}}\" `\n -UserPrincipalName \"{{upn}}\" -MailNickname \"{{sam}}\" -Department \"{{abteilung}}\" -UsageLocation \"DE\" `\n -AccountEnabled -PasswordProfile @{ Password = \"{{generiertes_passwort}}\"; ForceChangePasswordNextSignIn = $true }"
|
|
}
|
|
},
|
|
{
|
|
"titel": "Initialpasswort im Passwortmanager hinterlegt und sicher übermittelt",
|
|
"hilfetext": "Das Passwort aus dem Befehl oben wird nicht gespeichert und ist nach dem Verlassen der Ansicht nicht mehr abrufbar. Nie zusammen mit dem UPN im selben Kanal versenden.",
|
|
"pflicht": true
|
|
},
|
|
{
|
|
"titel": "Gruppen zuweisen",
|
|
"hilfetext": "Sucht jede Gruppe aus {{gruppen}} über ihren Anzeigenamen. Findet der Filter nichts, bleibt `$g` leer und der folgende Aufruf schlägt fehl — dann die Schreibweise prüfen.",
|
|
"typ": "BEFEHL",
|
|
"konfig": {
|
|
"shell": "powershell",
|
|
"befehl": "$u = Get-MgUser -UserId \"{{upn}}\"\n\"{{gruppen}}\".Split(\",\") | ForEach-Object { $g = Get-MgGroup -Filter \"displayName eq '$($_.Trim())'\"; New-MgGroupMember -GroupId $g.Id -DirectoryObjectId $u.Id }"
|
|
}
|
|
},
|
|
{
|
|
"titel": "Zugewiesene Lizenz",
|
|
"hilfetext": "Lizenz per Gruppe (gruppenbasierte Lizenzierung) oder `Set-MgUserLicense`.",
|
|
"typ": "TEXT",
|
|
"pflicht": true
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"titel": "Konto, gemeinsam",
|
|
"schritte": [
|
|
{
|
|
"titel": "MFA-Registrierung vorbereitet bzw. durchgeführt",
|
|
"hilfetext": "Entweder ein befristeter Zugangspass für die Selbstregistrierung oder die gemeinsame Einrichtung am ersten Tag. Ohne MFA kommt der Benutzer bei bedingtem Zugriff nicht an sein Postfach.",
|
|
"pflicht": true
|
|
},
|
|
{
|
|
"titel": "Postfach erreichbar, Signatur eingerichtet",
|
|
"hilfetext": "Einmal anmelden und eine Testmail nach außen senden. Signatur nach der Vorgabe des Hauses, mit richtiger Schreibweise von Name und Funktion.",
|
|
"pflicht": true
|
|
},
|
|
{
|
|
"titel": "Zugänge zu Fachanwendungen angelegt",
|
|
"hilfetext": "Nur die Anwendungen, die die Rolle braucht — nicht alles, was der Referenzbenutzer im Laufe der Jahre angesammelt hat."
|
|
},
|
|
{
|
|
"titel": "Angelegte Fachanwendungs-Zugänge",
|
|
"hilfetext": "Je Zeile eine Anwendung mit Benutzername oder Rolle. Beim Offboarding wird genau diese Liste wieder abgearbeitet.",
|
|
"typ": "TEXT",
|
|
"konfig": {
|
|
"mehrzeilig": true
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"titel": "Hardware",
|
|
"schritte": [
|
|
{
|
|
"titel": "Arbeitsplatzgerät bereitgestellt (eigener Lauf „PC Neuinstallation“ falls nötig)",
|
|
"hilfetext": "Gerät, Tag-Code und Inventarnummer gehören zusammen. Die Installation selbst läuft als eigener Lauf; hier wird nur festgehalten, dass das Gerät bereitsteht.",
|
|
"pflicht": true
|
|
},
|
|
{
|
|
"titel": "Telefon / Softphone eingerichtet",
|
|
"hilfetext": "Durchwahl vergeben, im Telefonbuch eingetragen und einmal in beide Richtungen getestet."
|
|
},
|
|
{
|
|
"titel": "Peripherie vorhanden (Monitor, Dockingstation, Headset)",
|
|
"hilfetext": "Am Arbeitsplatz aufgebaut und angeschlossen, nicht nur aus dem Lager geholt."
|
|
},
|
|
{
|
|
"titel": "Zutrittsmedium / Schlüssel beantragt",
|
|
"hilfetext": "Ausgabe und Rückgabe werden dokumentiert — beim Offboarding wird danach gefragt."
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"titel": "Erster Tag",
|
|
"schritte": [
|
|
{
|
|
"titel": "Anmeldung gemeinsam mit dem Benutzer getestet",
|
|
"hilfetext": "Erstanmeldung mit Passwortwechsel und MFA am eigenen Gerät. Erst danach gilt das Konto als übergeben.",
|
|
"pflicht": true
|
|
},
|
|
{
|
|
"titel": "Kurzeinweisung: Passwortregeln, MFA, Datenablage, Ansprechpartner IT",
|
|
"hilfetext": "Kurz und mündlich, mit dem Hinweis, wo Daten hingehören und wie man die IT erreicht.",
|
|
"pflicht": true
|
|
},
|
|
{
|
|
"titel": "Dokumentation und Inventar aktualisiert",
|
|
"hilfetext": "Mitarbeiter, Gerät, Rufnummer und Zutrittsmedium eingetragen. Was hier fehlt, fehlt beim Offboarding auch.",
|
|
"pflicht": true
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|