> For the complete documentation index, see [llms.txt](https://docs.realmjoin.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.realmjoin.com/de/automatisierung/runbooks/runbook-customization.md).

# Runbook-Anpassung

## Überblick

Die RealmJoin-Runbook-Implementierung bietet dem Autor eines Runbooks oder dem Administrator einer Umgebung Anpassungsmöglichkeiten, sodass sie:

* kundenspezifische/Tenant-spezifische Parameter und Vorlagen hosten
* UI-Elemente wie Benutzerauswahlfelder oder Dropdown-Auswahlen anbieten
* menschenlesbare Erklärungen von Parametern anzeigen
* nicht benötigte UI-Elemente ausblenden

<figure><img src="/files/76b6516c2b7abccee9bfd796f014cc6fdf3455f4" alt=""><figcaption></figcaption></figure>

Die Anpassungen können im Runbook selbst und/oder in der RealmJoin-Portal-Instanz des Kunden gespeichert werden. Standardmäßig werden wir versuchen, in den auf [GitHub](https://github.com/realmjoin/realmjoin-runbooks).

Einige Runbooks werden Beispiele enthalten, wie kundenspezifische Vorlagen konfiguriert werden können, etwa zur Angabe von Office-Standorten für das Onboarding von Benutzern.

### Formatieren

Die Anpassung kann definiert werden (in absteigender Prioritätsreihenfolge)

* JSON-Block in [RealmJoin-Portal-Einstellungen](https://portal.realmjoin.com/settings/runbooks-customizations), überschreibt das Standardverhalten des Runbooks
* JSON-Block im Header eines Runbooks

Zusätzlich (mit der niedrigsten Priorität)

* pro Parameter im Runbook-Header
* pro Parameter im Param-Block des Runbooks (unter Verwendung des RJRb Helper Module)

Einige Funktionen (wie Vorlagen) sind nur im JSON-Format verfügbar. Einige Funktionen (wie das Erstellen einer Benutzerauswahl) sind nur durch die Angabe eines Datentyps im Param-Block verfügbar. Sie können für optimale Ergebnisse mehrere Arten von Anpassungen kombinieren.

## Runbook-Param-Block

Das RealmJoin Portal analysiert den PowerShell-Param-Block eines Runbooks, um zu bestimmen, welche Eingabefelder angezeigt werden sollen. Wenn möglich, validiert es die Eingaben außerdem entsprechend dem für eine Variable angegebenen .NET-Typ.

Die folgenden Datentypen werden derzeit verstanden:

* `[bool]`, `[boolean]` - zeigt einen binären Schalter an
* `[string]` - zeigt ein Textfeld zur Eingabe beliebiger alphanumerischer Daten an
* `[int]` - zeigt ein Textfeld an, das nur numerische Eingaben zulässt
* `[DateTime]`, `[DateTimeOffset]` - zeigt einen Datum/Uhrzeit-Auswahldialog an

Sie können Standard-PowerShell-Modifikatoren auf Parameter anwenden. RealmJoin Portal versteht insbesondere, wenn Sie `[Parameter(Mandatory = $true)]` angeben, um einen Pflichtparameter zu kennzeichnen und zu erzwingen, dass diese Parameter ausgefüllt werden.

Wo möglich, liest RealmJoin Portal angegebene Standardwerte auch aus und zeigt sie in der UI an.

Beachten Sie, dass Standardwerte aus dem Runbook durch Anpassungen überschrieben werden können. Außerdem können Parameter durch Anpassungen vollständig ausgeblendet werden.

### Parameter anpassen

Um Parameter anpassen zu können, stellen Sie bitte sicher, dass Sie RealmJoin's Runbook Helper PS Module in Ihr Runbook einbinden:

`#Requires -Modules @{ModuleName = "RealmJoin.RunbookHelper"; ModuleVersion = "0.6.0" }`

Sie können dann `[ValidateScript( { Use-RJInterface ... } )]` Anweisungen in die Parameterdefinitionen aufnehmen. Das folgende Beispiel erstellt zum Beispiel eine Benutzerauswahl, mit der ein Entra ID-Benutzer ausgewählt werden kann, und übergibt dessen Objekt-ID als Zeichenkette an das Runbook.

```powershell
param(
    [ValidateScript( { Use-RJInterface -DisplayName "Gerät diesem Benutzer zuweisen (optional)" -Type Graph -Entity User } )]
    [string] $AssignedUserId = ""
)
```

Gehen wir das Schritt für Schritt durch. `[ValidateScript...]` ist ein Modifikator für den nächsten im Param-Block definierten Parameter. In diesem Fall ist die Variable `$AssignedUserId`.

`Use-RJInterface` ist Teil unseres [RealmJoin Runbook Helper](https://github.com/realmjoin/RealmJoin.RunbookHelper) PowerShell-Modules. Es ermöglicht Ihnen anzugeben, welche Art von Eingabe Sie mithilfe von `-Type` und `-Entity`erwarten, sofern dies nicht bereits vollständig durch den Variablentyp definiert ist.

`-DisplayName` ermöglicht es Ihnen, RealmJoin Portal eine menschenlesbare Eingabeaufforderung / Beschreibung für diesen Parameter zu übergeben.

#### Graph-Ressourcen

Im obigen Beispiel ist die Informationsquelle MS Graph, wie beschrieben durch `-Type Graph`. Für MS Graph verwenden Sie `-Entity` um anzugeben, welche Art von Ressource Sie erwarten. Verfügbare Entitäten sind `Benutzer`, `Gruppe`, `Gerät`. Dadurch wird ein Auswahlfeld für Benutzer, Gruppen oder Geräte im angegebenen Entra ID erstellt.

Das Auswahlfeld enthält eine Schnellsuche, um die benötigte Ressource leicht einzugrenzen.

![Beispiel für Auswahlfeld](/files/911b8089249c23b0de9115269f896d725eafcf62)

Derzeit ist mit einem Auswahlfeld keine Mehrfachauswahl möglich.

Standardmäßig gibt ein MS Graph-Auswahlfeld die ID des Objekts zurück. Wenn Sie z. B. stattdessen den User Principal Name benötigen, achten Sie darauf, "name" als Suffix im Namen Ihrer Variable zu verwenden. Um also die ID eines Benutzers zu erhalten, benennen Sie den Parameter `$userid`. Wenn Sie einen UPN möchten, nennen Sie ihn `$username`.

#### Graph-Filterung

Wenn Sie ein auf MS Graph basierendes Auswahlfeld verwenden, können Sie außerdem `-Filter` angeben und einen [ODATA-Filter](https://docs.microsoft.com/en-us/graph/query-parameters?context=graph%2Fapi%2F1.0\&view=graph-rest-1.0#filter-parameter) verwenden, um die im Auswahlfeld angebotenen Objekte einzuschränken.

Das folgende Beispiel listet nur Gruppen aus Entra ID auf, die mit "LIC\_" beginnen.

```powershell
param(
    [Parameter(Mandatory = $true)]
    [ValidateScript( { Use-RJInterface -Type Graph -Entity Group -Filter "startswith(DisplayName, 'LIC_')" -DisplayName "Lizenzgruppe" } )]
    [String] $GroupID_License
)
```

Sie können Filter vorbereiten und sie mithilfe des [zentralen Datenspeichers](#graph-filters)in mehreren Skripten wiederverwenden. Verweisen Sie in diesem Fall einfach über `-Filter "ref:LicenseGroup"`, wobei `ref:` angibt, dass nach einem gespeicherten Filter gesucht werden soll.

```powershell
param(
    [Parameter(Mandatory = $true)]
    [ValidateScript( { Use-RJInterface -Type Graph -Entity Group -Filter "ref:LicenseGroup" } )]
    [String] $GroupID_License
)
```

Dieses konkrete Beispiel `ref:LicenseGroup` ist standardmäßig ohne weitere Konfiguration verfügbar.

![ODATA-Filter](/files/1a5c80af5aad018e8182912d822b12d1214524d4)

## Runbook-Header

Das Portal kann den [kommentarbasierten Hilfetext](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_comment_based_help?view=powershell-5.1) Abschnitt eines Runbooks analysieren, falls vorhanden.

Hier ist ein Beispiel:

```powershell
<#
  .SYNOPSIS
  (Ent-)Zuweisen einer Lizenz an einen Benutzer über die Gruppenmitgliedschaft.

  .DESCRIPTION
  (Ent-)Zuweisen einer Lizenz an einen Benutzer über die Gruppenmitgliedschaft. Ausführlichere Beschreibung...

  .PARAMETER DefaultGroups
  Durch Kommas getrennte Liste der zuzuweisenden Gruppen, z. B. "DL Sales,LIC Internal Product"

  .NOTES
  Berechtigungen:
  MS Graph (API):
  - User.Read.All
  - GroupMember.ReadWrite.All 
  - Group.ReadWrite.All

  .INPUTS
  RunbookCustomization: {
        "Parameters": {
            "UserName": {
                "Hide": true
            },
            "Remove": {
                "DisplayName": "Lizenz zuweisen oder entfernen",
                "SelectSimple": {
                    "Assign License to User": false,
                    "Remove License from User": true
                }
            }
        }
    }
#>
```

`.SYNOPSIS` - Geben Sie eine sehr kurze Beschreibung der Funktion Ihres Runbooks an. Diese wird in der Liste der verfügbaren Runbooks angezeigt.

`.DESCRIPTION` - Geben Sie eine Beschreibung der Funktion Ihres Runbooks an. Sie kann etwas mehr Details enthalten, da sie innerhalb des Ausführungs-/Parameterdialogs des Runbooks angezeigt wird.

`.PARAMETER` - Muss von einem Parameternamen gefolgt werden. Ermöglicht es Ihnen, eine detaillierte Erklärung der erwarteten Eingabe für den betreffenden Parameter anzugeben.

`.INPUTS` - Kann einen Block mit JSON-basierter Runbook-Anpassung enthalten.

`.NOTES` - Wird nicht analysiert / gerendert. Bitte verwenden Sie diesen Bereich, um festzuhalten, welche Berechtigungen und Anforderungen für Ihr Runbook gelten.

`.EXAMPLE` - Wird nicht analysiert / gerendert. Kann ein Beispiel für eine JSON-basierte Anpassung enthalten, die im RealmJoin-Datenspeicher in Ihrem Tenant verwendet werden kann. Dies können Beispiele dafür sein, wie Vorlagen z. B. für unterschiedliche Workflows oder Benutzerklassen erstellt werden.

## JSON Based Customizing

### Zentraler Datenspeicher

Jeder Azure-Tenant kann einen Datenspeicher für "Runbook Customizations" bereitstellen, zu finden unter <https://portal.realmjoin.com/settings/runbooks-customizations> .

Das Format ist JSON mit Kommentaren und erlaubt abschließende Kommata. Derzeit gibt es drei relevante Abschnitte, `Settings`, `Vorlagen`, `Runbooks`.

```json
{
    "Settings": {
    },
    "Templates": {
    },
    "Runbooks": {
    }
}
```

### Runbooks-Abschnitt

`Runbooks` wird vom Portal beim Starten eines Runbooks analysiert. Wenn ein Abschnitt mit dem Namen des aktuellen Azure Automation Runbooks vorhanden ist, wird sein Inhalt verwendet, um das dem Benutzer angezeigte Frontend anzupassen.

Nehmen wir folgendes einfaches Demonstrations-Runbook an, genannt `rjgit-device_demo-runbook-customizing`.

```powershell
<#
  .SYNOPSIS
  Runbook-Anpassung demonstrieren

  .DESCRIPTION
  Runbook-Anpassung demonstrieren, z. B. Dropdown/Auswahl
#>

#Requires -Modules @{ModuleName = "RealmJoin.RunbookHelper"; ModuleVersion = "0.6.0" }

param(
    [string] $DeviceId,
    [bool] $ExtraWorkflow = $true,
    [int] $ExtraWorkflowTime = 15
)

"## Arbeiten am Gerät '$DeviceID'"

# Hoch optionaler, komplexer Workflow
if ($ExtraWorkflow) {
    "## Meditation wird ausgeführt..."
    Start-Sleep -Seconds $ExtraWorkflowTime
}
```

Ohne Anpassung wird es im Frontend so angezeigt:

![Demo - vorher](/files/41e98d6189ed793f8098f7d4b7459ac73de10ea0)

Gedanken:

* Da dieses Runbook aus dem Kontext eines Geräts im Portal gestartet wird, ist der `$DeviceId` für einen Benutzer redundante Information. Ich weiß bereits, mit welchem Gerät ich arbeite.
* Was passiert, wenn ich den "Extra Workflow" aktiviere oder deaktiviere? Muss ich über die "Extra Workflow Time" nachdenken, wenn ich "Extra Workflow" deaktiviere?

Verbessern wir das. Das folgende Beispiel-JSON im zentralen Datenspeicher wird die UI für das Runbook ändern.

```json
{
    "Runbooks": {
        "rjgit-device_demo-runbook-customizing": {
            "ParameterList": [
                {
                    "Name": "DeviceId",
                    "Hide": true
                }, 
                {
                    "Name": "ExtraWorkflow",
                    "Hide": true
                },
                {
                    "Name": "ExtraWorkflowTime",
                    "DisplayName": "Wie lange meditieren?",
                },
                {
                    "DisplayName": "Zusätzlichen Workflow ausführen",
                    "DisplayBefore": "ExtraWorkflowTime",
                    "Select": {
                        "Options": [
                            {
                                "Display": "Meditation ausführen (optional)",
                                "Customization": {
                                    "Default": {
                                        "ExtraWorkflow": true
                                    }
                                }
                            },
                            {
                                "Display": "Geräte-Achtsamkeit überspringen",
                                "Customization": {
                                    "Default": {
                                        "ExtraWorkflow": false
                                    },
                                    "Hide": [
                                        "ExtraWorkflowTime"
                                    ]
                                }
                            }
                        ],
                        
                    },
                    "Default": "Geräte-Achtsamkeit überspringen"
                }
            ]
        }
    }
}
```

Sie können dieselbe Notation / dieselben Funktionen in Ihrem [Runbook-Header](#runbook-header).

#### ParameterList

Jeder Parameter hat seinen eigenen Abschnitt im `ParameterList`. [Modifikatoren](#modifiers) ermöglichen es, das Verhalten dieses Parameters zu ändern.

Das Ergebnis sieht dann so aus:

![Demo - nach dem Ausblenden](/files/a8dc28106480abe9bc7bed962462995453f861d3)

Wenn der zusätzliche Workflow gewählt wird, werden weitere Parameter angezeigt (eingeblendet):

![Demo - nach dem Einblenden](/files/c6482d8e58f6df72f3315529f02310ce4a047601)

Dies sorgt im Vergleich zu vorher für weniger Unübersichtlichkeit, nachdem die Anpassung angewendet wurde. Gleichzeitig stehen dem Benutzer mehr Informationen über die Alternativen von "Extra Workflow" zur Verfügung. Außerdem muss sich ein Benutzer nun nur dann um "Extra Workflow Time" kümmern, wenn sie relevant ist.

Die Sichtbarkeit dieses Feldes wurde mithilfe eines `"Customization"` Block innerhalb einer der `"Select"` Optionen vorgenommen. Derzeit kann jeweils höchstens ein solcher `"Customization"` Block gleichzeitig aktiv sein.

Wie Sie sehen können, ist der Parameter `$DeviceId` vollständig ausgeblendet. Dies wird durch Setzen des `"Hide": true` für diesen Parameter festgelegt.

Parameter können einen `DisplayName`. Wir haben eine benutzerfreundliche `DisplayName` als Ersatz für `$ExtraWorkflowTime` in der UI angeboten. Siehe andere [Modifikatoren](#modifiers) für weitere Informationen.

Sie können "unnamed" Parameter (ohne die `Name` Anweisung) wie den Abschnitt "Execute Extra Workflow" einfügen, wenn Sie UI-Elemente anbieten möchten, ohne direkt einen Wert zurückzugeben. Dies wird normalerweise nur in Verbindung mit `Wählen Sie`.

#### Wählen Sie

Wir haben `Wählen Sie`verwendet, um eine Liste von `Optionen` in einem Dropdown anzuzeigen. Jede Option kann `Anzeige` Text anzeigen oder einen `Anpassung`auslösen, z. B. das Setzen eines `Hide` oder ein `Standard` Wertes bei anderen Parametern. In unserem Beispiel haben wir es verwendet, um `$ExtraWorkflowTime` ein-/auszublenden und `$ExtraWorkflow`Wert zu überschreiben.

`$ExtraWorkflowTime` wird daher nur angezeigt, wenn relevant, und der binäre Schalter `$ExtraWorkflow` ist nun aus Sicht des Benutzers durch sinnvolle Alternativen ersetzt.

Im Fall eines `Wählen Sie` für einen benannten Parameter sollte jede Option eine `"ParameterValue": "..."` haben, die an das Runbook übergeben wird. Sie können `"ShowValue: false"` im `Wählen Sie` Block platzieren, um nur das Dropdown anzuzeigen und kein Feld für den resultierenden Parameterwert.

Beispiel für benannten Parameter:

```json
{
    "Name": "ExtraWorkflow",
    "DefaultValue": true,
    "DisplayName": "Zusätzlichen Workflow ausführen",
    "DisplayBefore": "ExtraWorkflowTime",
    "Select": {
        "Options": [
            {
                "Display": "Meditation ausführen (optional)",
                "ParameterValue": true
            },
            {
                "Display": "Geräte-Achtsamkeit überspringen",
                "ParameterValue": false,
                "Customization": {
                    "Hide": [
                        "ExtraWorkflowTime"
                    ]
                }
            }
        ],
        "ShowValue": false
    }
}
```

Die `Standard` / `Standardwert` Anweisung im Parameter gibt auch den Anfangszustand des Dropdowns an. Im Fall eines nicht benannten Parameters verwenden Sie den `DisplayName` der gewünschten Option, ansonsten geben Sie einen Standard-Rückgabewert an, z. B. "true" oder "false" oder einen beliebigen String.

#### Parameter

Wenn Sie nur benannte Parameter haben, können Sie das etwas kürzere `Parameter` Format anstelle von `ParameterList`.

Ein Beispiel finden Sie unter SelectSimple

#### SelectSimple

Wenn die volle Leistungsfähigkeit eines `Wählen Sie` nicht benötigt wird und Sie einfach nur eine Liste möglicher Werte in einem Dropdown anbieten möchten (ohne zusätzliche Anpassungen vorzunehmen), können Sie `SelectSimple`.

`SelectSimple` ist nur für benannte Parameter verwendbar.

Beispiel:

```json
{
    "Runbooks": {
        "rjgit-device_demo-runbook-customizing": {
            "Parameters": {
                "DeviceId": {
                    "Hide": true
                }, 
                "ExtraWorkflow": {
                    "Name": "ExtraWorkflow",
                    "DisplayName": "Zusätzlichen Workflow ausführen",
                    "Default": false,
                    "SelectSimple": {
                        "Meditation ausführen (optional)": true,
                        "Geräte-Achtsamkeit überspringen": false
                    }
                },
                "ExtraWorkflowTime": {
                    "DisplayName": "Wie lange meditieren?"
                }
            }
        }
    }
}
```

Der größte Unterschied zu unserem Beispiel zuvor besteht neben der deutlich kürzeren Darstellung darin, dass `$ExtraWorkflowTime` immer sichtbar ist.

#### Modifikatoren

Jeder Parameter kann einen oder mehrere der folgenden Modifikatoren haben:

* `"DisplayName": "text"` - Zeigt "text" als Namen für den Parameter in der UI an
* `"Hide": true / false` - Blenden Sie diesen Parameter aus
* `"Mandatory": true / false` - Machen Sie diesen Parameter zu einem Pflichtfeld
* `"ReadOnly": true / false` - Schützen Sie diesen Parameter davor, von seinem Standardwert geändert zu werden
* `"DefaultValue": "..."` - Legen Sie einen Standardwert für diesen Parameter fest. (Sie können auch `Standard` anstelle dessen verwenden.)
* `"GraphFilter": "startswith(DisplayName, 'LIC_')"` - siehe [Graph-Filterung](#graph-filtering)
* `"AllowEdit": true / false` - Schützen Sie diesen Parameter vor manueller Bearbeitung. (kombinieren Sie dies mit Vorlagen)

### Settings

`Settings` ermöglicht es Ihnen, Konfigurationsdaten wie Azure Storage Account-Namen an einem zentralen Ort zu speichern und sie dennoch von Ihren Runbooks getrennt zu halten.

Sie können auf einzelne Werte aus dem Param-Block eines Runbooks mit `Use-RJInterface`.

Nehmen wir diesen Beispiel-Param-Block eines Runbooks:

```powershell
param(
    [ValidateScript( { Use-RJInterface -Type Setting -Attribute "CaPoliciesExport.Container" } )]
    [string] $ContainerName,
    [ValidateScript( { Use-RJInterface -Type Setting -Attribute "CaPoliciesExport.ResourceGroup" } )]
    [string] $ResourceGroupName,
    [ValidateScript( { Use-RJInterface -Type Setting -Attribute "CaPoliciesExport.StorageAccount.Name" } )]
    [string] $StorageAccountName,
    [ValidateScript( { Use-RJInterface -Type Setting -Attribute "CaPoliciesExport.StorageAccount.Location" } )]
    [string] $StorageAccountLocation,
    [ValidateScript( { Use-RJInterface -Type Setting -Attribute "CaPoliciesExport.StorageAccount.Sku" } )]
    [string] $StorageAccountSku
)
```

Das Portal versucht, jeden Parameter mit Werten aus dem zentralen Datenspeicher vorab zu befüllen – falls vorhanden. Dies funktioniert auch dann, wenn der Parameter in der UI ausgeblendet wurde.

Ein mögliches JSON im Datenspeicher für dieses Runbook wäre:

```json
{
    "Settings": {
        "CaPoliciesExport": {
            "ResourceGroup": "rj-runbooks-01",
            "StorageAccount": {
                "Name": "rjrbexports01",
                "Location": "West Europe",
                "Sku": "Standard_LRS"
            }
        }
    }
}
```

Das fehlende `Container` Element wird in der UI einfach nicht vorausgefüllt.

### Vorlagen

`Vorlagen` JSON-Referenzen verwenden, um Daten einzubinden – zum Beispiel eine längere Liste von Office-Standorten – wenn Sie eine `Wählen Sie` Anweisung verwenden.

So bleibt eine Anpassung neutral/wiederverwendbar/von den eigentlichen Daten getrennt.

Nehmen wir das Beispiel des Onboardings neuer Benutzer. Sie könnten mehrere vorgegebene Optionen für Abteilungen oder Office-Standorte haben, wobei die Zuweisung eines Office-Standorts auch eine bestimmte Straßenadresse, ein Land, ein Bundesland usw. erfordert.

Das folgende Beispiel einer Runbook-Anpassung verwendet den `$ref` im `Runbooks` Abschnitt, um einen Teilbaum aus dem `Vorlagen` Abschnitt zu referenzieren/importieren. Achten Sie auf die `$id`/`$values` Keywords. Beachten Sie, dass `$id`/`$values` vor der Referenzierung mithilfe von `$ref`definiert werden müssen. Deshalb ist `Vorlagen` in diesem Beispiel vor `Runbooks` definiert.

In diesem Beispiel teilen wir dem Portal mit, dass es den Teilbaum mit dem `$id` genannt `LocationOptions` und dessen `$values`, wodurch die `$ref` Anweisung ersetzt wird. Das Portal rendert also einen `Wählen Sie` wie im `Runbooks` Abschnitt beschrieben, enthält aber die tatsächlichen Optionen aus `Vorlagen`.

Eine Vorlage kann jede Anweisung enthalten, die an der referenzierenden Stelle unterstützt wird. In diesem Beispiel verwenden wir eine `Anpassung` Anweisung, um andere Parameter zu ändern, wie z. B. `Straßenadresse`.

So können wir eine runbookspezifische Anpassung in `Runbooks` wiederverwendbar über mehrere Umgebungen hinweg, wobei die eigentlichen Daten getrennt bleiben.

```json
{
    "Templates": {
        "Options": [
            {
                "$id": "LocationOptions",
                "$values": [
                    {
                        "Display": "DE-OF",
                        "Customization": {
                            "Default": {
                                "StreetAddress": "Kaiserstraße 39",
                                "PostalCode": "63065",
                                "City": "Offenbach",
                                "Country": "Deutschland"
                            }
                        }
                    },
                    {
                        "Display": "DE-DEG",
                        "Customization": {
                            "Default": {
                                "StreetAddress": "Lateinschulgassse 24-26",
                                "PostalCode": "94469",
                                "City": "Deggendorf",
                                "Country": "Deutschland"
                            }
                        }
                    },
                    {
                        "Display": "DE-HH",
                        "Customization": {
                            "Default": {
                                "StreetAddress": "Hans-Henny-Jahnn-Weg 53",
                                "PostalCode": "22085",
                                "City": "Hamburg",
                                "Country": "Deutschland"
                            }
                        }
                    },
                    {
                        "Display": "FI-HS",
                        "Customization": {
                            "Default": {
                                "StreetAddress": "Somewhere 42",
                                "PostalCode": "12345",
                                "City": "Helsinki",
                                "Country": "Finnland"
                            }
                        }
                    }
                ]
            },
            {
                "$id": "CompanyOptions",
                "$values": [
                    {
                        "Id": "gkg",
                        "Display": "glueckkanja",
                        "Value": "glueckkanja AG"
                    },
                    {
                        "Id": "pp",
                        "Display": "PRIMEPULSE",
                        "Value": "PRIMEPULSE SE"
                    }
                ]
            }
        ]
    },
    "Runbooks": {
        "rjgit-org_general_add-user": {
            "ParameterList": [
                {
                    "DisplayName": "Office-Standort",
                    "DisplayAfter": "CompanyName",
                    "Select": {
                        "Options": {
                            "$ref": "LocationOptions"
                        }
                    }
                },
                {
                    "Name": "CompanyName",
                    "Select": {
                        "Options": {
                            "$ref": "CompanyOptions"
                        },
                        "AllowEdit": false
                    }
                }
            ],
            "ReadOnly": [
                "StreetAddress",
                "PostalCode",
                "City",
                "Country"
            ]
        }
    }
}
```

Dies erzeugt die folgende Benutzeroberfläche:

![Demo - ref-location](/files/d253d62ecb4af9318694eb9d6c7c388f4886ccc6)

![Demo - ref-address](/files/00bdf48c5ab914011f717496d5e87fc435ada0fa)

### Graph-Filter

Sie können [ODATA Graph-Filter](https://docs.microsoft.com/en-us/graph/query-parameters?context=graph%2Fapi%2F1.0\&view=graph-rest-1.0#filter-parameter) zur Verwendung in mehreren Runbooks vorbereiten. Speichern Sie diese in einem Abschnitt namens `GraphFilters`.

Das folgende Beispiel filtert nach einem bestimmten Präfix in der `DisplayName` einer Gruppe, um im Gruppenauswahlfeld nur lizenzbezogene Gruppen anzuzeigen.

```json
"GraphFilters": {
    "LicenseGroup": "startswith(DisplayName, 'LIC_')" // auch im RJ-Code als Standard enthalten
  }
```

Siehe [Graph-Filterung](#graph-filtering) zur Verwendung aus einem Runbook.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.realmjoin.com/de/automatisierung/runbooks/runbook-customization.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
