> 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

## Übersicht

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

* kundenspezifische Parameter und Vorlagen hosten
* UI-Elemente wie Benutzer-Auswahlen oder Dropdown-Auswahlen anbieten
* menschenlesbare Erklärungen von Parametern anzeigen
* nicht benötigte UI-Elemente verbergen

<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, in den auf [GitHub](https://github.com/realmjoin/realmjoin-runbooks).

Einige Runbooks werden mit Beispielen geliefert, wie kundenspezifische Vorlagen konfiguriert werden, z. B. das Festlegen 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 Benutzer-Auswahlliste) 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. Wo immer 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 Schalter an
* `[string]` - zeigt ein Textfeld an, in das beliebige alphanumerische Eingaben eingegeben werden können
* `[int]` - zeigt ein Textfeld an, das nur numerische Eingaben zulässt
* `[DateTime]`, `[DateTimeOffset]` - zeigt einen Datum-/Uhrzeit-Auswahldialog an

Sie können auf Parameter die üblichen PowerShell-Modifikatoren anwenden. RealmJoin Portal wird insbesondere verstehen, wenn Sie angeben `[Parameter(Mandatory = $true)]` um einen Pflichtparameter anzugeben und das Ausfüllen dieser Parameter zu erzwingen.

Wo immer möglich, liest RealmJoin Portal auch angegebene Standardwerte 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 Runbook Helper PS Module von RealmJoin in Ihr Runbook einbinden:

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

Sie können dann `[ValidateScript( { Use-RJInterface ... } )]` Anweisungen in den Parameterdefinitionen einfügen. Das folgende Beispiel erstellt beispielsweise eine Benutzer-Auswahlliste, die es ermöglicht, einen Entra ID-Benutzer auszuwählen, und übergibt dessen Objekt-ID als String an das Runbook.

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

Gehen wir dies 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-Moduls. Es ermöglicht Ihnen, mithilfe von `-Type` und `-Entity`, falls 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`, `Group`, `Device`. Dadurch wird eine Auswahlliste für Benutzer, Gruppen oder Geräte im angegebenen Entra ID erstellt.

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

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

Derzeit ist mit einer Auswahlliste keine Mehrfachauswahl möglich.

Standardmäßig gibt eine MS-Graph-Auswahlliste 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 Variablen einfügen. Um also die ID eines Benutzers zu erhalten, nennen Sie den Parameter `$userid`. Wenn Sie eine UPN möchten, nennen Sie es `$username`.

#### Graph-Filterung

Wenn Sie eine auf MS Graph basierende Auswahlliste verwenden, können Sie auch angeben `-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 in der Auswahlliste 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 per Name auf den Filter mit `-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 spezifische 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, falls vorhanden, parsen.

Hier ist ein Beispiel:

```powershell
<#
  .SYNOPSIS
  (Zu-)Weisen Sie einem Benutzer über die Gruppenmitgliedschaft eine Lizenz zu bzw. entziehen Sie sie.

  .DESCRIPTION
  (Zu-)Weisen Sie einem Benutzer über die Gruppenmitgliedschaft eine Lizenz zu bzw. entziehen Sie sie. 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 detaillierter sein, da sie innerhalb des Ausführungs-/Parameterdialogs des Runbooks angezeigt wird.

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

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

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

`.EXAMPLE` - Wird nicht geparst / 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 erstellt werden, z. B. für verschiedene Workflows oder Benutzerklassen.

## JSON-basiertes Customizing

### Zentraler Datenspeicher

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

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

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

### Runbooks-Abschnitt

`Runbooks` wird vom Portal beim Starten eines Runbooks geparst. Wenn ein Abschnitt mit dem Namen des aktuellen Azure Automation Runbooks existiert, wird sein Inhalt verwendet, um die dem Benutzer angezeigte Frontend-Oberfläche 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
)

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

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

