En ocasiones nos encontramos con Flujos que necesitan ser ejecutados en el contexto de un usuario, lo cual nos representa un reto ya que tenemos que distribuir este Flujo a cientos si no es que miles de usuarios. Así pues, ¿cómo podemos hacer convertir a un usuario en un ambiente de Power Automate a un usuario run-only para un Flujo? Pues el día de hoy lo exploraremos.
Usuarios Run-Only en Power Automate
En resúmen, un usuario run-only puede ser añadido a Flow con un activador manual. Estos usuarios pueden correr Flujos a los cuales son añadidos como usuarios run-only pero no pueden editar dichos Flujos.
El Flujo que estaré describiendo para este caso es lo que llamaré un «Flujo de admin». Este es un flujo que solo es compartido con otros administradores, mientras que los usuarios normales no deberían tener uso o necesidad de usarlo. He incluído este Flujo en una solución para que el Dataverse pueda ser usado y pueda fácilmente transportar el Flujo de un entorno a otro como parte del ALM. Ahora analicemos este Flujo.
Dado que los usuarios run-only son añadidos en demanda, el Flujo naturalmente tiene un activador manual. Añadir usuarios run-only es hecho por Flujo para que la entrada del activador pregunte por una ID de Flujo (GUID). Si un valor no es dado, el Flujo será terminado como cancelado. La acción de registros de lista va a listar a todos los usuarios (systemuser) en un entorno. Como mi dominio contiene kbflux, he usado un filtro de query para reducir los resultados:
- Nombre de Usuario debe incluír mi dominio kbflux.
- Modo de Acceso debe ser Read Write. Esto descartará la integración de usuarios, usuarios de la aplicación y usuarios administrativos
La función del filtro te la dejo abajo.
contains(domainname, 'yourDomain') and accessmode eq 0
Dar permiso a cada usuario del ambiente.
Si nuestro entorno tiene un gran número de usuarios, es buena idea usar la acción de paginación para las listas de registros. De este modo, la acción listará todos nuestros usuarios. La paginación puede ser activada y desactivada según nos convenga y el threshold puede ser cambiado en base a nuestras necesidades.
El «apply to each loop» inicia con una condición ya que no se puede filtrar el estado (isdisabled) de un usuario en el filtro de query de la acción de lista de registros para que una condición revise que solo usuarios activos son añadidos al Flujo. Como el campo de estado es isdisabled, la condición revisa si el estado de un registro es distinto a false.
Si hay cientos (si no es que miles) de usuarios corriendo el Flujo, esto puede tomar un rato. Para hacerlo correr más rápido, podemos usar Concurrency Control para el loop apply to each. Dado que el loop contiene acciones un tanto simples, he tomado un acercamiento distinto y he tomado el grado de paralelismo al máximo. De todos modos, se recomienda que hagamos pruebas en nuestro propio entorno antes de ir a los extremos.
Agregando usuarios con acciones de Power Automate
Azure AD Object Id es guardado en una acción Compose para uso en futuras acciones.Como los usuarios del Flujo no son añadidos como usuarios run-only, una acción List Flow Owners es usada. Una acción Select es usada para escoger los valores para el principal. Esto nos dará el ID (GUID) de un usuario. La salida de la acción select es un array. Para usar la salida en una condición, una acción join convierte el array en una secuencia.
Lo siguiente es que una condición revisa si el Azure AD Object ID compuesto está incluído en la secuencia de salida de la acción join. De serlo, dicho loop es para el dueño del Flujo; si la salida de join no contiene el Azure AD Object ID del compose,[entonces dicho usuario será añadido como un usuario run-only.
Las acciones finales requieren de un pequeño truco. Por alguna razón, la acción Modify Run-Only Users pierde por completo sus valores si el campo Add User no tiene un valor dinámico para la salida de una acción compose. Esto no es un gran problema, pues todo lo que necesitamos es una acción compose. El JSON que necesita ser compuesto debe contener la salida de la acción compone para el Azure AD Object ID.
Lo que necesitamos es el siguiente:
[
{
"properties": {
"principal": {
"id": @{outputs('Compose_azureactivedirectoryobjectid')},
"type": "User"
}
}
}
]
El cuerpo compuesto puede ser usado en la acción final, lo cual añade un usuario al Flujo como un usuario run-only de Power Automate. Y eso es todo, este simple, pequeño, pero poderoso Flujo deberá facilitarnos el añadir usuarios run-only para nuestros Flujos de activador manual.
Cualquier duda, nos leemos abajo.