> 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-references/org/general/sync-shared-channel-owners_scheduled.md).

# Geplante Synchronisierung von Shared Channel-Besitzern

### Beschreibung

Teams Shared Channels erben nicht die Besitzverhältnisse von ihrem übergeordneten Team. Dieses geplante Runbook schließt diese Lücke: Für jedes in einer Zuordnung genannte Team stellt es sicher, dass die Mitglieder einer zugeordneten Security Group Besitzer des Teams und jedes vom Team gehosteten Shared Channel sind. Die Zuordnung von Teamname zu Besitzergruppe wird zentral als RealmJoin-Organisationseinstellung verwaltet. Das Runbook ist add-only – vorhandene Besitzer und Mitglieder werden nie entfernt – sodass neu erstellte Shared Channels beim nächsten Lauf einfach übernommen werden. Optional kann es einen Bericht per E-Mail senden und/oder die Berichtdateien als Downloadlink hochladen. Der Parameter ReportFileFormat steuert, welche Berichtsdateiformate erzeugt und bereitgestellt werden (nur CSV, CSV & XLSX oder nur XLSX). Wenn die CSV-Anhänge das Größenlimit für E-Mails überschreiten und „CSV & XLSX“ ausgewählt ist, fällt die E-Mail auf die reine Excel-Arbeitsmappe zurück. Weitere Informationen zu den Zuordnungsregeln und zur Konfiguration finden Sie in der begleitenden Dokumentation.

### So funktioniert es

Bei jedem Lauf führt das Runbook Folgendes aus:

1. Liest die Zuordnung von Teamnamen zu Besitzergruppen aus der Organisationseinstellung `SharedChannelOwners.Mapping`.
2. Für jeden Eintrag sucht es das Team anhand seines **exakten Anzeigenamens**.
3. Erweitert die Besitzergruppe dieses Eintrags auf ihre transitive **Benutzer** Mitglieder (Gäste werden übersprungen – sie können nicht zu einem Shared Channel gehören).
4. Stellt sicher, dass diese Benutzer Besitzer des Teams und jedes **gehosteten** Shared Channel des Teams sind.

Das Runbook ist **add-only**: es stuft vorhandene Besitzer oder Mitglieder nie herab und entfernt sie nie. Neu erstellte Shared Channels werden daher beim nächsten geplanten Lauf automatisch übernommen, ohne bereits Vorhandenes zu beeinträchtigen.

#### Zuordnungskonfiguration

Die Zuordnung wird zentral in den RealmJoin-Organisationseinstellungen gespeichert (Runbook Customization → `Einstellungen` → `SharedChannelOwners.Mapping`) und wird daher einmal gepflegt und von jedem Zeitplan gemeinsam genutzt. Es handelt sich um eine Liste von `{ TeamName, OwnerGroupId }` -Objekten, wobei `TeamName` der **exakte Anzeigename des Teams** (siehe den *Hinweis* -Abschnitt für ein sofort verwendbares Beispiel). Der versteckte `TeamOwnerGroupMapping` -Parameter wird aus dieser Einstellung injiziert; das Runbook akzeptiert ihn entweder als strukturiertes Array (empfohlene Untereinstellungsform) oder als JSON-String und normalisiert beides.

#### Teamzuordnung

Jeder Zuordnungseintrag zielt auf ein ausdrücklich benanntes Team ab:

* Ein Team wird anhand seines **exakten Anzeigenamens** (Groß-/Kleinschreibung wird ignoriert, konsistent mit Microsoft Graph; führende und nachfolgende Leerzeichen im konfigurierten Namen werden ignoriert). Es wird nur dieses Team verarbeitet – es gibt kein Präfix- oder Platzhalterverhalten, daher wirkt sich ein Eintrag wie `EXT Service A` nie auf `EXT Service A Backup` oder Ähnliches aus.
* Anzeigenamen sind in Entra ID nicht garantiert eindeutig. Wenn mehrere Teams denselben konfigurierten Namen haben, wird die Besitzergruppe auf **alle** von ihnen angewendet. Wenn kein Team übereinstimmt, wird der Eintrag als *nicht gefunden* übersprungen.

#### Teamauswahl

Für jede konfigurierte `TeamName` führt das Runbook eine Graph `displayName eq '...'` -Abfrage aus und behält nur Microsoft 365-Gruppen bei, die als **Team**.

