Power BI Report Server (PBRS) es un servidor de informes local con un portal web en el que se muestran y administran informes y KPI. Junto con él, se incluyen herramientas para crear informes de Power BI, informes paginados, informes móviles y KPI. Los usuarios pueden acceder a los informes de maneras diferentes: verlos en un explorador web, en un dispositivo móvil o como un correo electrónico en su bandeja de entrada.

El portal web de PBRS es una aplicación que se ejecuta en un explorador. Al iniciar el portal web, las páginas, los vínculos y las opciones que aparecen varían en función de los permisos que tenga cada usuario en el servidor de informes. Si está asignado a un rol con permisos completos, tiene acceso al conjunto completo de menús y páginas de la aplicación para administrar un servidor de informes; en cambio, si está asignado a un rol con permisos para ver y ejecutar informes, el usuario solo verá los menús y páginas que necesite para esas actividades. Se pueden tener distintas asignaciones de roles para distintos servidores de informes, o incluso para los distintos informes y carpetas en un único servidor.

La asignación de roles puede ser tarea sencilla si se trata de una pequeña cantidad de usuarios, pero para organizaciones con un gran número de usuarios puede ser una tarea muy laboriosa; más aún cuando, en el funcionamiento normal de una organización, se añadirán nuevos roles a nuevos usuarios, se quitarán permisos a otros o llegarán a modificarse estos permisos con el paso del tiempo.

Para modificar estas asignaciones de roles, entre otras cosas, PBRS admite API de transferencia de estado representacional (REST). Las API REST son puntos de conexión de servicio que admiten un conjunto de operaciones HTTP, logrando así crear, recuperar, actualizar o eliminar el acceso a los recursos de un servidor de informes.

Para automatizar este proceso, en este artículo vamos a crear un paquete de Microsoft SQL Server Integration Services (SSIS), el cual consumirá los datos de usuario y permisos asignados de una tabla que tendremos en SQL Server y, a través de un script de PowerShell, actualizará o eliminará los permisos asignados a cada usuario de forma automática.

 

Creación del paquete de SSIS

 

Microsoft SQL Server Integration Services es una plataforma que nos permite generar soluciones de integración de datos de alto rendimiento, entre las que se incluyen paquetes de extracción, transformación y carga de datos para el almacenamiento de datos. SSIS incluye herramientas gráficas y asistentes para generar y depurar paquetes o tareas para realizar funciones de flujo de datos, entre otras.

En nuestro caso, necesitaremos principalmente dos módulos de SSIS, uno para extraer los datos de la tabla que tenemos creada en SQL y otra para pasar esos datos a un script de PowerShell, el cual conectará con PBRS e irá mandando las solicitudes de cambio de permisos.

En este artículo partimos de una pequeña tabla, formada únicamente por cuatro usuarios a modo de demostración, aunque podríamos tener cualquier número de usuarios. La tabla consta de cuatro columnas: nombre de usuario, nombre de la carpeta, nombre del archivo y permiso concedido. En caso de tener el valor Carpeta en el campo ObjectName, se asume que el permiso se concede a la carpeta completa; en cambio, cuando tengamos el archivo concreto especificado, el permiso se concederá únicamente al archivo especificado.

 

 

Primero, vamos a conceder permisos a todos los usuarios, pero después modificaremos esta tabla para quitar algunos de estos permisos a los usuarios y ver cuál es el comportamiento de nuestro paquete de SSIS.

En primer lugar, deberemos establecer la conexión entre nuestro servidor de SQL Server y el paquete de SSIS, para ello crearemos un nuevo agente de conexión, el cuál apuntará directamente a nuestra base de datos (en este caso el nombre de la base de datos es Prueba).

 

 

El siguiente paso será utilizar el módulo Tarea Ejecutar SQL para, mediante una consulta simple, extraer los datos de la tabla y devolvernos un objeto conteniéndola.

 

 

Una vez añadido el módulo, dentro de la configuración general deberemos establecer la conexión, introducir la consulta que vamos a hacer a la base de datos y, por último, debemos especificar que el módulo debe devolver el conjunto de resultados completo.

 

 

Por último, en la pestaña Result Set, deberemos especificar el nombre que va a tener la variable que contenga el objeto con la tabla:

 

 

Con esto ya tendríamos nuestra tabla como variable dentro del paquete de SSIS, pero no podemos pasar la tabla completa a un script, por lo que necesitamos primero introducir un Foreach Loop Container para iterar por cada una de las filas e ir ejecutando el script sobre ella.

 

 

