Dynamics 移除用户的安全角色触发插件

当移除某个安全角色给到用户后触发插件添加用户到指定团队或相关事务

 

1、注册插件步骤 Message:Disassociate,Entity:none;

2、插件代码如下:

 /// <summary>
    /// action:SystemUserRolesAssociate
    /// <para>Entity:none,Message:Associate</para>
    /// <para>Entity:Role,Message:AssignUserRoles</para>
    /// </summary>
    public class SystemUserRolesAssociate : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            if (context.MessageName == "Associate" || context.MessageName == "AssignUserRole")
            {

                // 验证是否为 Associate 消息
                if (context.MessageName != "Associate") return;

                // 从 InputParameters 中提取关键属性
                if (context.InputParameters.Contains("Target") &&
                    context.InputParameters.Contains("RelatedEntities") &&
                    context.InputParameters.Contains("Relationship"))
                {
                    // 主实体(如 systemuser)
                    EntityReference targetEntity = (EntityReference)context.InputParameters["Target"];
                    Guid targetId = targetEntity.Id;
                    string targetLogicalName = targetEntity.LogicalName;

                    // 关联的实体集合(如 role)
                    EntityReferenceCollection relatedEntities = (EntityReferenceCollection)context.InputParameters["RelatedEntities"];

                    // 关联关系名称(如 systemuserroles_association)
                    Relationship relationship = (Relationship)context.InputParameters["Relationship"];
                    string relationshipName = relationship.SchemaName;
                    if (targetEntity.LogicalName.ToUpper() != "SYSTEMUSER") return;

                    var factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                    var tracing = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
                    var service = factory.CreateOrganizationService(null);

                    if (context.MessageName == "Disassociate" )
                    {
                        var target = (EntityReference)context.InputParameters["Target"];
                        if (target.LogicalName.ToUpper() != "SYSTEMUSER") return;
                        try
                        {
                            var userid = target.Id;

                            var fetchRolesXml = $@"
                                                    <fetch>
                                                      <entity name='role'>
                                                        <attribute name='roleid' />
                                                        <attribute name='name' />
                                                        <link-entity name='systemuserroles' from='roleid' to='roleid' link-type='inner'>
                                                          <filter>
                                                            <condition attribute='systemuserid' operator='eq' value='{userid}'/>
                                                          </filter>
                                                        </link-entity>
                                                      </entity>
                                                    </fetch>";
                            var roles = service.RetrieveMultiple(new FetchExpression(fetchRolesXml));
                            if (roles.Entities.Count == 0) return;

                            var fetchUserTeamXml = $@"
                                                       <fetch>
                                                         <entity name='team'>
                                                           <attribute name='teamid' />
                                                           <attribute name='name' />
                                                           <link-entity name='teammembership' from='teamid' to='teamid' link-type='inner' intersect='true'>
                                                             <filter>
                                                               <condition attribute='systemuserid' operator='eq' value='{userid}'/>
                                                             </filter>
                                                           </link-entity>
                                                         </entity>
                                                       </fetch>";
                            var userTeams = service.RetrieveMultiple(new FetchExpression(fetchUserTeamXml));

                            CheckUserTeam(service, userid, roles.Entities.ToList(), userTeams.Entities.ToList(), "Services PMO");

                        }
                        catch (Exception ex)
                        {
                            tracing.Trace($"自动指定团队出错:{ex.Message}", ex.StackTrace);
                        }
                    }
                }
            }
        }

        /// <summary>
        /// 用户团队处理逻辑
        /// </summary>
        /// <param name="service">  </param>
        /// <param name="userid">   </param>
        /// <param name="roles">    </param>
        /// <param name="userTeams"></param>
        /// <param name="roleName"> </param>
        private void CheckUserTeam(IOrganizationService service, Guid userid
                    , IList<Entity> roles, IList<Entity> userTeams
            , string roleName)
        {

            //查出要附加用户的团队
            var teamid = "teamid";

            //判断用户是否被赋予对应角色
            if (roles.Any(x => x.GetAttributeValue<string>("name") == roleName))
            {
                //判断用户是否已在团队中
                if (!userTeams.Any(x => x.Id == Guid.Parse(teamid)))
                {
                    var request = new AddMembersTeamRequest
                    {
                        TeamId = Guid.Parse(teamid),
                        MemberIds = new[] { userid }
                    };
                    service.Execute(request);
                }
            }
            else
            {
                if (userTeams.Any(x => x.Id == Guid.Parse(teamid)))
                {
                    //从团队中移除用户
                    var request = new RemoveMembersTeamRequest
                    {
                        TeamId = Guid.Parse(teamid),
                        MemberIds = new[] { userid }
                    };
                    service.Execute(request);
                }
            }
        }
    }

 

posted @ 2025-04-17 09:34  Mr.htb  阅读(7)  评论(0)    收藏  举报