How to – use Associate Entities and Disassociate Entities Event in Audit to check Security Roles changes in Dynamics 365

Let us assign the System Customizer role to the user John Denver save it and then remove the same.

Let us check the Audit records generated for it.

We can see 2 records with event Associate Entities and Disassociate Entities with security role name – System Customizer created in the Audit Summary View as shown below.

Here the entity will be Security Role.

Let us assign 2 more roles to the user.

As expected we can see 2 records, with event Associate Entities.

Now let us see what happens when we update the Business Unit of the user. If you remember, assigning a new business unit removes all the existing security roles of the user.

Well this can be controlled now through DoNotRemoveRolesOnChangeBusinessUnit
setting –

Here we have changed the business unit of user 2, he had salesperson, system administrator, and system customizer roles assigned.

We can see the business unit change is recorded.

From Audit History of the user record – we can check all the Associate Entities and Disassociate Entities record that will give us the details of the previous Security Roles user was having before the Business Unit change.



Other related Audit articles –

Hope it helps..


How to – Delete Audit data by entity / table, date, user access, and specify retention duration – updates in Dataverse (Dynamics 365 / CRM)

Recently we saw a new update in our sandbox environments with regards to Audits.

Login to Power Platform Admin Center, select an environment.

We can see a new section Auditing added.

Click on Delete logs allows us to –

  • Delete logs by Table

We can select the tables there.

  • Delete only access logs data.
  • Delete logs up to the selected date.

And now we can also manage or specify the retention duration for the audit log.

These are very useful updates to the Audit feature in the platform which more or less have been similar since CRM 3.0 days.

Check other posts on Audit –

How to – Use RetrieveAttributeChangeHistoryRequest to get audit data for an attribute (Dataverse/ Dynamics 365/ CRM) – Nishant Rana’s Weblog

Hope it helps..


How to – Use RetrieveAttributeChangeHistoryRequest to get audit data for an attribute (Dataverse/ Dynamics 365/ CRM)

We can use RetrieveAttributeChangeHistoryRequest to get the change history of a particular field / attribute of a record.

We need to set the Target and the AttributeLogicalName property of the request.

AuditDetails records of the RetrieveAttributeChangeHistoryResponse contains the detail of the audit records.

The Audit History records in CRM- 

AttributeAuditDetail contains the details of the changes made on the field’s value. It contains property like – objectid, userid, operation etc. as well as new value and the old value as shown below.

