> 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).

# Anpassung von Runbooks

## Übersicht

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 Benutzerauswahlen oder Dropdown-Auswahlen anbieten
* für Menschen lesbare 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 enthalten sein und/oder in der RealmJoin-Portal-Instanz des Kunden gespeichert werden. Standardmäßig versuchen wir, sinnvolle Standardwerte in den auf [GitHub](https://github.com/realmjoin/realmjoin-runbooks).

Einige Runbooks werden mit Beispielen geliefert, wie kundenspezifische Vorlagen konfiguriert werden, etwa durch das Festlegen von Office-Standorten für das Onboarding von Benutzern.

### Formatieren

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

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

Zusätzlich (mit der geringsten Priorität)

* pro Parameter im Header des Runbooks
* 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 eines Benutzer-Pickers) sind nur verfügbar, wenn im Param-Block ein Datentyp angegeben wird. Sie können mehrere Arten von Anpassungen kombinieren, um die besten Ergebnisse zu erzielen.

## Runbook-Param-Block

Das RealmJoin Portal analysiert den PowerShell-Param-Block eines Runbooks, um zu bestimmen, welche Eingabefelder gerendert werden sollen. Soweit möglich validiert es die Eingaben auch anhand des für eine Variable angegebenen .NET-Typs.

Die folgenden Datentypen werden derzeit verstanden:

* `[bool]`, `[boolean]` - zeigt einen binären Umschalter an
* `[string]` - zeigt ein Textfeld für die Eingabe beliebiger alphanumerischer Zeichen an
* `[int]` - zeigt ein Textfeld an, das nur numerische Eingaben zulässt
* `[DateTime]`, `[DateTimeOffset]` - zeigt einen Datum/Uhrzeit-Picker an

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

Soweit möglich liest das RealmJoin Portal angegebene Standardwerte ebenfalls 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 das RealmJoin Runbook Helper PS Module in Ihr Runbook einbinden:

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

Sie können dann Folgendes einfügen `[ValidateScript( { Use-RJInterface ... } )]` Anweisungen in den Parameterdefinitionen. Das Folgende erstellt beispielsweise einen Benutzer-Picker, mit dem ein Entra ID-Benutzer ausgewählt werden kann, und übergibt dessen Objekt-ID als Zeichenfolge an das Runbook.

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

Gehen wir dies Stück für Stück durch. `[ValidateScript...]` ist ein Modifikator für den im Param-Block als Nächstes definierten Parameter. In diesem Fall die Variable `$AssignedUserId`.

`Use-RJInterface` ist Teil unseres [RealmJoin Runbook Helper](https://github.com/realmjoin/RealmJoin.RunbookHelper) PowerShell-Moduls. Es ermöglicht Ihnen anzugeben, welche Art von Eingabe Sie mit `-Type` und `-Entity`angeben, falls dies nicht bereits vollständig durch den Typ der Variablen definiert ist.

`-DisplayName` ermöglicht es Ihnen, dem RealmJoin Portal eine für Menschen lesbare Aufforderung / Beschreibung für diesen Parameter zu übergeben.

#### Graph-Ressourcen

Im obigen Beispiel ist die Informationsquelle MS Graph, wie beschrieben durch `-Type Graph`. Verwenden Sie für MS Graph `-Entity` um anzugeben, welche Art von Ressource Sie erwarten. Verfügbare Entitäten sind `Benutzer`, `Gruppe`, `Gerät`. Dies erzeugt einen Picker für Benutzer, Gruppen oder Geräte im angegebenen Entra ID.

Der Picker enthält eine Schnellsuche, um die benötigte Ressource leicht zu finden.

![Picker-Beispiel](/files/911b8089249c23b0de9115269f896d725eafcf62)

Derzeit ist mit einem Picker keine Mehrfachauswahl möglich.

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

#### Graph-Filterung

Wenn Sie einen auf MS Graph basierenden Picker verwenden, können Sie auch `-Filter` 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 Picker angebotenen Objekte einzugrenzen.

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). Verweisen Sie in diesem Fall einfach über den Namen auf den Filter mit `-Filter "ref:LicenseGroup"`, wobei `ref:` angibt, nach einem gespeicherten Filter zu suchen.

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

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

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

## Runbook-Header

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

Hier ist ein Beispiel:

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

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

  .PARAMETER DefaultGroups
  Durch Kommas getrennte Liste von 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 detaillierter sein, da sie im Ausführungs-/Parameterdialog der Runbooks angezeigt wird.

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

`.INPUTS` - Kann einen Block der JSON-basierten Runbook-Anpassung enthalten.

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

`.EXAMPLE` - Wird nicht analysiert / gerendert. Kann ein Beispiel einer JSON-basierten Anpassung enthalten, das im RealmJoin-Datenspeicher Ihres Tenants verwendet wird. Dies können Beispiele dafür sein, wie Vorlagen erstellt werden, z. B. für unterschiedliche Workflows oder Benutzerklassen.

## JSON-basierten Anpassung

### Zentraler Datenspeicher

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

Das Format ist JSON mit Kommentaren und erlaubt nachgestellte Kommata. Derzeit gibt es drei relevante Abschnitte, `Einstellungen`, `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 dessen 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
)

"## Aufgaben für Gerät '$DeviceID' ausführen"

# Hochgradig optionaler komplizierter Workflow
if ($ExtraWorkflow) {
    "## Meditation ausführen..."
    Start-Sleep -Seconds $ExtraWorkflowTime
}
```

