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

# Programado para sincronizar propietarios de Shared Channel

Asegurar que los miembros de un grupo de seguridad sean propietarios de los Teams asignados y de sus Shared Channel.

{% hint style="info" %}
Este es un runbook programado. Está diseñado para ejecutarse según una programación recurrente en lugar de desencadenarse para un único objeto. Vea [Programación](/es/automatizacion/runbooks/scheduling.md) para obtener detalles sobre cómo configurar las programaciones del runbook.
{% endhint %}

### Descripción

Los canales compartidos de Teams no heredan la propiedad de su equipo principal. Este runbook programado cierra esa brecha: para cada equipo nombrado en un mapeo, garantiza que los miembros de un Security Group mapeado sean propietarios del equipo y de cada Shared Channel que aloja el equipo. El mapeo de nombre de equipo a grupo propietario se mantiene centralmente como una configuración de la organización de RealmJoin. El runbook es solo de adición: los propietarios y miembros existentes nunca se eliminan, por lo que los Shared Channel recién creados simplemente se recogen en la siguiente ejecución. Opcionalmente puede enviar un informe por correo electrónico y/o cargar los archivos del informe como un enlace de descarga. El parámetro ReportFileFormat controla qué formatos de archivo de informe se generan y entregan (solo CSV, CSV y XLSX, o solo XLSX). Cuando los archivos adjuntos CSV superan el límite de tamaño del correo y se selecciona "CSV y XLSX", el correo recurre al libro de Excel únicamente. Consulte la documentación adjunta para conocer las reglas de mapeo y la configuración.

### Cómo funciona

En cada ejecución, el runbook:

1. Lee el mapeo de nombre de equipo a grupo propietario desde la configuración de la organización `SharedChannelOwners.Mapping`.
2. Para cada entrada, busca el equipo por su **nombre exacto para mostrar**.
3. Expande el grupo propietario de esa entrada a sus miembros transitivos de usuario **usuario** miembros (los invitados se omiten; no pueden pertenecer a un Shared Channel).
4. Garantiza que esos usuarios sean propietarios del equipo y de cada **alojado** Shared Channel del equipo.

El runbook es **solo de adición**: nunca degrada ni elimina propietarios o miembros existentes. Los canales compartidos recién creados se recogen automáticamente en la siguiente ejecución programada, sin alterar nada que ya esté en su sitio.

#### Configuración del mapeo

El mapeo vive centralmente en la configuración de la organización de RealmJoin (Personalización del runbook → `Configuración` → `SharedChannelOwners.Mapping`) para que se mantenga una sola vez y se comparta con cada programación. Es una lista de `{ TeamName, OwnerGroupId }` objetos, donde `TeamName` es el **nombre exacto para mostrar del equipo** (véase la *Notas* sección para un ejemplo listo para usar). El parámetro oculto `TeamOwnerGroupMapping` se inyecta desde esta configuración; el runbook lo acepta ya sea como una matriz estructurada (forma de subconfiguración recomendada) o como una cadena JSON y normaliza ambos.

#### Coincidencia de equipo

Cada entrada del mapeo apunta a un equipo nombrado explícitamente:

* Un equipo se identifica por su **nombre exacto para mostrar** (sin distinguir mayúsculas y minúsculas, de forma coherente con Microsoft Graph; el espacio en blanco circundante en el nombre configurado se ignora). Solo ese equipo se procesa: no hay comportamiento de prefijo ni de comodín, por lo que nombrar una entrada `EXT Service A` nunca afecta a `EXT Service A Backup` o similar.
* Los nombres para mostrar no están garantizados como únicos en Entra ID. Si varios equipos comparten el nombre configurado, el grupo propietario se aplica a **todos** ellos. Si no coincide ningún equipo, la entrada se informa como *no encontrado* y se omite.

#### Selección de equipo

Para cada entrada configurada `TeamName` el runbook ejecuta una búsqueda Graph `displayName eq '...'` y conserva solo los grupos de Microsoft 365 aprovisionados como un **equipo**.

#### Qué se cambia