#### Was geändert wird

* **Team (optional, `IncludeTeamOwners`, Standard ein):** die Benutzer der Besitzergruppe werden als Besitzer und Mitglieder der übergeordneten M365-Gruppe hinzugefügt. Die Teammitgliedschaft ist auch die technische Voraussetzung, um Besitzer eines Shared Channel zu werden, daher ermöglicht dieser Schritt den Kanalschritt.
* **Shared Channels:** für jeden gehosteten Shared Channel (`membershipType eq 'shared'`), wird sichergestellt, dass jeder Benutzer der Besitzergruppe Kanal **Besitzer** ist – bei Fehlen direkt hinzugefügt oder bei bereits bestehender Mitgliedschaft hochgestuft. Wird das direkte Hinzufügen als Besitzer abgelehnt (z. B. aufgrund von Verzögerungen bei der Replikation der Mitgliedschaft), fällt das Runbook darauf zurück, den Benutzer zunächst als Mitglied hinzuzufügen und ihn anschließend hochzustufen.

#### Trockenlauf

Setzen Sie **`WhatIfMode`** auf, um zu protokollieren, was sich ändern würde, ohne etwas zu schreiben. In diesem Modus gibt das Runbook im Voraus die Teams aus, die es verarbeiten würde (zusammen mit ihrer Besitzergruppe), sowie alle konfigurierten Teamnamen, die nicht gefunden wurden.

#### Berichterstellung (optional, beide standardmäßig aus)

* **`SendEmailReport`** sendet eine E-Mail im RealmJoin-Branding (über `Send-RjReportEmail`) mit Laufstatistiken und zwei CSV-Anhängen: einer Zusammenfassung pro Team und einer Detailliste pro Änderung. Der Absender wird aus der `RJReport.EmailSender` Einstellung
* **`CreateDownloadLink`** lädt dieselben CSV-Dateien in ein Storage Account hoch und gibt zeitlich begrenzte SAS-Downloadlinks zurück (die ebenfalls in die E-Mail eingebettet werden, wenn beide Optionen aktiviert sind). Das Ziel-Storage Account wird aus den `RJReport.StorageAccount.*` -Einstellungen übernommen.

Der Upload in den Speicher authentifiziert sich mit der verwalteten Identität des Automation-Kontos; diese Identität benötigt die **Storage Blob Data Contributor** -RBAC-Rolle im Ziel-Storage Account (dies ist eine Azure-RBAC-Zuweisung, keine Graph-Anwendungsberechtigung).

#### Zeitplanung

Konzipiert für den unbeaufsichtigten Betrieb nach Zeitplan. Da die Konfiguration zentral in den Organisationseinstellungen liegt und das Runbook add-only und idempotent ist, hält ein einzelner wiederkehrender Zeitplan alle zugeordneten Teams und ihre Shared Channels synchron, während Personen und Kanäle kommen und gehen.

### Ort

Organization → General → Sync Shared Channel Owners (Scheduled)

**Vollständiger Runbook-Name**

rjgit-org\_general\_sync-shared-channel-owners\_scheduled

### Berechtigungen

#### Anwendungsberechtigungen

* **Typ**: Microsoft Graph
  * Group.ReadWrite.All
  * GroupMember.ReadWrite.All
  * Channel.ReadBasic.All
  * ChannelMember.ReadWrite.All
  * Mail.Send

### Parameter

#### TeamOwnerGroupMapping

Zuordnung eines exakten Team-Anzeigenamens zu der Objekt-ID einer Besitzer-Security Group, z. B. \[{ "TeamName": "EXT Service A", "OwnerGroupId": "00000000-0000-0000-0000-000000000000" }]. Versteckter Parameter, gebunden an die Organisationseinstellung "SharedChannelOwners.Mapping". Das RealmJoin-Portal injiziert diesen Wert; das Runbook akzeptiert ihn entweder als deserialisiertes Objekt/Array (strukturierte Untereinstellungen) oder als JSON-String und normalisiert beides.

| Eigenschaft  | Wert   |
| ------------ | ------ |
| Erforderlich | false  |
| Standardwert | \[]    |
| Typ          | Objekt |

#### IncludeTeamOwners

