사용자의 역할과 사업 단위를 변경하려면 365 필요한 권한의 역학 최소

나는의 Microsoft Dynamics (365) 및 전원 플랫폼 측면이 3 년 연속 역학 CRM / 비즈니스 솔루션 측면 (마이크로 소프트 MVP) 6 월 2018 년 라용은 마이크로 소프트 가장 훌륭한 전문가가 7 월 2015 엔지니어링 오전, 나는 공공 마이크로 채널 번호의 관심을 환영합니다 MSFTDynamics365erLuoYong는 회신하거나 20191218 385이 문서에 대한 접근을 용이하게 할 수 있지만, 당신은 내가 보웬 첫 번째 방에 발행 된 최신 정보를 얻을 수 있습니다, 나를 따르라!

내 이전 블로그 게시물이 역학 365 최소 권한 요구 사항을 사용하여 로그인하는 사용자 탐구하는 최소 권한에 대한을 시스템에 로그인 할 필요를하자이 역할은 사용자가 사용자의 역할과 비즈니스 단위를 변경할 수 있습니다이 역할을 할 수 있도록 구성합니다.

나는했습니다 그 전에  일반적인 데이터 서비스 최소 권한 보안 역할  솔루션은 역학 365 포스트는 분 PRIV의 역할의 이름을 가져올 것입니다 저를 소개 사용 애플 리케이션.

첫째, 우리는 역할에서 복제에 시스템 관리자 계정을 사용하여 열려있는 분 PRIV의 앱이 역할을 사용하여 [작업]> [복사 역할] 버튼을 클릭합니다.

 

역할 이름을 입력 한 다음 기본적으로 성공을 복사합니다 [OK] 버튼을 클릭, 그것은 역할을 엽니 다.

 

 일부 테스트 후, 사용자의 사업 단위 증가 역할과 필요한 사용 권한을 변경할 수 할 필요가 발견으로 다음과 같습니다 :

  • 엔티티 달력의 모든 권리는 서비스 관리 탭
  • 쓰기 권한 사용자 기업의 경영 탭, 글로벌 수준의 사용자 후 루트 비즈니스 단위의 기본 매달려은 사용자가 변경 가능성이 루트 사업부에 걸려하지 않은 것입니다 작동 입력하고 사용자 정보 요구를 글로벌 쓰기 권한을 변경할 수 있기 때문에
  • 경영 탭 보안 역할 및 글로벌 수준의 사용 권한 지정
  • Business Management Tab 的User Settings实体的写权限,全局级别
  • Customization Tab 的Activate Real-time Processes权限,全局级别,此权限为杂项权限
  • Customization Tab 的System Job实体的追加到权限,全局级别
  • Customization Tab 的System Job实体的分派权限,全局级别
  • Customization Tab 的System Job实体的读权限,全局级别
  • Customization Tab 的System Job实体的写权限,全局级别
  • Customization Tab 的Process Session实体的追加到权限,全局级别
  • Customization Tab 的Process Session实体的追加权限,全局级别
  • Customization Tab 的Process Session实体的分派权限,全局级别
  • Customization Tab 的Process Session实体的创建权限,全局级别
  • Customization Tab 的Process Session实体的删除权限,全局级别
  • Customization Tab 的Process Session实体的共享权限,全局级别
  • Customization Tab 的Process Session实体的写权限,全局级别
  • Customization Tab 的Process实体的追加权限,全局级别
  • Customization Tab 的Process实体的分派权限,全局级别
  • Customization Tab 的Process实体的创建权限,全局级别
  • Customization Tab 的Process实体的删除权限,全局级别
  • Customization Tab 的Process实体的共享权限,全局级别
  • Customization Tab 的Process实体的写权限,全局级别
  • Core Records Tab 的Report实体的读取权限,全局级别

 截图说明如下:

 

 

 

 

 

 

 

 

如果要求更改业务部门,除了系统管理员操作外,只能更改为操作者一样的业务部门的话,我这里使用插件来验证,我写了一个名称为PreSystemUserUpdate.cs的类,代码如下:

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;

namespace PluginDemo
{
    public class PreSystemUserUpdate : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            //获取日志服务
            ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            //写一些日志,方便跟踪
            tracingService.Trace($"Enter PreSystemUserUpdate on {DateTime.UtcNow.ToString()}");
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
            {
                //插件针对的当前实体记录,对于Pre Update消息来讲,该对象包括了所有设置的字段值,若字段没有设置值,在该对象中会不存在
                Entity currentEntity = (Entity)context.InputParameters["Target"];
                //获取组织服务
                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService orgSvc = serviceFactory.CreateOrganizationService(context.UserId);
                //如果更新的字段包括Business Unit
                if (currentEntity.Contains("businessunitid"))
                {
                    tracingService.Trace($"Current user will change Business Unit on {DateTime.UtcNow.ToString()}");
                    //检查当前用户是否具有System Administrator角色
                    string fetchXml = string.Format(@"<fetch version='1.0' mapping='logical' distinct='true' no-lock='true' top='1'>
  <entity name='systemuser'>
    <attribute name='systemuserid' />
    <attribute name='businessunitid' />
    <filter type='and'>
      <condition attribute='systemuserid' operator='eq' value='{0}' />
    </filter>
    <link-entity name='systemuserroles' from='systemuserid' to='systemuserid' visible='false' intersect='true'>
      <link-entity name='role' from='roleid' to='roleid' alias='ac'>
        <filter type='and'>
          <condition attribute='name' operator='eq' value='System Administrator' />
        </filter>
      </link-entity>
    </link-entity>
  </entity>
</fetch>", context.UserId);
                    //不具有System Administrator角色的用户更改用户的业务部门时候,只能更改为与当前用户相同的业务部门
                    if (orgSvc.RetrieveMultiple(new FetchExpression(fetchXml)).Entities.Count == 0)
                    {
                        var currentUserBU = orgSvc.Retrieve("systemuser", context.UserId, new ColumnSet("businessunitid")).GetAttributeValue<EntityReference>("businessunitid");
                        tracingService.Trace($"Current user's business unit name is {currentUserBU.Name}");
                        if (currentEntity.GetAttributeValue<EntityReference>("businessunitid").Id != currentUserBU.Id)
                        {
                            throw new InvalidPluginExecutionException($"你只能更改当前用户的业务部门为你所在的业务部门-{currentUserBU.Name}");
                        }
                    }
                }
            }
            tracingService.Trace($"Leave PreSystemUserUpdate on {DateTime.UtcNow.ToString()}");
        }
    }
}

 

然后还是注册插件,大部分步骤可以参考我前面的博文 Dynamics 365中开发和注册插件介绍 ,还是先注册程序集,如下图:

 

 然后右击插件类注册新步骤,如下图:

 

 设置如下图,可以看到是注册到SystemUser实体的Update消息的Pre Operation阶段,注意要筛选字段,我这里筛选字段为 businessunitid,很多人注册Update消息上的插件不筛选字段,那么触发会非常频繁,这是不好的做法。

 

注册后去测试,如果报错,效果如下:

 

如果你能授予他人的的角色权限包括了你没有的权限,那就是安全漏洞了。如果你要授予他人的的角色权限包括了你没有的权限系统会报错,下面是一个报错的截图。

至于权限名称,比如prvActivateBusinessProcessFlow 对应界面上的那个项目,可以通过 Security role UI to privilege mapping 来查询。

 

추천

출처www.cnblogs.com/luoyong0201/p/Dynamics_365_Minimum_privileges_to_Change_Business_Unit_Change_User_Roles.html