Wenn keine Anpassung vorgenommen wird, wird es im Frontend so dargestellt:

![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, an welchem Gerät ich arbeite.
* Was passiert, wenn ich den "Extra Workflow" aktiviere oder deaktiviere? Muss ich an "Extra Workflow Time" denken, wenn ich "Extra Workflow" deaktiviere?

Lassen Sie uns das verbessern. Das folgende Beispiel-JSON im zentralen Datenspeicher wird die UI für das Runbook anpassen.

```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 die gleiche Notation / dieselben Funktionen in Ihrem [Runbook-Header](#runbook-header).

#### ParameterList

Jeder Parameter hat seinen eigenen Abschnitt in `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 zeigt im Vergleich zu vorher weniger Unordnung vor Anwendung der Anpassung. 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 es relevant ist.

Die Sichtbarkeit dieses Feldes wurde mithilfe eines `"Customization"` Blocks innerhalb einer der `"Select"` Optionen geändert. Sie können derzeit höchstens einen solchen `"Customization"` Block gleichzeitig aktiv haben.

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

Parameter können ein `DisplayName`. Wir haben eine benutzerfreundliche `DisplayName` zum Ersetzen von `$ExtraWorkflowTime` in der UI. Siehe andere [Modifikatoren](#modifiers) für mehr.

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 verwendeten `Wählen Sie`, um eine Liste von `Optionen` in einem Dropdown anzuzeigen. Jede Option kann `Anzeige` Text sein oder einen `Anpassung`auslösen, wie das Setzen von `Hide` oder eines `Standard` Werts auf anderen Parametern. In unserem Beispiel verwendeten wir dies, um `$ExtraWorkflowTime` und `$ExtraWorkflow`Wert ein- bzw. auszublenden.

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

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

Beispiel für benannte 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` / `DefaultValue` Anweisung im Parameter legt außerdem den Anfangszustand des Dropdowns fest. Im Fall eines nicht benannten Parameters verwenden Sie den `DisplayName` der gewünschten Option, andernfalls geben Sie einen Standard-Rückgabewert an, wie "true" oder "false" oder eine Zeichenfolge.

#### Parameter

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

Für ein Beispiel siehe SelectSimple

#### SelectSimple

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

`SelectSimple` nur für benannte Parameter verwendet werden.

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 vorherigen Beispiel (abgesehen davon, dass es viel kürzer ist) ist, 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` - Verbirgt diesen Parameter
* `"Mandatory": true / false` - Erfordert, dass dieser Parameter ausgefüllt wird
* `"ReadOnly": true / false` - Schützt diesen Parameter davor, dass er gegenüber seinem Standardwert geändert wird
* `"DefaultValue": "..."` - Legt einen Standardwert für diesen Parameter fest. (Sie können auch `Standard` stattdessen verwenden.)
* `"GraphFilter": "startswith(DisplayName, 'LIC_')"` - siehe [Graph-Filterung](#graph-filtering)
* `"AllowEdit": true / false` - Schützt diesen Parameter vor manueller Bearbeitung. (kombinieren Sie dies mit Vorlagen)

### Einstellungen

`Einstellungen` 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 zugreifen, indem Sie `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 füllen – sofern vorhanden. Dies funktioniert auch, 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 vorab ausgefüllt.

### Vorlagen

`Vorlagen` verwenden Sie JSON-Referenzen, um Daten einzubinden – beispielsweise eine umfangreiche Liste von Office-Standorten – wenn Sie eine `Wählen Sie` Anweisung verwenden.

Dadurch kann eine Anpassung neutral/wiederverwendbar/von den eigentlichen Daten getrennt bleiben.

Nehmen wir das Beispiel der Aufnahme neuer Benutzer. Sie haben möglicherweise mehrere vorgegebene Optionen für Abteilungen oder Office-Standorte, wobei die Zuweisung eines Office-Standorts auch eine bestimmte Straße, ein Land, ein Bundesland usw. voraussetzt.

Das folgende Beispiel einer Runbook-Anpassung verwendet den `$ref` in den `Runbooks` Abschnitt, um einen Teilbaum aus dem `Vorlagen` Abschnitt zu referenzieren/importieren. Achten Sie auf die `$id`/`$values` Schlüsselwörter. Beachten Sie, dass `$id`/`$values` definiert werden müssen, bevor Sie sie mittels `$ref`. Deshalb ist `Vorlagen` vor `Runbooks` in diesem Beispiel definiert.

In diesem Beispiel weisen wir das Portal an, den Teilbaum mit der `$id` genannt `LocationOptions` und dessen `$values`, wodurch die `$ref` Anweisung ersetzt wird. Das Portal rendert also eine `Wählen Sie` wie in der `Runbooks` Abschnitt, 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 wie `Straßenadresse`.

So können wir eine runbookspezifische Anpassung in `Runbooks` wiederverwendbar über mehrere Umgebungen hinweg, während die tatsächlichen 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 - Referenzstandort](/files/d253d62ecb4af9318694eb9d6c7c388f4886ccc6)

![Demo - Referenzadresse](/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` Gruppe, um in einem Gruppenauswahlfeld nur lizenzbezogene Gruppen anzuzeigen.

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

Siehe [Graph-Filterung](#graph-filtering) wie dies aus einem Runbook verwendet wird.


---

# 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:

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

The question should be specific, self-contained, and written in natural language.
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.
