Introduction
In Dynamics 365 we can update security role of Form through customization. You have to just follow the given steps:
Go to Setting → Customization → Customize the System → Components → Entities → Forms
Open Form and click on “Enable Security Roles” in Home tab to Assign Security Role to selected Form.
However, in few cases you can also assign security role to a Form programmatically.
In this blog, we will discuss about how to assign security role to a Form programmatically.
The steps to assign security role programmatically are as follows:-
- Retrieve Forms from CRM
//object of form Collection
EntityCollection forms = new EntityCollection();
//Query Expression Object
QueryExpression queryExp = null;
queryExp = new QueryExpression
{
EntityName = “systemform”,
ColumnSet = new ColumnSet(“formid”, “type”, “formxml”, “name”)
};
FilterExpression conditions = new FilterExpression(LogicalOperator.And);
conditions.Conditions.Add(new ConditionExpression(“name”, ConditionOperator.Equal, “Account”));
queryExp.Criteria.AddFilter(conditions);
//Retrieve form collection
forms = _service.RetrieveMultiple(queryExp);
- Create formXML (XDocument) and DisplayCondition(XElement) objects
//parse formXML into XDocument
XDocument formXML = XDocument.Parse(forms.Entities[0].Attributes[“formxml”].ToString());
Note: In this code we have only used one Form, but you can also perform same operation for multiple Forms using for loop or for each statement.
//Get displayCondtion element from form XML if Exist
XElement displayCondition = formXML.Descendants(“DisplayConditions”).FirstOrDefault();
//Create new displayCondition Object
XElement displayConditionAttribute;
- Retrieve role details from CRM
//Create role collections
string[] roleNames = { “Activity Feeds”, “Sales Manager” };
Note: You can pass collection of Roles dramatically through Input Parameter in Plugin (using SecureConfig and UnsecureConfig)/ Assembly (Input parameters)
string condition = string.Empty;
//Create role condition
if (roleNames!= null)
{
foreach (string role in roleNames)
{
condition = condition + $”<condition attribute = ‘name’ operator= ‘eq’ value='{role}’/>”;
}
}
string fetchXML = string.Empty;
fetchXML = “<fetch version=’1.0′ output-format=’xml-platform’ mapping=’logical’ distinct=’false’>” +
“<entity name=’role’>” +
“<attribute name=’roleid’/>” +
“<filter type=’or’>” + condition + “</filter>” +
“</entity>” +
“</fetch>”;
var query = new FetchExpression(fetchXML);
EntityCollection roles = new EntityCollection();
//Collection of Role
roles = _service.RetrieveMultiple(query);
- Check weather display condition exists or not. If not then create new display condition and update it otherwise, just update the existing display condition.
//Check DispalyConditon Exist or not
if (displayCondition != null)
{
displayConditionAttribute = formXML.Descendants(“DisplayConditions”).FirstOrDefault();
}
else
{
//create display condition
displayConditionAttribute = new XElement(“DisplayConditions”);
//to set a form as follbackform
displayConditionAttribute.Add(new XAttribute(“FallbackForm”, true));
//set form order
displayConditionAttribute.Add(new XAttribute(“Order”, “1”));
XElement form = formXML.Descendants(“form”).FirstOrDefault();
//add display condition on form element
form.LastNode.AddAfterSelf(displayConditionAttribute);
//get display condition on form
displayConditionAttribute = formXML.Descendants(“DisplayConditions”).FirstOrDefault();
}
//specify that the form is visible to everyone
XElement Everyone = new XElement(“Everyone”);
//add Everyone element into displaycondition
displayConditionAttribute.Add(Everyone);
Note: If you want to display Form to everyone then use the above code. If not then use the below code.
//specify that the security role to view a form
if (roles != null && roles.Entities.Count > 0)
{
foreach (Entity role in roles.Entities)
{
string roleId = “{” + role.GetAttributeValue<Guid>(“roleid”).ToString() + “}”;
XElement Role = new XElement(“Role”);
Role.Add(new XAttribute(“Id”, roleId));
//add Role element into displaycondition
displayConditionAttribute.Add(Role);
}
}
//Update form XML
forms.Entities[0][“formxml”] = formXML.ToString(SaveOptions.DisableFormatting);
//Update Form
_service.Update(forms.Entities[0]);
Publish customization programmatically after updating Form.
You can use the above code in plugin/assembly and any other application.
Conclusion
We can assign one or more security role for more than one CRM Form programmatically.