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

# Sincronizar propietarios de Shared Channel programado

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

### Descripción

Los Teams Shared Channels no heredan la propiedad de su equipo principal. Este runbook programado cierra esa brecha: para cada equipo nombrado en una asignación, garantiza que los miembros de un Security Group asignado sean propietarios del equipo y de cada canal compartido alojado por el equipo. La asignación de nombre de equipo a grupo de propietarios se mantiene centralmente como una configuración de organización de RealmJoin. El runbook es solo de adición: los propietarios y miembros existentes nunca se eliminan, por lo que los canales compartidos recién creados se recogen simplemente en la siguiente ejecución. Opcionalmente puede enviar por correo un informe 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 "CSV & XLSX" está seleccionado, el correo recurre al libro de Excel únicamente. Consulte la documentación adjunta para las reglas de asignación y la configuración.

### Cómo funciona

En cada ejecución, el runbook:

1. Lee la asignación de nombre de equipo a grupo de propietarios desde la configuración de la organización `SharedChannelOwners.Mapping`.
2. Para cada entrada, busca el equipo por su **nombre para mostrar exacto**.
3. Amplía el grupo de propietarios de esa entrada a sus miembros transitivos de **usuario** miembros (los invitados se omiten: no pueden pertenecer a un canal compartido).
4. Se asegura de que esos usuarios sean propietarios del equipo y de cada **alojado** canal compartido del equipo.

El runbook es **solo de adición**: nunca degrada ni elimina a los propietarios o miembros existentes. Por lo tanto, los canales compartidos recién creados se detectan automáticamente en la siguiente ejecución programada, sin alterar nada de lo ya establecido.

#### Configuración de la asignación

La asignación reside centralmente en la configuración de la organización de RealmJoin (Runbook Customization → `Configuración` → `SharedChannelOwners.Mapping`) de modo que se mantiene una sola vez y se comparte 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 un array estructurado (forma de subconfiguración recomendada) o como una cadena JSON y normaliza ambas.

#### Coincidencia de equipos

Cada entrada de la asignación apunta a un equipo nombrado explícitamente:

* Un equipo se identifica por su **nombre para mostrar exacto** (sin distinción de mayúsculas y minúsculas, de acuerdo con Microsoft Graph; se ignoran los espacios en blanco alrededor del nombre configurado). Solo se procesa ese equipo: no hay comportamiento de prefijo ni comodín, así 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 de propietarios se aplica a **todo** todos ellos. Si ningún equipo coincide, la entrada se informa como *no encontrado* y se omite.

#### Selección de equipos

Para cada `TeamName` configurado, el runbook ejecuta una consulta Graph `displayName eq '...'` y conserva solo los grupos de Microsoft 365 aprovisionados como un **Team**.

#### Qué cambia

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

#### Ejecución de prueba

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

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

* **`SendEmailReport`** envía un correo con la marca de 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 `RJReport.EmailSender` configuración.
* **`CreateDownloadLink`** carga los mismos CSV en un Storage Account y devuelve enlaces de descarga SAS con tiempo limitado (también incrustados en el correo cuando ambas opciones están habilitadas). El Storage Account de destino se toma de la `RJReport.StorageAccount.*` configuración.

