top of page

Read Dataverse access rights: Who has access to which connection reference?

  • Writer: kim
    kim
  • 6 days ago
  • 2 min read

How Marie and Marvin find out at the moped shed who has access to a connection reference – and what exactly is allowed.

🧠 Use Case: Who has access which access level to which connection reference?

In the last blog, Marie gave Marvin access to a connection reference via Flow.


Now Marvin asks himself:

“How can I actually check who has access to this line – and whether I really have the necessary permissions?”

And Marie wants to make sure that no one accidentally has more rights than necessary .


🧩 The solution: principalobjectaccess + systemuser + Power Automate

Any explicitly granted access to a Dataverse row is stored in the principalobjectaccessset table – also known as the POA (Principal Object Access) table .


These POA entries contain:

Field

Meaning

principalid

Who has access (user or team)

objectid

Which data set

accessrightsmask

Which rights (bitmasked)

🔧 This is what our flow looks like – in detail

The flow starts via Power Apps with a Dataverse ID as input (e.g. an ID from the Connection Reference table).



Step 1: FetchXML with Join on Systemuser

We use a List rows action with this FetchXML query on the table " principalobjectaccessset "

Note: This table is usually not found through the normal search function, so you must enter the value manually. For details, see: https://www.itaintboring.com/dynamics-crm/how-to-verify-principle-object-access-directly-from-the-flow/


💡 Advantage: We get the user's real name (full name) straight away.

Step 2: Select Action – Select important columns & translate AccessMask

The output of the list rows is processed via Parse JSON and then translated in a Select action .


We use an If/Else chain to translate accessrightsmask into plain text:

if(equals(item()?['accessrightsmask'],0),'No access',
if(equals(item()?['accessrightsmask'],1),'Read only',
if(equals(item()?['accessrightsmask'],3),'Read and Write',
if(equals(item()?['accessrightsmask'],5),'Read and Append',
if(equals(item()?['accessrightsmask'],7),'Read, Write, Append',
if(equals(item()?['accessrightsmask'],23),'Read, Write, Append, AppendTo',
if(equals(item()?['accessrightsmask'],262145),'Read, Share',
if(equals(item()?['accessrightsmask'],262147),'Read, Write, Share',
if(equals(item()?['accessrightsmask'],262151),'Read, Write, Append, Share',
if(equals(item()?['accessrightsmask'],262167),'Read, Write, Append, AppendTo, Share',
if(equals(item()?['accessrightsmask'],65539),'Read, Write, Delete',
if(equals(item()?['accessrightsmask'],65559),'Read, Write, Delete, Append, AppendTo',
if(equals(item()?['accessrightsmask'],589847),'Read, Write, Delete, Append, Assign',
if(equals(item()?['accessrightsmask'],851991),'Read, Write, Delete, Append, Assign, Share','Other'))))))))))))))

Disclaimer:

It's certainly not perfect or complete, but it was enough for us to query the most important access rights and make them human-readable. We limited ourselves to 14 common combinations – otherwise, the function wouldn't save.


🧪 Example output (JSON)

[

{

"fullname": "Marvin Neumann",

"accessrightsmask": 65559,

"accessrightsmask_readable": "Read, Write, Delete, Append, AppendTo"

},

{

"fullname": "Marie Hoffmann",

"accessrightsmask": 1,

"accessrightsmask_readable": "Read only"

}

]


📱 Step 3: View in Power Apps

The flow returns the JSON directly to Power Apps.

There you can load it into a collection using ParseJSON() and ClearCollect():




Display in Power Apps interface

Which user has which access rights to which connection reference?


🔗 Useful resources

 
 
 

Comments


bottom of page