Passing configuration data using Plug-in registration tool (Secured vs. Unsecured)
Reference(https://rajeevpentyala.com/tag/plug-in/)
- CRM plugin registration tool contain “Unsecure & Secure” configuration sections while registering a “Step”
- We can pass configuration data and can be used in the plug-in logic.
Secured vs. Unsecured
Below are key differentiations between Secured and Unsecured data configuration
- Access
- Data passed through “Unsecure” section is PUBLIC (i.e., It can be read by any user in CRM).
- Only users with “System Administrator” role have access to the data passed through “Secure” configuration section
- Storage
- “Unsecure” config data will be stored along with the Plugin ‘Step’ registration information (i.e., In SdkMessageProcessingStep entity)
- “Secure” config data will be stored in a separate entity named “SdkMessageProcessingStepSecureConfig”
- Only “System Administrator” has Read access on this entity, hence only users with ‘Sys Admin’ role can access this data
- Both “Secured & Unsecured” configuration data stored as “Plain text” in DB
- Outlook Sync
- “Unsecured” configuration data is downloaded to the user’s computer when they go offline making it Unsecure
- “Secured” configuration data is NOT downloaded to User’s Computer when they go Offline
How to read Configuration data in Plug-in
In our plug-in class, we can define a constructor that passes two parameters (i.e., unsecure configuration and secure configuration)
public class AccountCreateHandler: IPlugin{public AccountCreateHandler(string unsecure, string secure){// Do something with the parameter strings.}public void Execute(IPluginExecutionContext context){// Do something here.}}
Note :- If you want to read “Secure” configuration in the plug-in code, either change the user context in plugin registration as “CRM administrator ” or Impersonate to “CRM Administrator” role user in the code
Plug-ins in CRM 2011 – Useful points
Plug-in stages
- Pre validation
- Registered Plug-in run before the form is validated
- Useful if you want to implement business logic before the actual validation starts. i.e., Changes made in plug-in won’t be saved if the validation of the main system plugins complain because the changes are outside the database transaction.
- Ex – Some “delete” plug-ins. Deletion cascades happen prior to pre-operation, therefore if you need any information about the child records, the delete plugin must be pre-validation.
- Pre -operation
- After validation and before the values are saved to the database
- Post operation
- Plugin will run after the values have been inserted/changed on the database
Database Transactions in Plug-Ins
- Plug-ins may or may not execute within the database transaction
- You can check if the plug-in is executing in-transaction by reading the ‘IsInTransaction‘ property of IPluginExecutionContext
- Stages 20 and 40 are part of the database transaction while stage 10 and 50 may be part of the transaction
- If plugin throws an exception, every action done during the transaction will be rollback
Few more Points
- Whether a plug-in executes synchronously or asynchronously, there is a 2 minute time limit imposed on the execution of a (message) request.
- If the execution of your plug-in logic exceeds the time limit, a Timeout exception is thrown
- If a plug-in needs more processing time than the 2 minute time limit, consider using a workflow or other background process
- ‘Pre-operation’ operations that CRM will do will not be carried out in pre-validation stage.
- If you are deleting a record that has many-to-many relationship records with another entity; these relationship records will still be available in pre-validation stage, but not in pre-operation stage.
- “Target” entity (i.e., pluginContext.InputParameters[“Target”])
- It’s the entity on which plug-in registered
- It only contains “dirty” attributes. if you convert to early bound, the value of the unchanged attribute will be
null
Useful MSDN article
:)
Categories:CRM 2011, Plug-InsTags:CRM 2011, Plug-in, pre validate, stage, Target, transaction
Fetching user security roles using Linq in CRM 2011 Plug-in’s
Hi,
Below is the sample code to fetch the User’s security roles based on the “User Id” in the Plug-in’s using Linq
/// <summary>/// Returns the list of User security role names/// </summary>private List<string> GetUserRoles(IOrganizationService service, Guid userId) {// Create Query Expression to fetch Role Entityvar query = new QueryExpression{// Setting the link entity condition and filter condition criteria/LinkEntities ={new LinkEntity{LinkFromEntityName = “role”,LinkFromAttributeName = “roleid”,LinkToEntityName = “systemuserroles”,LinkToAttributeName = “roleid”,LinkCriteria = new FilterExpression{FilterOperator =LogicalOperator.And,Conditions ={new ConditionExpression{AttributeName = “systemuserid”,Operator = ConditionOperator.Equal,Values ={userId}}}}}},ColumnSet = new ColumnSet(true),EntityName = “role”};// Obtain results from the query expression.var userRoles = service.RetrieveMultiple(query);// Get the usre role names collectionvar roleNames = new List<string>();if (userRoles != null) {roleNames.AddRange(from entrole in userRoles.Entitiesselect entrole as Roleinto rolewhere role != null && role.RoleId != nullselect role.Name);}return roleNames;}
How do I call this method :-
- In your plug-in, pass the service and User Id as parameters to this method
public void Execute(IServiceProvider serviceProvider) {context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));var serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));var service = serviceFactory.CreateOrganizationService(context.UserId);// Get the current users Security Roles Name’sVar roleNames = GetUserRoles(service, this.context.UserId);}
Hope it helps
Categories:CRM 2011, Plug-InsTags:CRM 2011, Linq, Plug-in, role, security roles, user security roles
CRM 2011 – Team sharing in Plug in
Hi,
Below is the code to Share/Unshare a record to Team using “GrantAccessRequest“.
//Sharing a Record to Teamusing Microsoft.Crm.Sdk.Messages;private void ShareRecordToTeam(IOrganizationService service, Guid sharingRecordId, Entity objTeam){GrantAccessRequest grantRequest = new GrantAccessRequest(){Target = new EntityReference(“{Entity Name}”, sharingRecordId),PrincipalAccess = new PrincipalAccess(){Principal = new EntityReference(objTeam.LogicalName, objTeam.Id),AccessMask = AccessRights.WriteAccess}};// Execute the request.GrantAccessResponse granted = (GrantAccessResponse)service.Execute(grantRequest);}
//Unshare a record From Teamprivate void UnShareRecordFromTeam (IOrganizationService service, Guid sharingRecordId, Entity objTeam){RevokeAccessRequest revokeRequest = new RevokeAccessRequest(){Target = new EntityReference(“{Entity Name}”, sharingRecordId),Revokee =new EntityReference(objTeam.LogicalName, objTeam.Id)};// Execute the request.RevokeAccessResponse revoked = (RevokeAccessResponse)service.Execute(revokeRequest);}
You can use the same code to Share/Unshare a record to User. You just need to pass User details instead of Team like below
Principal = new EntityReference(“systemuser”, userID)
Hope it helps
Categories:CRM 2011, Plug-InsTags:Assign record to team, CRM 2011, Plug-in, Rajeev Pentyala, share to team, Team share
Sending an Email using CRM 2011 Plug In
Hi,
In one of my recent requirements, I had to send an Email using Plug-in (Late Binding). Below is the code snippet.
private void SendEmail(IOrganizationService service, Guid recieverUserId, Guid senderUserId, Guid regardingObjectId, string emailBody, string emailSubject){Entity email = new Entity();
email.LogicalName = “email”;//Set regarding object property (i.e. The entity record, which u want this email associated with)EntityReference regardingObject = new EntityReference(“{entity_name}”, regardingObjectId);
email.Attributes.Add(“regardingobjectid”,regardingObject);//Defining Activity Parties (starts)EntityReference from = new EntityReference(“systemuser”, senderUserId);EntityReference to = new EntityReference(“systemuser”,recieverUserId);//Derive from partyEntity fromParty = new Entity(“activityparty”);
fromParty.Attributes.Add(“partyid”,from);//Derive to partyEntity toParty = new Entity(“activityparty”);
toParty.Attributes.Add(“partyid”, to);EntityCollection collFromParty = new EntityCollection();
collFromParty.EntityName = “systemuser”;
collFromParty.Entities.Add(fromParty);EntityCollection collToParty = new EntityCollection();
collToParty.EntityName = “systemuser”;
collToParty.Entities.Add(toParty);email.Attributes.Add(“from”,collFromParty);
email.Attributes.Add(“to”, collToParty);//Defining Activity Parties (ends)//Set subject & body properties
email.Attributes.Add(“subject”,emailSubject);
email.Attributes.Add(“description”, emailBody);//Create email activityGuid emailID = service.Create(email);//Sending emailSendEmailRequest reqSendEmail = new SendEmailRequest();
reqSendEmail.EmailId = emailID;//ID of created mail
reqSendEmail.TrackingToken = “”;
reqSendEmail.IssueSend = true;SendEmailResponse res = (SendEmailResponse)service.Execute(reqSendEmail);}
No comments:
Post a Comment