Wenn aktiviert (Standard), werden die Mitglieder der Besitzergruppe ebenfalls als Besitzer und Mitglieder des übergeordneten Teams selbst sichergestellt (M365-Gruppenbesitzer/-mitglieder). Die Teammitgliedschaft ist auch die Voraussetzung für Kanalbesitz.

| Eigenschaft  | Wert     |
| ------------ | -------- |
| Erforderlich | false    |
| Standardwert | Wahr     |
| Typ          | Boolesch |

#### WhatIfMode

Wenn aktiviert, protokolliert das Runbook nur die Änderungen, die es vornehmen würde, ohne etwas zu schreiben.

| Eigenschaft  | Wert     |
| ------------ | -------- |
| Erforderlich | false    |
| Standardwert | Falsch   |
| Typ          | Boolesch |

#### SendEmailReport

Wenn aktiviert, wird nach dem Lauf ein E-Mail-Bericht im RealmJoin-Branding über Send-RjReportEmail gesendet. Der Text enthält Laufstatistiken; die Berichtdateien (Zusammenfassung pro Team und Detail pro Änderung) werden im ausgewählten Berichtdateiformat angehängt.

| Eigenschaft  | Wert     |
| ------------ | -------- |
| Erforderlich | false    |
| Standardwert | Falsch   |
| Typ          | Boolesch |

#### EmailTo

E-Mail-Adresse(n) der Empfänger für den Bericht (durch Kommas getrennt). Wird nur verwendet, wenn SendEmailReport aktiviert ist.

| Eigenschaft  | Wert         |
| ------------ | ------------ |
| Erforderlich | false        |
| Standardwert |              |
| Typ          | Zeichenfolge |

#### EmailFrom

Absenderpostfach für den Bericht. Gebunden an die Organisationseinstellung "RJReport.EmailSender".

| Eigenschaft  | Wert         |
| ------------ | ------------ |
| Erforderlich | false        |
| Standardwert |              |
| Typ          | Zeichenfolge |

#### ReportFileFormat

Steuert, welche Berichtsdateiformate generiert und bereitgestellt werden: "Nur CSV", "CSV & XLSX" (Standard) oder "Nur XLSX".

| Eigenschaft  | Wert         |
| ------------ | ------------ |
| Erforderlich | false        |
| Standardwert | CSV & XLSX   |
| Typ          | Zeichenfolge |

#### CreateDownloadLink

Wenn aktiviert, werden die Berichtdatei(en) in ein Storage Account hochgeladen und zeitlich begrenzte Downloadlinks zurückgegeben (und in den E-Mail-Bericht aufgenommen, wenn auch dieser aktiviert ist). Standardmäßig aus.

| Eigenschaft  | Wert     |
| ------------ | -------- |
| Erforderlich | false    |
| Standardwert | Falsch   |
| Typ          | Boolesch |

#### ContainerName

Speichercontainer, der für den Upload verwendet wird. Pro Runbook konfiguriert (keine globale RJReport-Einstellung).

| Eigenschaft  | Wert                  |
| ------------ | --------------------- |
| Erforderlich | false                 |
| Standardwert | shared-channel-owners |
| Typ          | Zeichenfolge          |

#### ResourceGroupName

Ressourcengruppe, die das Storage Account enthält. Gebunden an "RJReport.StorageAccount.ResourceGroup".

| Eigenschaft  | Wert         |
| ------------ | ------------ |
| Erforderlich | false        |
| Standardwert |              |
| Typ          | Zeichenfolge |

#### StorageAccountName

Für den Upload verwendetes Storage Account. Gebunden an "RJReport.StorageAccount.StorageAccountName".

| Eigenschaft  | Wert         |
| ------------ | ------------ |
| Erforderlich | false        |
| Standardwert |              |
| Typ          | Zeichenfolge |

#### LinkExpiryDays

Tage bis zum Ablauf des generierten Downloadlinks. Gebunden an "RJReport.StorageAccount.LinkExpiryDays".

| Eigenschaft  | Wert  |
| ------------ | ----- |
| Erforderlich | false |
| Standardwert | 6     |
| Typ          | Int32 |

[Zurück zur Übersicht der Runbook-Referenzen](/de/automatisierung/runbooks/runbook-references.md)


---

# 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-references/org/general/sync-shared-channel-owners_scheduled.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.