* **Equipo (opcional, `IncludeTeamOwners`, predeterminado activado):** los usuarios del grupo propietario se agregan como propietarios y miembros del grupo M365 principal. La pertenencia al equipo también es el requisito técnico previo para convertirse en propietario de un Shared Channel, por lo que este paso habilita el paso de canal.
* **Canales compartidos:** para cada Shared Channel alojado (`membershipType eq 'shared'`), se garantiza que cada usuario del grupo propietario sea un **propietario** de canal: se agrega directamente si falta, o se promueve si ya es miembro. Si se rechaza una adición directa de propietario (por ejemplo, retraso de replicación de membresía), el runbook recurre a agregar primero al usuario como miembro y luego promoverlo.

#### Ejecución en seco

Establezca **`WhatIfMode`** para registrar lo que cambiaría sin escribir nada. En este modo, el runbook muestra primero los equipos que procesaría (con su grupo propietario) y cualquier nombre de equipo configurado que no se haya encontrado.

#### Informe (opcional, ambos desactivados de forma predeterminada)

* **`SendEmailReport`** envía un correo electrónico con la marca RealmJoin (mediante `Send-RjReportEmail`) con estadísticas de la ejecución y dos archivos adjuntos CSV: un resumen por equipo y una lista detallada por cambio. El remitente se toma de la configuración `RJReport.EmailSender` de la configuración.
* **`CreateDownloadLink`** sube los mismos CSV a una cuenta de almacenamiento y devuelve enlaces de descarga SAS con tiempo limitado (también incrustados en el correo electrónico cuando ambas opciones están habilitadas). La cuenta de almacenamiento de destino se toma de los `RJReport.StorageAccount.*` configuraciones.

La carga en el almacenamiento se autentica con la identidad administrada de la cuenta de Automation; esa identidad necesita el **Storage Account Contributor** rol RBAC en la cuenta de almacenamiento de destino (esta es una asignación RBAC de Azure, no un permiso de aplicación de Graph).

#### Programación

Diseñado para ejecutarse sin supervisión según una programación. Debido a que la configuración está centralizada en la configuración de la organización y el runbook es solo de adición e idempotente, una única programación recurrente mantiene sincronizados todos los equipos mapeados y sus canales compartidos a medida que las personas y los canales van y vienen.

### Marca del correo electrónico

El correo electrónico del informe respeta las configuraciones opcionales `RJReport.Branding.*` del tenant:

* **Imagen de encabezado y pie de página** – URL HTTPS públicas, PNG/JPEG/GIF, máx. 200 KB cada una
* **Enlace del pie de página** – destino de la imagen del pie de página
* **Color de acento y de texto** – valores hexadecimales de 6 dígitos, por ejemplo `#0052cc`

Cuando estas configuraciones no están definidas, se usan los gráficos y colores predeterminados de RealmJoin. Una imagen que no se pueda descargar o validar, o un valor de color no válido, nunca impide el correo electrónico del informe; en su lugar, se usa el valor predeterminado correspondiente.

