• Dynamics CRM 365 实现某个人没有权限查看记录,但是通过插件共享的方式,成功让他能看


    Dynamics CRM 365 实现某个人没有权限查看记录,但是通过插件共享的方式,成功让他能看

    步骤1,在pre共享给当前人

    using System;
    using Microsoft.Crm.Sdk.Messages;
    using Microsoft.Xrm.Sdk;
    using Microsoft.Xrm.Sdk.Client;
    using Microsoft.Xrm.Sdk.Query;
    using Newtonsoft.Json;
    
    namespace SCWCRMSolution.Plugin.authorize
    {
        /// <summary>
        /// 授权产品查询后:增加医院对应授权的查看权限:通过共享实现
        /// </summary>
        public class scw_authorize_retrieve_pre : IPlugin
        {
    
            public void Execute(IServiceProvider serviceProvider)
            {
                ITracingService tracer = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
                IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService service = factory.CreateOrganizationService(context.UserId);
                IOrganizationService adminService = factory.CreateOrganizationService(null);
                try
                {
                    if (context.Depth > 1)
                    {
                        return;
                    }
    
                    if (context.MessageName.ToLower() == "retrieve")
                    {
                        if (context.InputParameters.Contains("Target"))
                        {
                            var enfer = (Microsoft.Xrm.Sdk.EntityReference)context.InputParameters["Target"];
    
                            #region 将当前记录共享给当前人
                            bool isNeedShare = true;  //是否需要共享
                            RetrieveSharedPrincipalsAndAccessRequest shareRequest = new RetrieveSharedPrincipalsAndAccessRequest();
                            shareRequest.Target = enfer;
                            RetrieveSharedPrincipalsAndAccessResponse shareResponse =(RetrieveSharedPrincipalsAndAccessResponse)adminService.Execute(shareRequest);
                            if (shareResponse.PrincipalAccesses != null)
                            {
                                foreach (PrincipalAccess pa in shareResponse.PrincipalAccesses)
                                {
                                    if (pa.Principal.Id.ToString() == context.UserId.ToString())
                                    {
                                        isNeedShare = false;
                                    }
                                }
                            }
    
                            if (isNeedShare)
                            {
                                var request = new GrantAccessRequest
                                {
                                    PrincipalAccess = new PrincipalAccess
                                    {
                                        AccessMask = AccessRights.ReadAccess | AccessRights.AppendAccess | AccessRights.AppendToAccess,
                                        Principal = new EntityReference("systemuser", context.UserId)
                                    },
                                    Target = enfer
                                };
                                adminService.Execute(request);
    
                                Entity SysEn = new Entity("systemuser", context.UserId);
                                SysEn["scw_authorizeid"] = enfer.Id.ToString();   //记录手动共享的,在post取消共享
                                adminService.Update(SysEn);
                            }
    
                            #endregion
                             
                        }
                         
                    }
                }
                catch (Exception e)
                {
                    throw new InvalidPluginExecutionException(e.Message);
                }
            }
    
        }
    }
    View Code

    步骤2:在post取消共享给当前人

    using System;
    using Microsoft.Crm.Sdk.Messages;
    using Microsoft.Xrm.Sdk;
    using Microsoft.Xrm.Sdk.Client;
    using Microsoft.Xrm.Sdk.Query;
    using Newtonsoft.Json;
    
    namespace SCWCRMSolution.Plugin.authorize
    {
        /// <summary>
        /// 授权产品查询后:增加医院对应授权的查看权限
        /// </summary>
        public class scw_authorize_retrieve_post : IPlugin
        {
    
            public void Execute(IServiceProvider serviceProvider)
            {
                ITracingService tracer = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
                IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService service = factory.CreateOrganizationService(context.UserId);
                IOrganizationService adminService = factory.CreateOrganizationService(null);
                try
                {
                    if (context.MessageName.ToLower() == "retrieve")
                    {
                        if (context.OutputParameters.Contains("BusinessEntity"))
                        {
                            var en = (Microsoft.Xrm.Sdk.Entity)context.OutputParameters["BusinessEntity"];
    
                            #region 将当前记录共享取消给当前人
                            bool isNeedDeleteShare = false;  //是否需要取消共享
                            RetrieveSharedPrincipalsAndAccessRequest shareRequest = new RetrieveSharedPrincipalsAndAccessRequest();
                            shareRequest.Target = en.ToEntityReference();
                            RetrieveSharedPrincipalsAndAccessResponse shareResponse = (RetrieveSharedPrincipalsAndAccessResponse)adminService.Execute(shareRequest);
                            if (shareResponse.PrincipalAccesses != null)
                            {
                                foreach (PrincipalAccess pa in shareResponse.PrincipalAccesses)
                                {
                                    if (pa.Principal.Id.ToString() == context.UserId.ToString())  //存在共享记录
                                    {
                                        //判断该共享记录是不是pre共享的
                                        Entity sysEn = adminService.Retrieve("systemuser", context.UserId, new ColumnSet("systemuserid", "scw_authorizeid"));
                                        if (sysEn != null && sysEn.Contains("scw_authorizeid")
                                            && !string.IsNullOrWhiteSpace(sysEn.GetAttributeValue<string>("scw_authorizeid")))
                                        {
                                            isNeedDeleteShare = true;
                                        }
    
                                    }
                                }
                            }
    
                            if (isNeedDeleteShare)
                            {
                                //取消共享
                                var request = new RevokeAccessRequest
                                {
                                    Revokee = new EntityReference("systemuser", context.UserId),
                                    Target = en.ToEntityReference()
                                };
                                service.Execute(request);  //这里不能用管理员,不然报:Only owner can revoke access to the owner.
    
                                //标记已经移除
                                Entity SysEn = new Entity("systemuser", context.UserId);
                                SysEn["scw_authorizeid"] = null;
                                adminService.Update(SysEn);
                            }
                            #endregion
                        }
                    }
                }
                catch (Exception e)
                {
                    throw new InvalidPluginExecutionException(e.Message);
                }
            }
    
        }
    }
    View Code
  • 相关阅读:
    计时器C#
    MySQL Database Command Line Client
    C#小爬虫,通过URL进行模拟发送接收数据
    C#导入导出Excele数据
    正则表达式动态分隔符
    C#中的枚举
    C#中的ToString格式大全
    C# 序列化与反序列化
    C# 对xml进行操作
    时间标签DateTime
  • 原文地址:https://www.cnblogs.com/parkerchen/p/16276729.html
Copyright © 2020-2023  润新知