Rollen im Reportserver

Wenn man sich die Berechtigungen im Reportserver anzeigen will, kommt man recht schnell auf die Rollen. Was versteckt sich aber hinter jeder einzelnen Rolle? Ein Report über die Report-Rollen wäre mal was. … mehr »

Herunterladen: RS Rollen Berechtigungen.rdl

Herunterladen von: RS Rollen Berechtigungen.rdl Rollen im Reportserver

Reportserver.dbo.Roles

Achtung: Diese Tabelle ist nicht von Microsoft dokumentiert und kann sich daher jederzeit ändern.

Diese Tabelle liefert uns die Namen der Rollen und eine kurze Beschreibung. Was aber im Detail dahinter steckt, müssen wir erst einmal analysieren. Microsoft bietet zwar eine ausführliche Beschreibung der Inhalte dieser Tabelle, diese eignet sich aber nicht zur programmatischen Analyse der Berechtigungen. Insbesondere wenn Fremdsoftware eigene Rollen mitbringt, wird erst nach zahlreichen Klicks im Managemengt Studio klar, welche Rechte sich dahinter verbergen. Unser Ziel soll es aber sein, einen Report zu generieren, der für jeden Benutzer und jedes Objekt die aktiven Berechtigungen aufzeigt.

TaskMask

In der Spalte TaskMask werden die einzelnen Berechtigungen codiert, die man u. a. im Management Studio (beim Reportserver unter Sicherheit/Rollen/Eigenschaften) sehen und auswählen kann. Leider ist dieses aber eine Maskierung, die für jedes einzelne Recht eine 0 oder 1 an eine bestimmte Stelle setzt und die Interpretation dieser Stelle ist zudem davon abhängig, was in der Spalte RoleFlags hinterlegt ist. Das ist also nicht gerade der Traum eines Datenbank-Designers.

In diesem Blog-Eintrag von 2010 habe ich zumindest eine Beschreibung gefunden, was sich hinter welcher Stelle der TaskMask verbirgt.

RoleFlags

Hier werden die verschiedenen Gruppen von Rollen definiert:

RoleFlagsBeschreibung
0Allgemeine Rollen
1Systemrollen
2Modell-Rollen

Ein SQL zur Anzeige der einzelnen Rollen ist dann schnell gefunden:

WITH Description AS
(
SELECT RoleName, Description,
CASE WHEN RoleFlags = 0 THEN
  
CASE WHEN SUBSTRING(TaskMask, 1, 1 ) = '1' THEN 'Set security for individual items, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 2, 1 ) = '1' THEN 'Create linked reports, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 3, 1 ) = '1' THEN 'View reports, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 4, 1 ) = '1' THEN 'Manage reports, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 5, 1 ) = '1' THEN 'View resources, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 6, 1 ) = '1' THEN 'Manage resources, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 7, 1 ) = '1' THEN 'View folders, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 8, 1 ) = '1' THEN 'Manage folders, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 9, 1 ) = '1' THEN 'Manage report history, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 10, 1 ) = '1' THEN 'Manage individual subscriptions, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 11, 1 ) = '1' THEN 'Manage all subscriptions, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 12, 1 ) = '1' THEN 'View data sources, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 13, 1 ) = '1' THEN 'Manage data sources, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 14, 1 ) = '1' THEN 'View models, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 15, 1 ) = '1' THEN 'Manage models, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 16, 1 ) = '1' THEN 'Consume reports, ' ELSE '' END  
WHEN
RoleFlags = 1 THEN
  
CASE WHEN SUBSTRING(TaskMask, 1, 1 ) = '1' THEN 'Manage roles, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 2, 1 ) = '1' THEN 'Manage report server security,' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 3, 1 ) = '1' THEN 'View report server properties, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 4, 1 ) = '1' THEN 'Manage report server properties, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 5, 1 ) = '1' THEN 'View shared schedules, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 6, 1 ) = '1' THEN 'Manage shared schedules, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 7, 1 ) = '1' THEN 'Generate events, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 8, 1 ) = '1' THEN 'Manage jobs, ' ELSE '' END +
  
CASE WHEN SUBSTRING(TaskMask, 9, 1 ) = '1' THEN 'Execute Report Definitions, ' ELSE '' END
WHEN
RoleFlags = 2 THEN
  
CASE WHEN SUBSTRING(TaskMask, 1, 1 ) = '1' THEN 'View model items, ' ELSE '' END
END AS
Task_Mask_Description
FROM dbo.Roles
)
SELECT RoleName, Description, SUBSTRING(Task_Mask_Description, 1, LEN(Task_Mask_Description)-1) AS Task_Mask_Description
FROM Description;

Report

Jetzt brauchen wir nur noch einen Report, der uns diese Informationen anzeigt. Der Report erhält außerdem einen Parameter @Report_Role, damit wir die Daten später einmal filtern können. Ziel ist es ja einen Überblick über die Benutzer und ihre effektiven Rechte zu erhalten.

Der Report verwendet in der Datenquelle übrigens einen Alias (Reporting), um ihn einfacher verteilen zu können. Zur Verwendung von Alias habe ich hier ja bereits einiges geschrieben.

  SSRSRolesDescription.sql
  RS Rollen Berechtigungen.rdl