Recently after upgrade of our Dynamics 365 CE from 8.2 to 9.1, when the System Administrator tried importing the solution (managed), he got the below error
You do not have the necessary privileges to import security roles. : Microsoft.Crm.CrmSecurityException: SecLib::CheckPrivilege failed. User: e7282250-7d82-e711-80df-1458d0431690, PrivilegeName: prvWriteRole, PrivilegeId: bd123e14-17ba-40f6-8d8b-18f4bffa7e50, Required
The error message is quite weird, first as we have never got this error earlier and here it was System Administrator user who was importing.
We tried importing the solution with the using another System Adminstrator account and it worked for that other user.
Hope it helps..
In theory, requesting the backup of the online database seems very easy and straightforward. We basically need to raise a support ticket with Microsoft and provide the following details.
SQL Version – Standard or Enterprise
SQL Year of the version. In our case it was (Microsoft SQL Server 2016 (SP1) (KB3182545) – 13.0.4001.0 (X64) Oct 28 2016 18:17:30 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows Server 2016 Datacenter 6.3 <X64> (Build 14393)
Global Admin E-mail Address – to who the backup will be shared.
We had requested the same, some 3 weeks back. In our case, the Database size of our production was around 600 GB out of which 200 GB were occupied by Audit Data. For some business-specific reason, we wanted to have the backup of Audit Data with us before we delete it. Now, this Audit has a separate story with it, when we tried deleting it from UI we got the SQL Time Out issue and on raising the support ticket when Support Team tried the same through back end it, resulted in our Production Server being down briefly for few minutes. We also tried to take the back up through 3rd party tools using SSIS, however again we ran into some issue where the tool was not able to pull the Audit Data for few of the entities.
Well to cut the story short, it is around 21 days after we raised the request, and we are yet to receive the backup of our production database, we have been told that support team is actively working on it and it is because of the large size of the organization.
Will keep posting the update on the backup and the Audit deletion.
The purpose of this blog post was to share that certain things might seem straightforward and would have taken maximum few hours, could still run into issues and challenges causing delays. So, when we plan for it we need to aware of these factors as well.
Hope it helps..
With version 9.0 of Dynamics 365 CE we now have Online Admin API that supports the following operations like Create, Retrieve, Delete, Backup and Restore instances. The user needs to have the Global Administrator or Service Administrator role in the Office 365 tenant to perform these operations.
As a first step we need to register the application with Azure Active Directory.
and get the values for
Client Id and Authority.
Get the Service URL here
Sharing a sample code which can be used to retrieve all the instances in a specific tenant.
The sample code: –
public class MySampleApp
private const string Resource = "https://admin.services.crm.dynamics.com/";
// username and password
private const string UserName = "username.onmicrosoft.com";
private const string Password = "password";
// client id and authority of the application registered
private const string ClientId = "b2c5028d-57e6-4df7-9940-3243214948b";
private const string Authority = "https://login.microsoftonline.com/3432432e2-5fbe-4b78-a55a-bcb342d4f859/";
private static AuthenticationResult _authResult;
private static void Main(string args)
var authContext = new AuthenticationContext(Authority, false);
var credentials = new UserCredential(UserName, Password);
// Get the token
_authResult = authContext.AcquireToken(Resource, ClientId, credentials);
Task.WaitAll(Task.Run(async () => await GetInstances()));
private static async Task GetInstances()
var httpClient = new HttpClient
BaseAddress = new Uri(Resource),
Timeout = new TimeSpan(0, 2, 0)
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer",
var retrieveResponse =
var jRetrieveResponse =
var result = JArray.Parse(jRetrieveResponse);
foreach (var data in result)
Console.Write("Id " + data["Id"] + "\nUnique Name " + data["UniqueName"]);
The other properties: –
We recently upgraded our Dev and Test environment to V 9.0.
While importing a solution from Dev to Test which had SiteMap we got the below issue.
“The SiteMapName in the AppModuleSiteMap is null or empty”
It turns out that the following tags were required and were missing in the Customization.xml
We added that tag and were able to import the solution successfully.
Interestingly if we export the same solution from Test and search for this tag, it is again missing, however, we can see the following XML section added there
This section was not there in dev’s sitemap.
Hope it helps..
Recently we had a requirement to delete the Account record without deleting the associated Contact records.
If we try deleting the account record we’d get the following message box
The relationship definition can’t be updated as well to achieve this
So, we wrote a plugin on the pre-validation stage of pre-delete event of Account, which will retrieve and loop through all the child contact records and set its parent customer field as null.
In case of pre-operation the child records were not available.
public void Execute(IServiceProvider serviceProvider)
ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
IPluginExecutionContext pluginContext = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService organizationService = serviceFactory.CreateOrganizationService(pluginContext.UserId);
EntityReference targetEntity = (EntityReference)pluginContext.InputParameters["Target"];
QueryExpression getContacts = new QueryExpression("contact");
getContacts.Criteria.AddCondition(new ConditionExpression("parentcustomerid", ConditionOperator.Equal, targetEntity.Id));EntityCollection allContacts = organizationService.RetrieveMultiple(getContacts);foreach (Entity contact in allContacts.Entities)
Entity contactToBeUpdated = new Entity("contact");
contactToBeUpdated.Id = contact.Id;
contactToBeUpdated.Attributes["parentcustomerid"] = null;
Another practical scenario
Hope it helps..
Below are the most useful tools à
Install the plugin, connect to your organization and click on Retrieve Jscript Webresources, it will list all the JScript Web resources found.
Click on Scan
It will list down all the issues found.
One common change that we need to do across all our JScript is to pass the ExecutionContext from Form as well as Fields (and Ribbon) events. Script Finder makes it extremely easy to find them out.
Click on Find Scripts usage and it will generate a report with all the details as shown below
Now we can follow the generated report and directly make the change to the form, field, and ribbon instead of searching for it manually.
Happy Upgrading !!