簡體   English   中英

Dynamics CRM 2011 - 通過插件阻止實體創建

[英]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完成創建並“釋放”實體才能刪除它。 否則,該過程會掛起。

任何這些解決方案都會更好,但作為參考,你不能:

  1. 在事件前拋出異常以取消創建/提升電子郵件操作,而不向用戶顯示錯誤消息或對其Outlook造成嚴重破壞。 即使只有InvlaidPluginExectuionExecption應該向用戶顯示消息,所有異常都會向用戶顯示錯誤消息。
  2. 阻止向CRM發送電子郵件。 CheckPromoteEmail消息事件前(令人驚訝地)沒有提供有關可能被提升的消息的信息(因此沒有數據可用於決定是否應該提升消息)並且沒有任何可用來告訴CRM不提升消息。 並且,如果您使用事件前/后事件並嘗試使用輸出參數並在那里更改ShouldPromote標志,則它什么都不做。
  3. 在為其創建實體之前清除電子郵件的正文內容 - 您在事件前對正文內容所做的任何更改都不會保留在執行上下文中,並且在核心操作開始時會丟失。

郁悶了。

對不起,解決方法是您唯一的選擇。 通過插件停止操作的唯一方法是拋出異常。 為什么微軟這樣做? 我假設他們不希望插件無聲地失敗。

至於解決方法,你應該進入數據庫之前清除主題和正文,方法是事件前插件中清除它們,然后在事件后異步插件中清理記錄本身​​。 這樣敏感信息也不會進入任何審核日志。

最后,查看DeliverPromoteEmail而不是CreateEmail DeliverPromoteEmail是Outlook用於創建跟蹤的電子郵件的內容。 這樣,您仍然可以在CRM UI中創建不會觸發此插件的電子郵件(如果需要)。

編輯 CheckPromoteEmail僅查看主題中的跟蹤令牌(和/或電子郵件標題中的MessageID)以確定是否應跟蹤電子郵件,因此它也沒有用處。

您可以選擇在個人設置中選擇跟蹤所有電子郵件,電子郵件回復CRM電子郵件(已經跟蹤的電子郵件),來自記錄(帳戶等)的電子郵件以及已啟用電子郵件的記錄中的電子郵件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM