Uso de Power Automate y Azure Automation para administrar el ciclo de vida de los sitios de SharePoint
La expansión de SharePoint es un problema real
Un aspecto clave de un entorno de Microsoft 365 bien administrado es garantizar que objetos como los sitios de SharePoint (y, por extensión, Microsoft Teams) se eliminen cuando ya no sean necesarios. He hablado con muchas organizaciones que implementaron su inquilino de Microsoft 365 sin ninguna consideración sobre cómo administrar el ciclo de vida de los sitios. El resultado final suele ser el arrepentimiento. Si bien el problema no suele aparecer durante los primeros años, con el tiempo los administradores de inquilinos comienzan a notar que la proliferación de objetos en su inquilino dificulta mucho la administración diaria. Por ejemplo, los entornos que carecen de una gobernanza adecuada tienden a tener grandes cantidades de datos obsoletos repartidos en una gran cantidad de sitios de SharePoint, lo que genera confusión entre administradores y usuarios.
En este artículo, exploro cómo combinar habilidades relativamente básicas de PowerShell y Azure Automation con Power Automate para crear una forma limpia y sólida de mantener a su inquilino de Microsoft 365 libre de una expansión excesiva.
Por qué las políticas de vencimiento grupal podrían no funcionar para usted
La respuesta de Microsoft a la expansión de grupos/equipos es la política de vencimiento de grupos. En un nivel básico, la caducidad funciona bien como una forma sencilla de eliminar grupos más antiguos o inactivos dentro de un inquilino de Microsoft 365, aunque las señales limitadas de Microsoft Graph pueden hacer que la caducidad basada en actividades no sea confiable. Las políticas de vencimiento permiten a los propietarios de grupos aprobar la eliminación de un grupo o renovarlo para evitar su eliminación, enviando múltiples recordatorios a los usuarios para intentar garantizar que no se pierdan las renovaciones.
El problema con la política de vencimiento es cuando sus requisitos no encajan perfectamente en la visión de Microsoft sobre el vencimiento grupal. Por ejemplo, solo se admite una única política de vencimiento de grupo por inquilino. Todos los grupos que entran dentro del alcance de la política de vencimiento tienen el mismo período de vencimiento. Otro ejemplo es cuando tienes grupos que no deseas incluir en la política de vencimiento. Una política de vencimiento tiene dos configuraciones de asignación: todos los grupos o grupos seleccionados (hasta un máximo de 500). Además, las políticas de vencimiento de grupo (como puede ver por el nombre) se centran exclusivamente en sitios de grupo conectados a grupos y no cubren ningún otro sitio de SharePoint Online, como los sitios de comunicación. Las políticas de vencimiento grupal también requieren una licencia Entra ID Premium, lo que puede ser un obstáculo para algunas organizaciones.
Si bien las políticas de vencimiento son útiles en algunas situaciones, la falta de flexibilidad y personalización para controlar el vencimiento del grupo a menudo convence a los inquilinos de explorar algún tipo de solución personalizada.
Combinando Azure Automation y Power Automate
Numerosos artículos sobre Practical 365 muestran el valor de Azure Automation ante la necesidad de automatizar operaciones administrativas. Por ejemplo, anteriormente escribí sobre un tema similar sobre cómo mantener Teams ordenado con Automatización. Para tareas programáticas repetibles, Azure Automation es una herramienta fantástica que cualquier administrador de inquilinos puede tener en su caja de herramientas. Azure Automation puede hacer gran parte del trabajo pesado de esta solución, pero una cosa que no puede ofrecer (debido a la naturaleza de Azure Automation que ejecuta scripts simples en una máquina Linux alojada) es el proceso de aprobación para la eliminación de objetos.
Ahí es donde entra Power Automate. Específicamente, la funcionalidad de aprobaciones en Power Automate es una manera sencilla de crear flujos de aprobación fáciles de usar. Las notificaciones de aprobación se pueden administrar tanto en Teams como en Outlook para los usuarios, lo que hace que responder a las notificaciones de vencimiento sea relativamente sencillo.
Por último, es necesario mantener una lista de sitios a incluir y sus tiempos de vencimiento asociados. Existen varias opciones para almacenar una lista de grupos sujetos a comprobaciones de vencimiento, como un archivo CSV en SharePoint o Azure Storage o una tabla de Dataverse. Para este ejemplo, utilizo una lista de SharePoint ya que es fácil de mantener y admite el historial de versiones básico y el registro de auditoría. Con todo en su lugar, el flujo del proceso sigue el esquema de la Figura 1.
Lista de seguimiento de SharePoint
Para realizar un seguimiento del estado de aprobación, utilizo una lista de SharePoint para guardar los detalles clave necesarios para administrar la caducidad de los sitios. La lista contiene las columnas que se muestran en la Tabla 1.
- Column Name
Detalles
- SiteName
Se utiliza un campo de personas para definir uno o más aprobadores para cada sitio.
- SiteURL
La URL del sitio.
- RetentionDays
El período de vencimiento en días para el sitio.
- RemainingDays
Se utiliza para realizar un seguimiento de cuántos días quedan hasta el vencimiento
- MarkedforDeletion
-
Un campo de elección para rastrear si se debe eliminar un sitio. Las opciones disponibles son: “Sí”, “No” y “PendingApproval”
- DeletedOn
Se utiliza para realizar un seguimiento de la fecha en que se eliminó un sitio.
- Approver
Un campo de personas utilizado para definir uno o más aprobadores para cada sitio.
La lista de seguimiento (Figura 2) contiene los detalles y el estado actual de cada sitio dentro del alcance del proceso de vencimiento. Si un sitio no está en la lista, no está sujeto a vencimiento.
Al crear la lista de seguimiento, asegúrese de indexar las columnas "Deletedon", "MarkedforDeletion" y "SiteURL" para que se puedan buscar desde solicitudes de Graph API. La configuración del índice para esta lista se muestra en la Figura 3.
Automatizar el flujo de energía
Power Automate es muy flexible y el flujo para procesar aprobaciones se puede personalizar para cumplir con los requisitos de la organización. No profundizaré aquí en los detalles de bajo nivel sobre la creación de flujos de Power Automate, pero recomiendo leer Teams y Power Automate: ejemplos prácticos para automatizar tareas si no está familiarizado con Power Automate.
El flujo de Power Automate para el proceso de vencimiento comienza con un desencadenador programado que se ejecuta una vez al día. Cada día, el flujo comprobará la lista de seguimiento y, si el valor de “RemainingDays” aún no es 0, se reduce en. El proceso de activación se describe en la Figura 4.
Si el valor "RemainingDays" ya está en 0, entonces el sitio ha caducado y se ejecuta el proceso de aprobación. La columna "MarkedForDeletion" se actualiza con el valor "PendingApproval" y se envía una aprobación a los usuarios enumerados en la columna Aprobador. La configuración del flujo se muestra en la Figura 5.
Luego, la aprobación se envía a la lista de aprobadores a través de Teams y Outlook. Los aprobadores tienen la opción de aprobar la eliminación o rechazarla y restablecer nuevamente la vida útil del grupo (Figura 6).
Finalmente, si uno de los aprobadores aprueba la solicitud, el flujo actualiza el campo "Marcado para eliminación" a "Sí". Si rechazan la solicitud, el flujo restablece los "Días restantes" para que coincidan con el valor de "Días de retención", reiniciando el tiempo de vencimiento (Figura 7).
Runbook de automatización de Azure
La cuenta de automatización y el runbook son la pieza final de configuración necesaria para la solución. El código que uso en este ejemplo está disponible en GitHub. El runbook utiliza cuatro módulos de PowerShell, que deben agregarse como recursos para la cuenta de automatización:
- Se necesita Microsoft.Graph.Authentication para autenticarse en la API de Microsoft Graph.
- Microsoft.Graph.Groups es necesario para procesar la eliminación de sitios conectados al grupo.
- Se necesita Microsoft.Graph.Sites para recopilar datos en cada sitio.
- Se requiere PnP.PowerShell para procesar la eliminación de sitios de comunicación, ya que esto aún no es compatible con la API de Microsoft Graph.
Para obtener más información sobre la instalación y actualización de módulos para Azure Automation, consulte este artículo.
La cuenta de automatización utiliza una identidad administrada asignada por el sistema para autenticarse en Microsoft Graph y PnP PowerShell, similar a la explicación de este artículo. Los permisos que se deben asignar a la entidad de servicio de la identidad administrada son:
- Microsoft Graph - Group.ReadWrite.All - Necesario para eliminar sitios conectados al grupo
- Microsoft Graph - Sites.FullControl.All - Necesario para recuperar información del sitio y administrar sitios
- Office 365 SharePoint Online - Sites.Manage.All - Necesario para eliminar sitios de comunicación a través de PNP PowerShell
Este código de ejemplo muestra cómo agregar permisos de Graph y SharePoint a una cuenta de Azure Automation. El código primero enumera los permisos de Graph necesarios, obtiene el ID de la entidad de seguridad del servicio de la cuenta de automatización, obtiene la entidad de servicio de la aplicación Microsoft Graph y luego asigna los permisos a la cuenta de automatización. Luego, este proceso se repite para la aplicación Office 365 SharePoint Online. Este proceso se detalla más en este artículo sobre Uso de identidades administradas de Azure Automation con RBAC para aplicaciones.
##List Required Permissions
$Permissions = @(
"Group.ReadWrite.All"
"Sites.FullControl.All"
)
##Add Managed Identity ID
$MIID = "<Replace with Managed Identity Service Principal ID>"”
##Get Roles for Permissions
$GraphApp = Get-MgServicePrincipal -Filter "AppId eq '00000003-0000-0000-c000-000000000000'" # Microsoft Graph
[array]$Roles = $GraphApp.AppRoles | Where-Object {$Permissions -contains $_.Value}
##Loop through and add each role
foreach($role in $roles){
$AppRoleAssignment = @{
"PrincipalId” = $MIID
"ResourceId" = $GraphApp.Id
"AppRoleId" = $Role.Id
}
# Assign the Graph permission
New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $MIID -BodyParameter $AppRoleAssignment
}
##List Required Permissions
$Permissions = @(
"Sites.Manage.All"
)
##Get Roles for Permissions
$SPApp = Get-MgServicePrincipal -Filter "AppId eq '00000003-0000-0ff1-ce00-000000000000'" # SharePoint Online
[array]$Roles = $SPApp.AppRoles | Where-Object {$Permissions -contains $_.Value}
##Loop through and add each role
foreach($role in $roles){
$AppRoleAssignment = @{
"PrincipalId" = $MIID
"ResourceId" = $SPApp.Id
"AppRoleId" = $Role.Id
}
# Assign the SharePoint permission
New-MgServicePrincipalAppRoleAssignment -ServicePrincipalId $MIID -BodyParameter $AppRoleAssignment
}Cuando se ejecuta el script, detecta elementos de la lista que están marcados para su eliminación y procesa la eliminación del sitio asociado. Una vez que el objeto se procesa para su eliminación, la fecha de eliminación se agrega al campo "DeletedOn" en la lista de seguimiento. Si no hay objetos marcados para su eliminación, el script se cierra.
Una solución flexible
En este artículo, describí una forma de utilizar Power Automate y Azure Automation para resolver un problema del mundo real. También se puede hacer mucho para mejorar este proceso; por ejemplo, sería bueno observar la actividad reciente en los sitios como una métrica de vencimiento. También he incluido aquí un manejo mínimo de errores para mantener las cosas relativamente en orden.
Combinar las herramientas de Microsoft, como he mostrado aquí, puede ayudar a los administradores de inquilinos a completar algunas tareas sorprendentemente complejas con un proceso automatizado relativamente simple. En el futuro, Microsoft podría ofrecer una mejor solución para gestionar la caducidad de sitios y equipos. Hasta entonces, los administradores siempre pueden crear sus propias soluciones y compartirlas con la comunidad.






