[英]Dynamics CRM 2011 - Block Creation of Entity via Plugin
問題:我們使用CRM for Outlook插件自動記錄我們的支持電子郵件,但員工之間的內部電子郵件(其中一些包含敏感信息)也會被記錄。
理想的解決方案:我正在嘗試編寫一個事件前(“創建電子郵件”消息)插件來阻止內部電子郵件的自動記錄,但(顯然)阻止消息被執行的唯一方法是拋出異常事件前階段,但這總是導致在outlook中顯示錯誤消息(我們顯然不能擁有)。 根據文檔,只有“InvalidPluginExecutionExeception”應該向用戶顯示消息,但事實並非如此,因為所有異常都會導致用戶的Outlook應用程序中出現錯誤消息。
潛在的解決方案:還有一條“CheckPromoteEmail”消息(根據文檔)確定是否應該將電子郵件提升為CRM(我假設“提升為CRM”意味着“使電子郵件實體存儲在CRM中”) ,但我在上下文中找不到任何可以告訴CRM不推廣電子郵件的內容。 是否有一些標記隱藏在我可以設置的上下文中,或者某種方式來放置電子郵件,以便CRM自己的邏輯決定不存儲它?
解決方法解決方案:我知道( 此處提到)的唯一其他解決方案,只是在創建電子郵件后清除主題和內容,但我寧願停止創建電子郵件,而不是編輯或刪除經過時間和資源浪費創建電子郵件。
是否有一種干凈的方法來阻止插件的操作? 或者從哪里來? 如果沒有,有誰知道為什么微軟不提供此功能? 如果操作失敗,他們已經具備了強大的回滾功能,他們為什么不給我一種方法來調用回滾?
這是我的代碼,以防它回答我的問題:
public class InternalEmailFilter : IPlugin
{
void IPlugin.Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext _context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
Entity e = (Entity)_context.InputParameters["Target"];
bool shouldStore = ShouldStoreInCRM(e);
if (shouldStore == false)
{
throw new Exception(); //attempting to stop the operation without an InvalidPluginExecutionException, but still results in error message to user
}
}
protected bool ShouldStoreInCRM(Entity e)
{
List<Entity> parties = new List<Entity>();
var atttributes = e.Attributes;
if (atttributes.ContainsKey("to") == true) parties.AddRange((atttributes["to"] as EntityCollection).Entities);
if (atttributes.ContainsKey("from") == true) parties.AddRange((atttributes["from"] as EntityCollection).Entities);
if (atttributes.ContainsKey("cc") == true) parties.AddRange((atttributes["cc"] as EntityCollection).Entities);
if (atttributes.ContainsKey("bcc") == true) parties.AddRange((atttributes["bcc"] as EntityCollection).Entities);
foreach (Entity p in parties)
{
if (p.LogicalName == "activityparty" && p.Attributes.ContainsKey("addressused") == true && p.Attributes["addressused"] != null)
{
if (p.Attributes["addressused"].ToString().ToLower().Contains("@ourdomain.com") == false)
{
return true; //someone connected in the email is not an employee, store the email
}
}
}
return false; //everyone was an employee, do not store
}
}
經過大量的血,汗和淚,我終於想出了如何做到這一點:
您必須在“創建電子郵件”消息上使用異步事件后插件,以便在創建CRMService后從數據庫中刪除該電子郵件。 它必須是異步的,因為您需要等待CRM完成創建並“釋放”實體才能刪除它。 否則,該過程會掛起。
任何這些解決方案都會更好,但作為參考,你不能:
郁悶了。
對不起,解決方法是您唯一的選擇。 通過插件停止操作的唯一方法是拋出異常。 為什么微軟這樣做? 我假設他們不希望插件無聲地失敗。
至於解決方法,你應該在進入數據庫之前清除主題和正文,方法是在事件前插件中清除它們,然后在事件后異步插件中清理記錄本身。 這樣敏感信息也不會進入任何審核日志。
最后,查看DeliverPromoteEmail
而不是CreateEmail
。 DeliverPromoteEmail
是Outlook用於創建跟蹤的電子郵件的內容。 這樣,您仍然可以在CRM UI中創建不會觸發此插件的電子郵件(如果需要)。
編輯 CheckPromoteEmail
僅查看主題中的跟蹤令牌(和/或電子郵件標題中的MessageID)以確定是否應跟蹤電子郵件,因此它也沒有用處。
您可以選擇在個人設置中選擇跟蹤所有電子郵件,電子郵件回復CRM電子郵件(已經跟蹤的電子郵件),來自記錄(帳戶等)的電子郵件以及已啟用電子郵件的記錄中的電子郵件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.