La carga al almacenamiento se autentica con la identidad administrada de la cuenta de Automation; esa identidad necesita el **Storage Blob Data Contributor** RBAC en el Storage Account de destino (esta es una asignación de Azure RBAC, 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 asignados y sus canales compartidos a medida que las personas y los canales van y vienen.

### Branding del correo electrónico

El correo electrónico del informe tiene en cuenta la configuración opcional `RJReport.Branding.*` de Tenant: una imagen de encabezado personalizada, una imagen de pie de página personalizada (URL HTTPS públicas, PNG/JPEG/GIF, máx. 200 KB cada una), un enlace personalizado en el pie de página y colores personalizados de acento y de texto (valores hexadecimales de 6 dígitos, p. ej. `#0052cc`). Cuando estas configuraciones no están definidas, se usan los gráficos y colores predeterminados de RealmJoin. Una imagen de branding que no se pueda descargar o validar, o un valor de color que no sea un color hexadecimal válido, nunca impide el envío del correo del informe; en su lugar, se usa el valor predeterminado correspondiente.

Consulta la [documentación de RealmJoin Report Settings](https://docs.realmjoin.com/automation/runbooks/runbook-report-settings) para ver los detalles de configuración.

### Ubicación

Organización → General → Sincronizar propietarios de canales compartidos (Programado)

**Nombre completo del runbook**

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

### Detalles

| Propiedad          | Valor                                                                                                             |
| ------------------ | ----------------------------------------------------------------------------------------------------------------- |
| Versión            | 1.3.0                                                                                                             |
| Módulos requeridos | <p>RealmJoin.RunbookHelper (>= 0.8.9)<br>Microsoft.Graph.Authentication (>= 2.39.0)<br>Az.Accounts (>= 5.5.2)</p> |
| Programable        | sí                                                                                                                |

### Notas

Configure la asignación una sola vez de forma centralizada (Runbook Customization -> Settings) 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 Teams, lee los propietarios del grupo y agrega los propietarios de equipo faltantes mediante /groups/{id}/owners/$ref*
  * GroupMember.ReadWrite.All
    * *Lee los miembros transitivos del grupo de propietarios y agrega primero a los usuarios como miembros del equipo*
  * Channel.ReadBasic.All
    * *Enumera /teams/{id}/channels para encontrar los canales compartidos que se procesarán*
  * ChannelMember.ReadWrite.All
    * *Lee los miembros del canal y agrega usuarios o los promociona a propietario del canal compartido*
  * Mail.Send *(opcional — función: 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 a los invitados*
  * Organization.Read.All *(opcional — función: informe por correo electrónico)*
    * *Lee el nombre para mostrar del Tenant para el correo del informe*

### Parámetros

#### TeamOwnerGroupMapping

Asignación de un nombre exacto para mostrar del equipo a un identificador de objeto de Security Group de propietarios, p. ej. \[{ "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/array deserializado (subconfiguraciones estructuradas) o como una cadena JSON, y normaliza ambos.

| Propiedad            | Valor  |
| -------------------- | ------ |
| Requerido            | falso  |
| Valor predeterminado | \[]    |
| Tipo                 | Objeto |

#### IncludeTeamOwners

Cuando está habilitado (predeterminado), también se garantiza que los miembros del grupo de propietarios sean propietarios y miembros del propio equipo principal (propietarios/miembros del grupo de Microsoft 365). La pertenencia al Team también es el requisito previo para la propiedad del canal.

| Propiedad            | Valor    |
| -------------------- | -------- |
| Requerido            | falso    |
| Valor predeterminado | True     |
| Tipo                 | Booleano |

#### WhatIfMode

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

| Propiedad            | Valor    |
| -------------------- | -------- |
| Requerido            | falso    |
| Valor predeterminado | Falso    |
| Tipo                 | Booleano |

#### SendEmailReport

Cuando está habilitado, se envía un informe por correo con la marca de 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    |
| -------------------- | -------- |
| Requerido            | falso    |
| Valor predeterminado | Falso    |
| Tipo                 | Booleano |

#### EmailTo

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

| Propiedad            | Valor  |
| -------------------- | ------ |
| Requerido            | falso  |
| Valor predeterminado |        |
| Tipo                 | Cadena |

#### EmailFrom

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

| Propiedad            | Valor  |
| -------------------- | ------ |
| Requerido            | falso  |
| Valor predeterminado |        |
| Tipo                 | Cadena |

#### BrandingHeaderImageUrl

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

| Propiedad            | Valor  |
| -------------------- | ------ |
| Requerido            | falso  |
| Valor predeterminado |        |
| Tipo                 | Cadena |

#### 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 del informe. Procede de la configuración de Tenant RJReport.Branding.FooterImageUrl. Cuando está vacía, se usa la imagen de pie de página predeterminada de RealmJoin.

| Propiedad            | Valor  |
| -------------------- | ------ |
| Requerido            | falso  |
| Valor predeterminado |        |
| Tipo                 | Cadena |

#### BrandingFooterLink

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

| Propiedad            | Valor  |
| -------------------- | ------ |
| Requerido            | falso  |
| Valor predeterminado |        |
| Tipo                 | Cadena |

#### BrandingAccentColor

Reemplazo opcional del color de acento (hex de 6 dígitos, p. ej. '#0052cc') para la plantilla del correo del informe. Procede de la configuración de Tenant RJReport.Branding.AccentColor. Cuando está vacío o es inválido, se usa el color de acento predeterminado de RealmJoin.

| Propiedad            | Valor  |
| -------------------- | ------ |
| Requerido            | falso  |
| Valor predeterminado |        |
| Tipo                 | Cadena |

#### BrandingTextColor

Reemplazo opcional del color de texto (hex de 6 dígitos) para la plantilla del correo del informe. Procede de la configuración de Tenant RJReport.Branding.TextColor. Cuando está vacío o es inválido, se usa el color de texto predeterminado de RealmJoin.

| Propiedad            | Valor  |
| -------------------- | ------ |
| Requerido            | falso  |
| Valor predeterminado |        |
| Tipo                 | Cadena |

#### ReportFileFormat

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

| Propiedad            | Valor      |
| -------------------- | ---------- |
| Requerido            | falso      |
| Valor predeterminado | CSV y XLSX |
| Tipo                 | Cadena     |

#### CreateDownloadLink

Cuando está habilitado, los archivos del informe se cargan en un Storage Account 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    |
| -------------------- | -------- |
| Requerido            | falso    |
| Valor predeterminado | Falso    |
| Tipo                 | Booleano |

#### ContainerName

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

| Propiedad            | Valor                 |
| -------------------- | --------------------- |
| Requerido            | falso                 |
| Valor predeterminado | shared-channel-owners |
| Tipo                 | Cadena                |

#### ResourceGroupName

Grupo de recursos que contiene el Storage Account. Vinculado a "RJReport.StorageAccount.ResourceGroup".

| Propiedad            | Valor  |
| -------------------- | ------ |
| Requerido            | falso  |
| Valor predeterminado |        |
| Tipo                 | Cadena |

#### StorageAccountName

Storage Account usado para la carga. Vinculado a "RJReport.StorageAccount.StorageAccountName".

| Propiedad            | Valor  |
| -------------------- | ------ |
| Requerido            | falso  |
| Valor predeterminado |        |
| Tipo                 | Cadena |

#### LinkExpiryDays

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

| Propiedad            | Valor |
| -------------------- | ----- |
| Requerido            | falso |
| Valor predeterminado | 6     |
| Tipo                 | Int32 |

[Volver a la vista general de la 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.
