Dynamics 用户分配安全角色后触发插件

  • 2021-11-02
  • Admin

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

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

2、注册插件步骤 Message:AssignUserRoles:Entity:Role

3、插件代码如下:

  1. /* file name:Plugins.User.SystemUserRolesAssociate.cs
  2. * author:lynx lynx.kor@163.com @ 2021/10/27 16:45:13
  3. * copyright (c) 2021 Copyright@lynxce.com
  4. * desc:
  5. * > add description for SystemUserRolesAssociate
  6. * revision:
  7. *
  8. */
  9. ///
  10. /// action:SystemUserRolesAssociate
  11. /// Entity:none,Message:Associate
  12. /// Entity:Role,Message:AssignUserRoles
  13. ///
  14. public class SystemUserRolesAssociate : IPlugin
  15. {
  16. public void Execute(IServiceProvider serviceProvider)
  17. {
  18. var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
  19. if (context.MessageName == "Associate" || context.MessageName == "AssignUserRole")
  20. {
  21. LogExt.i($"MessageName:{context.MessageName}");
  22. var target = (EntityReference)context.InputParameters["Target"];
  23. LogExt.i($"U:{target.LogicalName},{target.Id}{target.Name}");
  24. if (target.LogicalName.ToUpper() != "SYSTEMUSER") return;
  25. var factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
  26. var tracing = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
  27. var service = factory.CreateOrganizationService(null);
  28. try
  29. {
  30. var userid = target.Id;
  31. var fetchRolesXml = $@"
  32. ";
  33. var roles = service.RetrieveMultiple(fetchRolesXml);
  34. if (roles.Count == 0) return;
  35. var fetchUserTeamXml = $@"
  36. ";
  37. var userTeams = service.RetrieveMultiple(fetchUserTeamXml);
  38. CheckUserTeam(service, userid, roles, userTeams, "订单管理员");
  39. }
  40. catch (Exception ex)
  41. {
  42. tracing.Trace($"自动指定团队出错:{ex.Message}", ex.StackTrace);
  43. LogExt.e("自动指定团队出错", ex);
  44. }
  45. }
  46. }

 

  1. ///
  2. /// 用户团队处理逻辑
  3. ///
  4. ///
  5. ///
  6. ///
  7. ///
  8. ///
  9. private void CheckUserTeam(IOrganizationService service, Guid userid
  10. , IList roles, IList userTeams
  11. , string roleName)
  12. {
  13. //查出要附加用户的团队
  14. var teamid = xxx.GetAttributeValue("teamField");
  15. //判断用户是否被赋予对应角色
  16. if (roles.Any(x => x.GetAttributeValue<string>("name") == roleName))
  17. {
  18. //判断用户是否已在团队中
  19. if (!userTeams.Any(x => x.Id == teamid.Id))
  20. {
  21. //添加用户到团队
  22. service.AddMembersTeam(teamid.Id, new[] { userid });
  23. }
  24. }
  25. else
  26. {
  27. if (userTeams.Any(x => x.Id == teamid.Id))
  28. {
  29. //从团队中移除用户
  30. service.RemoveMembersTeam(teamid.Id, new[] { userid });
  31. }
  32. }
  33. }

 公共组件方法

  1. ///
  2. /// 添加用户到团队
  3. ///
  4. ///
  5. ///
  6. ///
  7. public static void AddMembersTeam(this IOrganizationService service, Guid teamid, Guid[] userids)
  8. {
  9. var request = new AddMembersTeamRequest
  10. {
  11. TeamId = teamid,
  12. MemberIds = userids
  13. };
  14. service.Execute(request);
  15. }
  16. ///
  17. /// 把用户从团队中移除
  18. ///
  19. ///
  20. ///
  21. ///
  22. public static void RemoveMembersTeam(this IOrganizationService service, Guid teamid, Guid[] userids)
  23. {
  24. var request = new RemoveMembersTeamRequest
  25. {
  26. TeamId = teamid,
  27. MemberIds = userids
  28. };
  29. service.Execute(request);
  30. }

原文:https://blog.csdn.net/lynxkor/article/details/121093478

联系站长

QQ:769220720