Modeldriven Power-Apps-Umgebungen bringen bereits ein sehr gutes und Intuitives Rollenbasiertes Berechtigungskonzept mit. So ist es beispielsweise sehr einfach Zugriffsmöglichkeiten (Acess-Level: wie darf der Benutzer zugreifen) auf Datensätze von Microsoft Dataverse Tabellen über Rollen festzulegen bzw. einzuschränken. Da das Access-Level keine Ja/Nein-Information ist, sondern ein Schlüssel - eine etwas unglückliche Bezeichnung, wie ich finde - über den man festlegen kann, auf welche Datensätze der Tabelle der Benutzer den entsprechenden Zugriff hat, kann man automatisch den Zugriff auf Rowlevel-Ebene einschränken.

Diese Einstellungsmöglichkeit findet man unter: Erweiterte Einstellungen > Einstellungen > System > Sicherheit > Sicherheitsrollen > [entsprechende Rolle] > [entsprechende Tabelle].

Über die Matrix kann man für jede Tabelle festlegen, wie (= Access-Level) Mitglieder der Rolle auf diese Datensätze zugreifen dürfen. Folgende Access-Level stehen zur Verfügung: Erstellen, Lesen, Schreiben, Löschen, Anfügen, Anfügen an, Zuweisen, Freigeben.

Für jedes dieser Access-Level kann über den Schlüssel bestimmt werden, auf welche Datensätze sich der Zugriff bezieht. Diese können sein: Datensätze des jeweiligen Benutzers, Datensätze aller Benutzer einer Unternehmenseinheit, Datensätze aller Benutzer einer übergeordneten Organisation, Datensätze aller Benutzer der gesamte Organisation.

Was aber, wenn die Einteilung auf Benutzer- Unternehmens- oder Organisationslevel nicht für meinen Praxisfall passt? Wenn beispielsweise alle Benutzer eines Teams Zugriff auf bestimmte Datensätze haben sollen. Ist das möglich?

Ja: ist es!

Hierfür ist es wichtig zu wissen, dass der Schlüssel „Benutzer“ den Zugriff auf Datensätze, die von dem jeweiligen Benutzer erstellt wurden oder mit dem Benutzer geteilt wurden, gewährt. Das Teilen von Datensätzen wird über den Ribbon-Button "Freigeben" und das nachfolgende Angeben von Benutzern oder Teams erreicht. Technisch werden dazu Einträge in der Tabelle PrincipalObjectAccess (POA) erstellt.

Im Folgenden soll es nun darum gehen, diese Freigabe über Power Automate zu automatisieren.

Um eine Datensatz-Freigabe über Power Automate zu erstellen bzw. zu entfernen, bedient man sich einer Unbound Action. Mit "GrantAccess" wird eine Freigabe für einen einzelnen Benutzer oder ein Team erstellt.

Welche Parameter werden bei "GrantAccess" übergeben?

Unter "Target" wird angegeben um welche Tabelle es sich handelt und in Klammern die GUID des entsprechenden Datensatzes für den die Freigabe erfolgen soll. In meinem Fall wird ein Datensatz der Tabelle "m8_modul" freigegeben.

Bsp. m8_moduls(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxxx)

Unter "PrincipalAccess" wird angegeben wem Zugriff gegeben wird, einem einzelnen Benutzer oder einer Gruppe und den entsprechenden Datentyp (Microsoft.Dynamics.CRM.systemuser oder Microsoft.Dynamics.CRM.teams) .

Will man einem einzelnen Nutzer Zugriff gewähren, wird es wie im Bild gemacht. Die "systemuserid" ist hierbei die GUID des entsprechenden Benutzers für den man den Datensatz freigeben möchte.

Achtung: Falls ein Formatfehler auftritt muss "@@odata.type" geschrieben werden (@@ doppelt).

Eine Freigabe für ein Team sieht wie folgt aus:

"AccessMask" regelt die Freigabestufe, welche für den entsprechenden Datensatz erteilt wird.

Folgende AccessMask‘s können gesetzt werden:

  • None = Keinen Zugriff
  • ReadAccess = Leserechte auf den Datensatz
  • WriteAccess = Lese- und Schreibrechte auf den Datensatz
  • AppendAccess = Anfügen eines weiteren Datensatzes an den Datensatz
  • AppendToAccess = Dem Datensatz einen bestimmten Datensatz anfügen (AppenAccess und AppendToAccess funktionieren in Kombination)
  • CreateAccess = Datensatz erstellen
  • DeleteAccess = Datensatz löschen
  • ShareAccess = Datensatz freigeben für einen Systemuser/Team
  • AsignAccess = Besiter des Datensatzes ändern

Mittels „RevokeAccess“ kann die Freigabe wieder entfernt werden.

"PrincipalId" ist die GUID des Systemuser dem der Zugriff auf einen bestimmten Datensatz (ObjectId = GUID des Datensatzes) der Tabelle "m8_modul" entzogen werden soll.