Instrucciones de configuración y requisitos de imagen: [Marca del correo electrónico](https://docs.realmjoin.com/automation/runbooks/runbook-report-settings#email-branding-optional).

### Ubicación

Organización → General → Sincronizar propietarios de Shared Channel (Programado)

**Nombre completo del runbook**

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

### Detalles

| Propiedad          | Valor                                                                                                  |
| ------------------ | ------------------------------------------------------------------------------------------------------ |
| Versión            | 1.3.0                                                                                                  |
| Módulos requeridos | RealmJoin.RunbookHelper (>= 0.8.9)\nMicrosoft.Graph.Authentication (>= 2.39.0)\nAz.Accounts (>= 5.5.2) |
| Programable        | sí                                                                                                     |

### Notas

Configura el mapeo una vez de forma centralizada (Personalización del runbook -> Configuración) como una subconfiguración estructurada bajo "SharedChannelOwners.Mapping". Cada entrada nombra un equipo por su nombre exacto para mostrar. El parámetro oculto TeamOwnerGroupMapping se inyecta desde ahí en tiempo de ejecución. { "Settings": { "SharedChannelOwners": { "Mapping": \[ { "TeamName": "EXT Service A", "OwnerGroupId": "11111111-1111-1111-1111-111111111111" }, { "TeamName": "EXT Service B", "OwnerGroupId": "22222222-2222-2222-2222-222222222222" } ] } } }

### Permisos

#### Permisos de aplicación

* **Tipo**: Microsoft Graph
  * Group.ReadWrite.All
    * *Enumera los equipos, lee los propietarios de grupos y agrega los propietarios de equipo faltantes mediante /groups/{id}/owners/$ref*
  * GroupMember.ReadWrite.All
    * *Lee los miembros transitivos del grupo propietario y agrega primero a los usuarios como miembros del equipo*
  * Channel.ReadBasic.All
    * *Enumera /teams/{id}/channels para encontrar los canales compartidos que procesar*
  * ChannelMember.ReadWrite.All
    * *Lee los miembros del canal y agrega usuarios o los promueve a propietario del Shared Channel*
  * Mail.Send *(opcional — característica: informe por correo electrónico)*
    * *Envía el correo electrónico del informe de sincronización mediante Send-RjReportEmail cuando EmailTo está configurado*
  * User.Read.All
    * *Lee las propiedades del usuario miembro (UPN, userType) mediante transitiveMembers para filtrar invitados*
  * Organization.Read.All *(opcional — característica: informe por correo electrónico)*
    * *Lee el nombre para mostrar del Tenant para el correo electrónico del informe*

### Parámetros

#### TeamOwnerGroupMapping

Mapeo de un nombre exacto para mostrar del equipo a un id de objeto de un Security Group propietario, por ejemplo \[{ "TeamName": "EXT Service A", "OwnerGroupId": "00000000-0000-0000-0000-000000000000" }]. Parámetro oculto, vinculado a la configuración de la organización "SharedChannelOwners.Mapping". El portal de RealmJoin inyecta ese valor; el runbook lo acepta ya sea como el objeto/matriz deserializado (forma estructurada de subconfiguraciones) o como una cadena JSON y normaliza ambos.

| Propiedad            | Valor  |
| -------------------- | ------ |
| Obligatorio          | false  |
| Valor predeterminado | \[]    |
| Tipo                 | Objeto |

#### IncludeTeamOwners

Cuando está habilitado (predeterminado), los miembros del grupo propietario también se garantizan como propietarios y miembros del propio equipo principal (propietarios/miembros del grupo M365). La pertenencia al equipo también es el requisito previo para la propiedad del canal.

| Propiedad            | Valor    |
| -------------------- | -------- |
| Obligatorio          | false    |
| Valor predeterminado | True     |
| Tipo                 | Booleano |

#### WhatIfMode

Cuando está habilitado, el runbook solo registra los cambios que haría sin escribir nada.

| Propiedad            | Valor    |
| -------------------- | -------- |
| Obligatorio          | false    |
| Valor predeterminado | Falso    |
| Tipo                 | Booleano |

#### SendEmailReport

Cuando está habilitado, se envía un informe por correo con la marca RealmJoin mediante Send-RjReportEmail después de la ejecución. El cuerpo contiene estadísticas de la ejecución; los archivos del informe (resumen por equipo y detalle por cambio) se adjuntan en el/los formato(s) de archivo de informe seleccionados.

| Propiedad            | Valor    |
| -------------------- | -------- |
| Obligatorio          | false    |
| Valor predeterminado | Falso    |
| Tipo                 | Booleano |

#### EmailTo

Dirección o direcciones de correo electrónico de los destinatarios del informe (separadas por comas). Solo se usa cuando SendEmailReport está habilitado.

| Propiedad            | Valor  |
| -------------------- | ------ |
| Obligatorio          | false  |
| Valor predeterminado |        |
| Tipo                 | String |

#### EmailFrom

Buzón del remitente para el informe. Vinculado a la configuración de la organización "RJReport.EmailSender".

| Propiedad            | Valor  |
| -------------------- | ------ |
| Obligatorio          | false  |
| Valor predeterminado |        |
| Tipo                 | String |

#### BrandingHeaderImageUrl

URL HTTPS pública opcional de una imagen de encabezado personalizada (PNG/JPEG/GIF, máx. 200 KB) para el correo electrónico del informe. Se obtiene de la configuración del tenant RJReport.Branding.HeaderImageUrl. Cuando está vacía, se usa el gráfico de encabezado predeterminado de RealmJoin.

| Propiedad            | Valor  |
| -------------------- | ------ |
| Obligatorio          | false  |
| Valor predeterminado |        |
| Tipo                 | String |

#### BrandingFooterImageUrl

URL HTTPS pública opcional de una imagen de pie de página personalizada (PNG/JPEG/GIF, máx. 200 KB) para el correo electrónico del informe. Se obtiene de la configuración del tenant RJReport.Branding.FooterImageUrl. Cuando está vacía, se usa el gráfico de pie de página predeterminado de RealmJoin.

| Propiedad            | Valor  |
| -------------------- | ------ |
| Obligatorio          | false  |
| Valor predeterminado |        |
| Tipo                 | String |

#### BrandingFooterLink

URL opcional a la que enlaza la imagen del pie de página. Se obtiene de la configuración del tenant RJReport.Branding.FooterLink. Cuando está vacía, se usa el enlace predeterminado (<https://www.realmjoin.com>).

| Propiedad            | Valor  |
| -------------------- | ------ |
| Obligatorio          | false  |
| Valor predeterminado |        |
| Tipo                 | String |

#### BrandingAccentColor

Anulación opcional del color de acento (hexadecimal de 6 dígitos, por ejemplo '#0052cc') para la plantilla del correo electrónico del informe. Se obtiene de la configuración del tenant RJReport.Branding.AccentColor. Cuando está vacío o no es válido, se usa el color de acento predeterminado de RealmJoin.

| Propiedad            | Valor  |
| -------------------- | ------ |
| Obligatorio          | false  |
| Valor predeterminado |        |
| Tipo                 | String |

#### BrandingTextColor

Anulación opcional del color de texto (hexadecimal de 6 dígitos) para la plantilla del correo electrónico del informe. Se obtiene de la configuración del tenant RJReport.Branding.TextColor. Cuando está vacío o no es válido, se usa el color de texto predeterminado de RealmJoin.

| Propiedad            | Valor  |
| -------------------- | ------ |
| Obligatorio          | false  |
| Valor predeterminado |        |
| Tipo                 | String |

#### ReportFileFormat

Controla qué formatos de archivo del informe se generan y entregan: "solo CSV", "CSV & XLSX" (predeterminado) o "solo XLSX".

| Propiedad            | Valor      |
| -------------------- | ---------- |
| Obligatorio          | false      |
| Valor predeterminado | CSV & XLSX |
| Tipo                 | String     |

#### CreateDownloadLink

Cuando está habilitado, el/los archivo(s) del informe se cargan en una cuenta de almacenamiento y se devuelven enlaces de descarga con tiempo limitado (e incluidos en el informe por correo si eso también está habilitado). Desactivado de forma predeterminada.

| Propiedad            | Valor    |
| -------------------- | -------- |
| Obligatorio          | false    |
| Valor predeterminado | Falso    |
| Tipo                 | Booleano |

#### ContainerName

Contenedor de almacenamiento usado para la carga. Configurado por runbook (no es una configuración global de RJReport).

| Propiedad            | Valor                 |
| -------------------- | --------------------- |
| Obligatorio          | false                 |
| Valor predeterminado | shared-channel-owners |
| Tipo                 | String                |

#### ResourceGroupName

Grupo de recursos que contiene la cuenta de almacenamiento. Vinculado a "RJReport.StorageAccount.ResourceGroup".

| Propiedad            | Valor  |
| -------------------- | ------ |
| Obligatorio          | false  |
| Valor predeterminado |        |
| Tipo                 | String |

#### StorageAccountName

Cuenta de almacenamiento usada para la carga. Vinculada a "RJReport.StorageAccount.StorageAccountName".

| Propiedad            | Valor  |
| -------------------- | ------ |
| Obligatorio          | false  |
| Valor predeterminado |        |
| Tipo                 | String |

#### LinkExpiryDays

Días hasta que expire el enlace de descarga generado. Vinculado a "RJReport.StorageAccount.LinkExpiryDays".

| Propiedad            | Valor |
| -------------------- | ----- |
| Obligatorio          | false |
| Valor predeterminado | 6     |
| Tipo                 | Int32 |

[Volver a la vista general de referencia del runbook](/es/automatizacion/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/es/automatizacion/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.