Wenn es nicht angepasst 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 das `$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 ü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 verä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 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 Sie den zusätzlichen Workflow auswählen, werden weitere Parameter angezeigt (eingeblendet):

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

Dies sorgt im Vergleich zu vor der Anpassung für weniger Unordnung. Gleichzeitig erhält der Benutzer mehr Informationen über die Alternativen von "Extra Workflow". Außerdem muss sich ein Benutzer jetzt nur noch 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. Derzeit kann immer nur ein solcher `"Customization"` Block gleichzeitig aktiv sein.

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

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

Sie können „unbenannte“ Parameter einfügen (bei denen die `Name` Anweisung fehlt) wie den Abschnitt „Execute Extra Workflow“, 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 enthalten oder einen `Anpassung`, wie z. B. das Setzen von `Hide` oder einen `Standard` Wert bei anderen Parametern. In unserem Beispiel haben wir es verwendet, um ein- bzw. auszublenden `$ExtraWorkflowTime` und zu überschreiben `$ExtraWorkflow`s Wert.

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

Im Falle eines `Wählen Sie` für einen benannten Parameter sollte jede Option ein `"ParameterValue": "..."` zum Übergeben an das Runbook besitzen. Sie können ein `"ShowValue: false"` innerhalb des `Wählen Sie` Blocks platzieren, um nur das Dropdown und kein Feld für den resultierenden Parameterwert anzuzeigen.

Beispiel für einen 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` / `DefaultValue` Anweisung im Parameter legt auch den Anfangszustand des Dropdowns fest. Im Falle eines unbenannten Parameters verwenden Sie den `DisplayName` der gewünschten Option; andernfalls geben Sie einen Standard-Rückgabewert an, z. B. "true", "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 lediglich eine Liste möglicher Werte in einem Dropdown anbieten möchten (ohne zusätzliche Anpassungen anzuwenden), 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": {
                        "Execute Meditation (optional)": true,
                        "Skip Device Mindfulness": false
                    }
                },
                "ExtraWorkflowTime": {
                    "DisplayName": "Wie lange meditieren?"
                }
            }
        }
    }
}
```

Der größte Unterschied zu unserem vorherigen Beispiel, abgesehen davon, dass es viel kürzer ist, besteht darin, dass `$ExtraWorkflowTime` immer sichtbar ist.

#### Modifikatoren

Jeder Parameter kann einen oder mehrere der folgenden Modifikatoren haben:

* `"DisplayName": "text"` - Zeigt "text" als Namen des Parameters in der UI an
* `"Hide": true / false` - Blendet diesen Parameter aus
* `"Mandatory": true / false` - Erfordert das Ausfüllen dieses Parameters
* `"ReadOnly": true / false` - Schützt diesen Parameter davor, von seinem Standardwert geändert zu werden
* `"DefaultValue": "..."` - Legt einen Standardwert für diesen Parameter fest. (Sie können auch `Standard` 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)

### Settings

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

Sie können über `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 wird versuchen, jeden Parameter mit Werten aus dem zentralen Datenspeicher vorzubelegen – falls 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 vorbelegt.

### Vorlagen

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

Dies ermöglicht es, eine Anpassung neutral/wiederverwendbar/von den eigentlichen Daten getrennt zu halten.

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

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

In diesem Beispiel teilen wir dem Portal mit, dass es den Teilbaum mit dem `$id` genannt `LocationOptions` und seine `$values`, wobei die `$ref` Anweisung ersetzt wird. Also rendert das Portal eine `Wählen Sie` wie im `Runbooks` Abschnitt beschrieben, aber die tatsächlichen Optionen aus `Vorlagen`.

Eine Vorlage kann jede Anweisung enthalten, die am referenzierenden Ort unterstützt wird. In diesem Beispiel verwenden wir eine `Anpassung` Anweisung, um andere Parameter wie `StreetAddress`.

So können wir eine runbookspezifische Anpassung in `Runbooks` wiederverwendbar über mehrere Umgebungen hinweg, wobei 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": "Germany"
                            }
                        }
                    },
                    {
                        "Display": "DE-DEG",
                        "Customization": {
                            "Default": {
                                "StreetAddress": "Lateinschulgassse 24-26",
                                "PostalCode": "94469",
                                "City": "Deggendorf",
                                "Country": "Germany"
                            }
                        }
                    },
                    {
                        "Display": "DE-HH",
                        "Customization": {
                            "Default": {
                                "StreetAddress": "Hans-Henny-Jahnn-Weg 53",
                                "PostalCode": "22085",
                                "City": "Hamburg",
                                "Country": "Germany"
                            }
                        }
                    },
                    {
                        "Display": "FI-HS",
                        "Customization": {
                            "Default": {
                                "StreetAddress": "Somewhere 42",
                                "PostalCode": "12345",
                                "City": "Helsinki",
                                "Country": "Finland"
                            }
                        }
                    }
                ]
            },
            {
                "$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"
            ]
        }
    }
}
```

Dadurch wird die folgende UI erstellt:

![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` einer Gruppe, um im Gruppenauswahldialog nur lizenzbezogene Gruppen anzuzeigen.

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

Siehe [Graph-Filterung](#graph-filtering) zur Verwendung davon 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.