Sample Code (C#) 

 string ConnectionString = "AuthType = OAuth; " +
                  "AppId=51f81489-12ee-4a9e-aaae-a2591f45987d; " +
                  "; " +
                  "Password=*******; " +
                  "RedirectUri=app://58145B91-0C36-4500-8554-080854F2AC97;" +
                  "Url =;";

            CrmServiceClient svc = new CrmServiceClient(ConnectionString);

            if (svc.IsReady)

                var attributeChangeHistoryReq = new RetrieveAttributeChangeHistoryRequest();

                attributeChangeHistoryReq.Target =
                    new EntityReference("incident", new Guid("0a9f62a8-90df-e311-9565-a45d36fc5fe8"));
                attributeChangeHistoryReq.AttributeLogicalName = "prioritycode";

                var attrChangeResponse = (RetrieveAttributeChangeHistoryResponse)svc.Execute(attributeChangeHistoryReq);
                var auditDetailCollection = attrChangeResponse.AuditDetailCollection;

                foreach (var auditDetails in auditDetailCollection.AuditDetails)
                    // Type =  AttributeAuditDetail, AuditDetail, 
                    var type = auditDetails.GetType();

                    if (type == typeof(AttributeAuditDetail))
                        var attributeDetail = (AttributeAuditDetail)auditDetails;

                        var userName = attributeDetail.AuditRecord.GetAttributeValue<EntityReference>("userid").Name;
                        var operation = attributeDetail.AuditRecord.FormattedValues["operation"];
                        var action = attributeDetail.AuditRecord.FormattedValues["action"];
                        var createdOn = attributeDetail.AuditRecord.GetAttributeValue<DateTime>("createdon");
                        var newValue = attributeDetail.NewValue.FormattedValues["prioritycode"];
                        var oldValue = attributeDetail.OldValue?.FormattedValues["prioritycode"];


Check other posts on Audit

Hope it helps..


Audit Entity / Table – Few key points (Dynamics 365 / Power Apps)

In the earlier post we looked at different ways of extracting Audit History data.

Extract Audit History

We can use Microsoft 365 Security and Compliance Center for the same, though it is limited to the Production environment only.

Then we have Audit History Extractor, and we can also write SSIS Packages as well as Custom Code.

Let us just revisit some of the key points with regards to the Audit entity.

  • Do we have the Audit entity available for Advanced Find? >> No.

  • Do we have it available inside Report Wizard? >> No.

  • Can we write SSRS Report against the Audit entity using the TDS endpoint?

Let us create the Data Source.

Select the authentication as Active Directory Password Authentication for the TDS endpoint.

Enter the database name manually.

The final connection string >>

Data;Initial;Encrypt=True;TrustServerCertificate=False;Authentication=”Active Directory Password”

Within SQL4CDS the following query works

However, the same query doesn’t work inside SSRS.

It will give the below error message >>

Table audit is not available for reports

  • Do we have the Audit entity in the Power BI Dataverse connector? >> No

However, we can use the OData endpoint to create the report against the Audit entity.

  • Do we have the Audit entity available in Azure Synapse Link (Export to Data Lake)? >> No

How to set up Azure Synapse Link >>

  • Cannot we write a Fetch XML Based SSRS report?

Writing a Fetch XML based-report would be challenging, because of the way information is saved.

Check the below article to understand how the audit table stores the information.

  • How about SQL Based SSRS Report if we are using SQL – for On-Premise?

Refer to the below article that provides the steps to do so.

Hope it helps..


Activity Logging – Dynamics 365 Apps

Microsoft 365 Security and Compliance Center – provides easy access to the data and the tools to manage the compliance need of an organization, and also can be used to review the different data processing activities within Dynamics 365 Customer Engagement apps.

It required Microsoft 365 E3 or E5 subscription and is only available for Production environments.

The events logged are –

  • CRUD, Export to Excel, SDK Calls.
  • CRUM and backend activities performed by the support engineer.
  • Report – viewed, exported, multimedia assets shown in the Report

For this first Auditing needs to be enabled in the environment.

Navigate to Settings > Administration > System Settings > Auditing Tab

Navigate to Compliance Center

Search > Audit Search Log and
Turn on auditing.

To try the new experience within the Compliance center

After around 1 hour or so, the settings got enabled.

As specified Office 365 logs are being prepared, if we try searching we’d get blank results

Below are the list of Dynamics 365 and Power Apps activities that can be tracked

Around after 3 hours or so – we saw the results appearing.

Export has 2 options –

Save loaded results –

Download all results –

At the same time there we 51 records in Audit Summary View.

Apart from searching for an audit log, we can also define an audit retention policy as shown below

Get the sample files here –

Get all the details here

Hope it helps..


How to – Use RetrieveRecordChangeHistoryRequest to get Audit Detail in Dynamics 365 CE

Just sharing a sample code to retrieve the Audit Detail using RetrieveRecordChangeHistoryRequest.

RetrieveRecordChangeHistoryRequest changeRequest = new RetrieveRecordChangeHistoryRequest();
changeRequest.Target = new EntityReference("entitySchemaName", "entityId"));
RetrieveRecordChangeHistoryResponse changeResponse =

AuditDetailCollection auditDetailCollection = changeResponse.AuditDetailCollection;

foreach (AttributeAuditDetail attrAuditDetail in auditDetailCollection.AuditDetails)
var auditRecord = attrAuditDetail.AuditRecord;

Console.WriteLine("Entity: " + ((EntityReference)auditRecord.Attributes["objectid"]).LogicalName);
Console.WriteLine("Operation: " + auditRecord.FormattedValues["operation"]);
Console.WriteLine("Action: " + auditRecord.FormattedValues["action"]);

var newValueEntity = attrAuditDetail.NewValue;

foreach(var attrNewValue in newValueEntity.Attributes)
Console.WriteLine("New Key: " + attrNewValue.Key + "New Value: " + attrNewValue.Value);

var oldValueEntity = attrAuditDetail.OldValue;

foreach (var attrOldValue in oldValueEntity.Attributes)
Console.WriteLine("Old Key: " + attrOldValue.Key + "Old Value: " + attrOldValue.Value);

The record whose Audit History we are retrieving :

Output :

AuditDetail.AuditRecord :

AuditDetail.OldValue n NewValue:

Hope it helps..

%d bloggers like this: