zoukankan      html  css  js  c++  java
  • 自定义控制台程序导出角色对实体的权限为Excel文件

    本人微信公众号:微软动态CRM专家罗勇 ,回复282或者20181116可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me 。

    先上图让大家看效果。权限列没有值则代表没有授予这个权限,1为个人级别,2为业务部门级别,3为上:下级业务部门,4为组织级别。

    然后上代码,代码比较通俗易懂,有注意的地方我红色标注了一下,自己可以加上一些筛选,比如去掉导出对大部分标准实体的权限等,当然这个程序并没有导出杂项权限,有兴趣的可以自己修改下。

    using Microsoft.Crm.Sdk.Messages;
    using Microsoft.Xrm.Sdk;
    using Microsoft.Xrm.Sdk.Client;
    using Microsoft.Xrm.Sdk.Messages;
    using Microsoft.Xrm.Sdk.Metadata;
    using Microsoft.Xrm.Sdk.Query;
    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Linq;
    using System.ServiceModel.Description;
    using Excel = Microsoft.Office.Interop.Excel;
    
    namespace ExportRolePrivileges
    {
        class lyPrivilege
        {
            public string EntitySchemaName;
            public string EntityDisplayName;
            public string CreatePrivilege;
            public string ReadPrivilege;
            public string WritePrivilege;
            public string DeletePrivilege;
            public string AppendPrivilege;
            public string AppendToPrivilege;
            public string AssignPrivilege;
            public string SharePrivilege;
        }
        class Program
        {
            static void Main(string[] args)
            {
                IServiceManagement<IOrganizationService> orgServiceMgr = ServiceConfigurationFactory.CreateManagement<IOrganizationService>(new Uri(ConfigurationManager.AppSettings["orgUrl"]));
                AuthenticationCredentials orgAuCredentials = new AuthenticationCredentials();
                orgAuCredentials.ClientCredentials.UserName.UserName = ConfigurationManager.AppSettings["userName"];
                orgAuCredentials.ClientCredentials.UserName.Password = ConfigurationManager.AppSettings["passWord"];
                using (OrganizationServiceProxy orgSvc = GetProxy<IOrganizationService, OrganizationServiceProxy>(orgServiceMgr, orgAuCredentials))
                {
                    WhoAmIRequest whoReq = new WhoAmIRequest();
                    WhoAmIResponse whoRep = orgSvc.Execute(whoReq) as WhoAmIResponse;
                    var userEntity = orgSvc.Retrieve("systemuser", whoRep.UserId, new ColumnSet("fullname"));
                    Console.WriteLine(string.Format("登录组织{0}成功,欢迎{1},继续操作请输入y!", ConfigurationManager.AppSettings["orgUrl"], userEntity.GetAttributeValue<string>("fullname")));
                    var input = Console.ReadLine().ToString().ToUpper();
                    if (input == "Y")
                    {
                        Console.WriteLine(string.Format("程序开始处理 - {0}", DateTime.Now.ToString()));
                        var meta = GetEntityMetadata(orgSvc);
                        var excelApp = new Excel.Application();
                        excelApp.Visible = false;
                        Excel.Workbook rolePrivilegeWorkbook = excelApp.Workbooks.Add();
    
                        var roleList = GetRoleList(orgSvc);
                        Console.WriteLine(string.Format("共有{0}个角色 - {1}", roleList.Count, DateTime.Now.ToString()));
                        foreach (var role in roleList)
                        {
                            Excel.Worksheet activeWorksheet = rolePrivilegeWorkbook.Worksheets.Add();
                            activeWorksheet.Name = role.Value;
                            int row = 1;
                            activeWorksheet.Cells[1, 1] = "实体架构名称";
                            activeWorksheet.Cells[1, 2] = "实体显示名称(中文)";
                            activeWorksheet.Cells[1, 3] = "创建权限";
                            activeWorksheet.Cells[1, 4] = "读权限";
                            activeWorksheet.Cells[1, 5] = "写权限";
                            activeWorksheet.Cells[1, 6] = "删除权限";
                            activeWorksheet.Cells[1, 7] = "追加权限";
                            activeWorksheet.Cells[1, 8] = "追加到权限";
                            activeWorksheet.Cells[1, 9] = "分派权限";
                            activeWorksheet.Cells[1, 10] = "共享权限";
                            activeWorksheet.Rows[1].Font.Bold = true;//字体加粗
                            row++;
                            var ls = GetRolePrivileges(orgSvc, role.Key, role.Value, meta).OrderBy(t => t.EntityDisplayName);
                            foreach (var item in ls)
                            {
                                activeWorksheet.Cells[row, 1] = item.EntitySchemaName;
                                activeWorksheet.Cells[row, 2] = item.EntityDisplayName;
                                activeWorksheet.Cells[row, 3] = item.CreatePrivilege;
                                activeWorksheet.Cells[row, 4] = item.ReadPrivilege;
                                activeWorksheet.Cells[row, 5] = item.WritePrivilege;
                                activeWorksheet.Cells[row, 6] = item.DeletePrivilege;
                                activeWorksheet.Cells[row, 7] = item.AppendPrivilege;
                                activeWorksheet.Cells[row, 8] = item.AppendToPrivilege;
                                activeWorksheet.Cells[row, 9] = item.AssignPrivilege;
                                activeWorksheet.Cells[row, 10] = item.SharePrivilege;
                                row++;
                            }
                            activeWorksheet.Columns[1].AutoFit();//自动列宽
                            activeWorksheet.Columns[2].AutoFit();//自动列宽
                            activeWorksheet.Columns[3].AutoFit();//自动列宽
                            activeWorksheet.Columns[4].AutoFit();//自动列宽
                            activeWorksheet.Columns[5].AutoFit();//自动列宽
                            activeWorksheet.Columns[6].AutoFit();//自动列宽
                            activeWorksheet.Columns[7].AutoFit();//自动列宽
                            activeWorksheet.Columns[8].AutoFit();//自动列宽
                            activeWorksheet.Columns[9].AutoFit();//自动列宽
                            activeWorksheet.Columns[10].AutoFit();//自动列宽
                            Console.WriteLine(string.Format("角色{0}处理完毕 - {1}", role.Value, DateTime.Now.ToString()));
                        }
                        rolePrivilegeWorkbook.SaveAs(Filename: @"D:SecurityRolePrivileges.xlsx", FileFormat: Excel.XlFileFormat.xlWorkbookDefault);
                        rolePrivilegeWorkbook.Close();
                        excelApp.Quit();
                    }
                }
                Console.Write("程序执行完毕!");
                Console.ReadKey();
            }
    
            private static TProxy GetProxy<TService, TProxy>(
    IServiceManagement<TService> serviceManagement,
    AuthenticationCredentials authCredentials)
                where TService : class
                where TProxy : ServiceProxy<TService>
            {
                Type classType = typeof(TProxy);
    
                if (serviceManagement.AuthenticationType !=
                    AuthenticationProviderType.ActiveDirectory)
                {
                    AuthenticationCredentials tokenCredentials =
                        serviceManagement.Authenticate(authCredentials);
                    return (TProxy)classType
                        .GetConstructor(new Type[] { typeof(IServiceManagement<TService>), typeof(SecurityTokenResponse) })
                        .Invoke(new object[] { serviceManagement, tokenCredentials.SecurityTokenResponse });
                }
                return (TProxy)classType
                    .GetConstructor(new Type[] { typeof(IServiceManagement<TService>), typeof(ClientCredentials) })
                    .Invoke(new object[] { serviceManagement, authCredentials.ClientCredentials });
            }
    
            /// <summary>
            /// 获得角色列表,这里排除了一部分角色
            /// </summary>
            /// <param name="orgSvc"></param>
            /// <returns></returns>
            private static Dictionary<Guid, string> GetRoleList(OrganizationServiceProxy orgSvc)
            {
                Dictionary<Guid, string> returnVal = new Dictionary<Guid, string>();
                string[] excludeRoles = new string[] { "Support User", "Delegate","System Administrator","Activity Feeds",
                    "Scheduler","System Customizer","Knowledge Manager","UIIAgent","UIIAdministrator","USD Administrator","USD Agent","系统定制员","系统管理员","代理","知识管理员"};
                var rootBuId = GetRootBUId(orgSvc);
                string fetchXml = string.Format(@"<fetch version='1.0' no-lock='true' mapping='logical' distinct='false'>
      <entity name='role'>
        <attribute name='name' />
        <attribute name='roleid' />
        <filter type='and'>
          <condition attribute='businessunitid' operator='eq' value='{0}' />
        </filter>
      </entity>
    </fetch>", rootBuId);
                foreach (var item in orgSvc.RetrieveMultiple(new FetchExpression(fetchXml)).Entities)
                {
                    var roleName = item.GetAttributeValue<string>("name");
                    if (!excludeRoles.Contains(roleName))
                    {
                        returnVal.Add(item.GetAttributeValue<Guid>("roleid"), roleName);
                    }
                }
                return returnVal;
            }
    
            private static List<lyPrivilege> GetRolePrivileges(OrganizationServiceProxy orgSvc, Guid roleId, string roleName, Dictionary<string, string> entityMetadata)
            {
                Console.WriteLine(string.Format("开始提取角色 {0} - {1} 的权限", roleName, roleId));
                List<lyPrivilege> temList = new List<lyPrivilege>();
                List<lyPrivilege> returnVal = new List<lyPrivilege>();
                string fetchXml = string.Format(@"<fetch version='1.0' mapping='logical' distinct='false' no-lock='true'>
       <entity name='roleprivileges'>
          <attribute name='privilegedepthmask'/>
            <filter type='and'>
                <condition attribute='roleid' operator='eq' value='{0}' />
            </filter>
          <link-entity name='privilege' alias='prvs' to='privilegeid' from='privilegeid' link-type='inner'>
             <attribute name='name'/>
             <attribute name='accessright'/>
          </link-entity>
       </entity>
    </fetch>", roleId);
                foreach (var item in orgSvc.RetrieveMultiple(new FetchExpression(fetchXml)).Entities)
                {
                    lyPrivilege lyp = new lyPrivilege();
                    string prvName = item.GetAttributeValue<AliasedValue>("prvs.name").Value.ToString();
                    lyp.EntitySchemaName = GetEntitySchemaName(prvName);
                    lyp.EntityDisplayName = GetEntityDisplayName(lyp.EntitySchemaName, entityMetadata);
                    int accessRight = Convert.ToInt32(item.GetAttributeValue<AliasedValue>("prvs.accessright").Value);
                    //可以根据需要排除对一些实体的权限导出来,做到更加简洁
                    if (lyp.EntityDisplayName != string.Empty)//为空的不是实体权限不需要处理
                    {
                        switch (accessRight)
                        {
                            case 1:
                                lyp.ReadPrivilege = TransferPrivilege(item.GetAttributeValue<int>("privilegedepthmask")).ToString();
                                break;
                            case 2:
                                lyp.WritePrivilege = TransferPrivilege(item.GetAttributeValue<int>("privilegedepthmask")).ToString();
                                break;
                            case 4:
                                lyp.AppendPrivilege = TransferPrivilege(item.GetAttributeValue<int>("privilegedepthmask")).ToString();
                                break;
                            case 16:
                                lyp.AppendToPrivilege = TransferPrivilege(item.GetAttributeValue<int>("privilegedepthmask")).ToString();
                                break;
                            case 32:
                                lyp.CreatePrivilege = TransferPrivilege(item.GetAttributeValue<int>("privilegedepthmask")).ToString();
                                break;
                            case 65536:
                                lyp.DeletePrivilege = TransferPrivilege(item.GetAttributeValue<int>("privilegedepthmask")).ToString();
                                break;
                            case 262144:
                                lyp.SharePrivilege = TransferPrivilege(item.GetAttributeValue<int>("privilegedepthmask")).ToString();
                                break;
                            case 524288:
                                lyp.AssignPrivilege = TransferPrivilege(item.GetAttributeValue<int>("privilegedepthmask")).ToString();
                                break;
                        }
                        temList.Add(lyp);
                    }
                }
                var distinctQuery = temList.GroupBy(p => new { p.EntitySchemaName }).Select(g => g.First()).ToList();
                foreach (var item in distinctQuery)
                {
                    lyPrivilege prv = new lyPrivilege();
                    prv.EntitySchemaName = item.EntitySchemaName;
                    prv.EntityDisplayName = item.EntityDisplayName;
                    prv.ReadPrivilege = temList.Where(t => t.EntitySchemaName == prv.EntitySchemaName && (!string.IsNullOrEmpty(t.ReadPrivilege))).Count() >= 1 ? temList.Where(t => t.EntitySchemaName == prv.EntitySchemaName && !string.IsNullOrEmpty(t.ReadPrivilege)).First().ReadPrivilege : string.Empty;
                    prv.WritePrivilege = temList.Where(t => t.EntitySchemaName == prv.EntitySchemaName && (!string.IsNullOrEmpty(t.WritePrivilege))).Count() >= 1 ? temList.Where(t => t.EntitySchemaName == prv.EntitySchemaName && !string.IsNullOrEmpty(t.WritePrivilege)).First().WritePrivilege : string.Empty;
                    prv.CreatePrivilege = temList.Where(t => t.EntitySchemaName == prv.EntitySchemaName && (!string.IsNullOrEmpty(t.CreatePrivilege))).Count() >= 1 ? temList.Where(t => t.EntitySchemaName == prv.EntitySchemaName && !string.IsNullOrEmpty(t.CreatePrivilege)).First().CreatePrivilege : string.Empty;
                    prv.AssignPrivilege = temList.Where(t => t.EntitySchemaName == prv.EntitySchemaName && (!string.IsNullOrEmpty(t.AssignPrivilege))).Count() >= 1 ? temList.Where(t => t.EntitySchemaName == prv.EntitySchemaName && !string.IsNullOrEmpty(t.AssignPrivilege)).First().AssignPrivilege : string.Empty;
                    prv.SharePrivilege = temList.Where(t => t.EntitySchemaName == prv.EntitySchemaName && (!string.IsNullOrEmpty(t.SharePrivilege))).Count() >= 1 ? temList.Where(t => t.EntitySchemaName == prv.EntitySchemaName && !string.IsNullOrEmpty(t.SharePrivilege)).First().SharePrivilege : string.Empty;
                    prv.AppendToPrivilege = temList.Where(t => t.EntitySchemaName == prv.EntitySchemaName && (!string.IsNullOrEmpty(t.AppendToPrivilege))).Count() >= 1 ? temList.Where(t => t.EntitySchemaName == prv.EntitySchemaName && !string.IsNullOrEmpty(t.AppendToPrivilege)).First().AppendToPrivilege : string.Empty;
                    prv.AppendPrivilege = temList.Where(t => t.EntitySchemaName == prv.EntitySchemaName && (!string.IsNullOrEmpty(t.AppendPrivilege))).Count() >= 1 ? temList.Where(t => t.EntitySchemaName == prv.EntitySchemaName && !string.IsNullOrEmpty(t.AppendPrivilege)).First().AppendPrivilege : string.Empty;
                    prv.DeletePrivilege = temList.Where(t => t.EntitySchemaName == prv.EntitySchemaName && (!string.IsNullOrEmpty(t.DeletePrivilege))).Count() >= 1 ? temList.Where(t => t.EntitySchemaName == prv.EntitySchemaName && !string.IsNullOrEmpty(t.DeletePrivilege)).First().DeletePrivilege : string.Empty;
                    returnVal.Add(prv);
                }
                return returnVal;
            }
    
            //活动实体需要特别处理,替换的时候先替换prvAppendTo,在替换prvAppend,否则获取不到追加到权限。
            //用户和业务部门实体有Disable权限,用户的实体名称在权限表中是User要特别转换成真的实体名称
            private static string GetEntitySchemaName(string privelegeName)
            {
                string returnVal = string.Empty;
                returnVal = privelegeName.Replace("prvAssign", "");
                returnVal = privelegeName.Replace("prvDisable", "");
                returnVal = returnVal.Replace("prvDelete", "");
                returnVal = returnVal.Replace("prvRead", "");
                returnVal = returnVal.Replace("prvCreate", "");
                returnVal = returnVal.Replace("prvWrite", "");
                returnVal = returnVal.Replace("prvAppendTo", "");
                returnVal = returnVal.Replace("prvAppend", "");
                returnVal = returnVal.Replace("prvShare", "");
                returnVal = returnVal.Replace("prv", "");
                if (returnVal == "Activity")
                {
                    returnVal = "ActivityPointer";
                }
                if (returnVal == "User")
                {
                    returnVal = "SystemUser";
                }
                return returnVal;
            }
            private static string GetEntityDisplayName(string entitySchemaName, Dictionary<string, string> entityMetadata)
            {
                string returnVal = string.Empty;
                if (!string.IsNullOrEmpty(entitySchemaName) && entityMetadata.Where(item => item.Key == entitySchemaName.ToLower()).ToList().Count() >= 1)
                {
                    returnVal = entityMetadata.Where(item => item.Key == entitySchemaName.ToLower()).First().Value;
                }
                return returnVal;
            }
            private static int TransferPrivilege(int privilegedepthmask)
            {
                int returnVal = -1;
                switch (privilegedepthmask)
                {
                    case 8:
                        returnVal = 4;
                        break;
                    case 4:
                        returnVal = 3;
                        break;
                    case 2:
                        returnVal = 2;
                        break;
                    case 1:
                        returnVal = 1;
                        break;
                }
                return returnVal;
            }
    
            /// <summary>
            /// 获取实体架构名称及其中文显示名称
            /// </summary>
            /// <param name="orgSvc"></param>
            /// <returns></returns>
            private static Dictionary<string, string> GetEntityMetadata(OrganizationServiceProxy orgSvc)
            {
                Dictionary<string, string> returnVal = new Dictionary<string, string>();
                RetrieveAllEntitiesRequest request = new RetrieveAllEntitiesRequest()
                {
                    EntityFilters = EntityFilters.Entity,
                    RetrieveAsIfPublished = true
                };
                RetrieveAllEntitiesResponse response = (RetrieveAllEntitiesResponse)orgSvc.Execute(request);
                foreach (EntityMetadata currentEntity in response.EntityMetadata)
                {
                    returnVal.Add(currentEntity.LogicalName,
                        currentEntity.DisplayName.LocalizedLabels.Where(a => a.LanguageCode == 2052).Count() >= 1 ? currentEntity.DisplayName.LocalizedLabels.Where(a => a.LanguageCode == 2052).FirstOrDefault().Label : string.Empty);
                }
                return returnVal;
            }
    
            /// <summary>
            /// 获取根业务部门的GUID
            /// </summary>
            /// <param name="orgSvc">组织服务</param>
            /// <returns></returns>
            private static Guid GetRootBUId(OrganizationServiceProxy orgSvc)
            {
                Guid returnVal = Guid.Empty;
                string fetchXml = @"<fetch version='1.0' mapping='logical' distinct='false' count='1' no-lock='true'>
      <entity name='businessunit'>
        <attribute name='businessunitid' />
        <filter type='and'>
          <condition attribute='parentbusinessunitid' operator='null' />
        </filter>
      </entity>
    </fetch>";
                var buEntities = orgSvc.RetrieveMultiple(new FetchExpression(fetchXml));
                if (buEntities.Entities.Count >= 1)
                {
                    returnVal = buEntities.Entities[0].GetAttributeValue<Guid>("businessunitid");
                }
                return returnVal;
            }
        }
    }
  • 相关阅读:
    享受法国葡萄酒
    shell (bash) hot keys
    传统MapReduce框架
    【oracle】常用命令
    【转】商业J2EE中间件价值何在?
    【转】Linux(CentOS)服务器上安装Webmin
    【转】CentOS 5安装免费主机控制面板Webmin
    【源码】不规则矩形窗体的设计
    【转】虚拟机VirtualBox+Centos+NAT网络的配置过程
    【jsp】 config配置的关键字
  • 原文地址:https://www.cnblogs.com/luoyong0201/p/Dynamics_365_Export_SecurityRole_Privileges_to_Excel.html
Copyright © 2011-2022 走看看