En cuanto a la configuración del módulo, en primer lugar, en la pestaña Collection, deberemos especificar el enumerador que vamos a utilizar, en este caso será un Enumerador de ADO para Foreach, y deberemos apuntar a la variable de salida del módulo anterior. Por último, en la configuración del enumerador deberemos elegir la opción Rows in the first table.

 

 

Por otro lado, en la pestaña Variable Mappings debemos mapear cada una de las columnas que contiene nuestra tabla.

 

 

Una vez configurado el bucle, solo nos quedaría el script de PowerShell para modificar los permisos de cada usuario. A este script tendremos que ir pasándole, en cada iteración del bucle, cada una de las columnas de la tabla en forma de parámetros; para esto tendremos que, por un lado, crearnos el script de PowerShell, para dentro del módulo lanzar el script y pasarle como argumentos cada una de las variables. Para esto utilizaremos el módulo Ejecutar Proceso de SSIS.

Dentro de la configuración del módulo, podemos definir la ruta del ejecutable y los argumentos directamente en la pestaña Process, pero otra opción es pasar el comando completo de ejecución a través de una expresión, dentro de la pestaña Expressions. Dentro de la pestaña crearemos una nueva expresión como la siguiente:

 

 

Los valores con @ se corresponden con las variables de SSIS y los valores con guion con las variables que entrarán en PowerShell. También hay que tener cuidado con los espacios ya que la expresión completa resultante será una cadena de texto.

Con esto ya tendríamos configurado todo lo necesario dentro de SSIS, pero nos falta el script de PowerShell que modificará los permisos, para ello utilizaremos el siguiente código:

 

# Parameters

param(
    [string]$UserName,
    [string]$FolderName,
    [string]$ObjectName,
    [string]$Permission
)

$server = 'localhost'
$ReportPortalUri = 'http://localhost/Reports';
$session = New-RsRestSession -ReportPortalUri $ReportPortalUri;
$name = $env:COMPUTERNAME

# Change permissions in PBRS

if($Permission -eq "Sin permisos")
{
    try
    {
        if($ObjectName = "Carpeta")
        {
Revoke-RsCatalogItemAccess -Identity ($name + "\" + $UserName) -     Path ("/" + $FolderName)
        }
        else
        {
Revoke-RsCatalogItemAccess -Identity ($name + "\" + $UserName) -Path ("/" + $FolderName + "/" + $ObjectName)
        }
    }catch{}
}
else
{
    try
    {
        if($ObjectName = "Carpeta")
        {
Grant-RsCatalogItemRole -Identity ($name + "\" + $UserName) -RoleName $Permission -Path ("/" + $FolderName) -Strict
        }
        else
        {
Grant-RsCatalogItemRole -Identity ($name + "\" + $UserName) -RoleName $Permission -Path ("/" + $FolderName + "/" + $ObjectName) -Strict
        }
    }catch{}
}

 

 

En el script, en primer lugar, definimos los parámetros de entrada que van a entrar como argumento con formato string, después establecemos la conexión con nuestro Servidor de Informes de Power BI y por último añadimos la lógica a partir de la cual se cambiarán los permisos, utilizando la librería ReportingServicesTools para facilitar el proceso.

 

Ejecución del paquete sobre Power BI Report Server

 

Con esto ya tendríamos nuestro paquete de SSIS completo y listo para ejecutar, así que vamos a probarlo. Para ello simplemente pulsaremos en ejecutar, en la interfaz de SSIS. Una vez haya finalizado el aspecto será el siguiente si todo ha ido bien:

 

 

Una vez ejecutado, podemos ir a PBRS y comprobar los resultados:

 

 

Por ejemplo, para el Informe4, dentro de la Carpeta3, se han añadido justamente los permisos que hemos especificado en la tabla de SQL Server.

Por último, una vez añadidos todos los permisos, vamos a probar a quitar algún permiso, para ello, solo tenemos que cambiar el valor de Permission de la tabla de SQL Server por Sin permisos para el caso en el que los queramos quitar.

 

 

Al volver a ejecutar el paquete de SSIS, veremos que dentro de la carpeta Carpeta3, en el archivo Informe4, el usuario Prueba4 ya no tendrá permisos asignados.

 

Si quieres dar forma a tu proyecto con Power BI, en SolidQ podemos guiarte en el proceso (mentoring), ayudarte a su desarrollo mediante nuestro framework, así como formarte en aquellas áreas que necesites. Consulta todos nuestros cursos de 0 a experto con Power BI, desde nuestro curso de Power BI para usuarios de negocio hasta formación más avanzada como DAX, Data Governance o Power Query.