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

为了便利于用户及用户权限审计,需要将系统的用户及其角色、角色、角色权限等导出到Excel方便查看。我这里就以这样一个需求为例来做一个简单的控制台应用程序来导出这些信息到Excel中。为了方便查看结果,我这里除了系统管理员,还建立几个用户,团队来展示效果。

这里说一下如何为Dynamics 365建立CRM用户。我们On-Premise的Dynamics CRM一般(注意是一般,因为你如果了SSO的话,用户信息也可以不存储在CRM服务器所在AD中)需要先在CRM服务器所在的AD中增加用户。而Dynamics 365则是需要先在 Office 365 门户的用户管理部分 增加用户。打开的界面如下,点击 管理员 这个磁贴。

 

点击 添加用户 链接添加一个用户,我这里自己创建密码,不使用生成的随机密码。注意产品许可证要包括Dynamics 365的许可证,我这里是 Dynamics 365 Plan 1 Enterprise Edition。

 

然后我们就可以去Dynamics 365中的 设置 > 安全性 >用户就可以看到这个新建的用户了。

然后就是设置业务部门,安全角色等,这里和On-Premise版本的Dynamics CRM一样,就不赘述了。

下面就是我们的程序了,我创建一个控制台应用程序,除了要添加对Dynamics 365相关DLL的引用外,还需要添加对Microsoft.Office.Interop.Excel的引用,添加引用的时候选择 COM, 然后搜索excel就可以找到。运行后面的程序还需要本机安装了Excel。

 

Dynamics 365中的 安全角色 没有导出功能,包括使用高级查找也是如此,所以我们只有写程序导出了。

 

所有使用的程序代码如下:

using Microsoft.Office.Interop.Excel;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 Microsoft.Xrm.Tooling.Connector;using System;using System.Collections.Generic;using System.Configuration;using System.Drawing;using System.IO;using System.Linq;using System.ServiceModel;using System.ServiceModel.Description;using System.Text;using System.Xml;namespace LuoYongLab{    class Program    {        static void Main(string[] args)        {            try            {                var crmSvc = new CrmServiceClient(ConfigurationManager.ConnectionStrings["CRM365"].ConnectionString);                if (crmSvc.IsReady)                {                    Console.WriteLine("导出安全角色开始");                    var fetchXml = string.Format(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'><entity name='role'><attribute name='name' /><attribute name='businessunitid' /><attribute name='roleid' /><order attribute='name' descending='false' /><filter type='and'><condition attribute='parentroleid' operator='null' /></filter></entity></fetch>");                    EntityCollection ecRoles = crmSvc.RetrieveMultiple(new FetchExpression(fetchXml));                    var excelApp = new Application();                    excelApp.Visible = false;                    Workbook securityWorkbook = excelApp.Workbooks.Add();                    Worksheet rolesWorksheet = (Worksheet)excelApp.ActiveSheet;                    rolesWorksheet.Name = "安全角色";                    int row = 1;                    rolesWorksheet.Cells[1, 1] = "角色名称";                    rolesWorksheet.Cells[1, 2] = "业务部门";                    rolesWorksheet.Cells[1, 3] = "角色ID";                    //rolesWorksheet.Rows[1].Font.Bold = true;//字体加粗                    row++;                    foreach (var roleEntity in ecRoles.Entities)                    {                        rolesWorksheet.Cells[row, 1] = roleEntity.GetAttributeValue<string>("name");                        rolesWorksheet.Cells[row, 2] = roleEntity.GetAttributeValue<EntityReference>("businessunitid").Name;                        rolesWorksheet.Cells[row, 3] = roleEntity.GetAttributeValue<Guid>("roleid").ToString();                        row++;                    }                    //rolesWorksheet.Columns[1].AutoFit();//自动列宽                    rolesWorksheet.Range["A1", "C" + (row - 1)].AutoFormat(XlRangeAutoFormat.xlRangeAutoFormatColor1);                    Console.WriteLine("导出用户及其安全角色开始");                    fetchXml = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'><entity name='systemuser'><attribute name='fullname' /><attribute name='businessunitid' /><attribute name='systemuserid' /><attribute name='domainname' /><order attribute='fullname' descending='false' /><filter type='and'><condition attribute='isdisabled' operator='eq' value='0' /><condition attribute='accessmode' operator='ne' value='3' /></filter></entity></fetch>";                    EntityCollection ecUsers = crmSvc.RetrieveMultiple(new FetchExpression(fetchXml));                    Worksheet usersWorksheet = securityWorkbook.Worksheets.Add();                    usersWorksheet.Name = "用户";                    row = 1;                    usersWorksheet.Cells[1, 1] = "用户姓名";                    usersWorksheet.Cells[1, 2] = "业务部门";                    usersWorksheet.Cells[1, 3] = "用户账户";                    usersWorksheet.Cells[1, 4] = "用户角色";                    usersWorksheet.Cells[1, 5] = "用户ID";                    row++;                    foreach (var userEntity in ecUsers.Entities)                    {                        usersWorksheet.Cells[row, 1] = userEntity.GetAttributeValue<string>("fullname");                        usersWorksheet.Cells[row, 2] = userEntity.GetAttributeValue<EntityReference>("businessunitid").Name;                        usersWorksheet.Cells[row, 3] = userEntity.GetAttributeValue<string>("domainname");                        usersWorksheet.Cells[row, 4] = string.Join(",", GetUserRoles(crmSvc.OrganizationServiceProxy, userEntity.GetAttributeValue<Guid>("systemuserid")).Distinct());                        usersWorksheet.Cells[row, 5] = userEntity.GetAttributeValue<Guid>("systemuserid").ToString();                        row++;                    }                    usersWorksheet.Range["A1", "E" + (row - 1)].AutoFormat(XlRangeAutoFormat.xlRangeAutoFormatColor1);                    securityWorkbook.SaveAs(Filename: "CRMSecurities.xlsx", FileFormat: XlFileFormat.xlWorkbookDefault);                    securityWorkbook.Close();                    excelApp.Quit();                }                else                {                    Console.WriteLine("连接CRM出错:" + crmSvc.LastCrmError);                }                Console.WriteLine("程序运行完成!");                Console.ReadKey();            }            catch (FaultException ex)            {                Console.WriteLine("程序出现异常:ex.Message=" + ex.Message);                Console.ReadKey();            }        }        static IEnumerable<string> GetUserRoles(IOrganizationService service, Guid userId)        {            //首先获取用户直接授予的角色            string fetchXml = string.Format(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true' no-lock='true'><entity name='role'><attribute name='name' /><link-entity name='systemuserroles' from='roleid' to='roleid' visible='false' intersect='true'><link-entity name='systemuser' from='systemuserid' to='systemuserid' alias='ad'><filter type='and'><condition attribute='systemuserid' operator='eq' value='{0}' /></filter></link-entity></link-entity></entity></fetch>", userId);            var userRolesDirect = service.RetrieveMultiple(new FetchExpression(fetchXml)).Entities.Select(x => x.GetAttributeValue<string>("name"));            //找出用户加入的所有负责人团队            fetchXml = string.Format(@"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'><entity name='team'><attribute name='teamid' /><filter type='and'><condition attribute='teamtype' operator='eq' value='0' /></filter><link-entity name='teammembership' from='teamid' to='teamid' visible='false' intersect='true'><link-entity name='systemuser' from='systemuserid' to='systemuserid' alias='ah'><filter type='and'><condition attribute='systemuserid' operator='eq' value='{0}' /></filter></link-entity></link-entity></entity></fetch>", userId);            var userTeams = service.RetrieveMultiple(new FetchExpression(fetchXml)).Entities.Select(x => x.GetAttributeValue<Guid>("teamid"));            //团队拥有的角色也是这个团队所有用户拥有的角色,所以还要加上这部分角色            var fetchXmlSb = new StringBuilder("<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>");            fetchXmlSb.Append("<entity name='role'>");            fetchXmlSb.Append("<attribute name='name' />");            fetchXmlSb.Append("<order attribute='name' descending='false' />");            fetchXmlSb.Append("<link-entity name='teamroles' from='roleid' to='roleid' visible='false' intersect='true'>");            fetchXmlSb.Append("<link-entity name='team' from='teamid' to='teamid' alias='ak'>");            fetchXmlSb.Append("<filter type='or'>");            foreach (var team in userTeams)            {                fetchXmlSb.Append(string.Format("<condition attribute='teamid' operator='eq' value='{0}' />", team));            }            fetchXmlSb.Append("</filter>");            fetchXmlSb.Append("</link-entity>");            fetchXmlSb.Append("</link-entity>");            fetchXmlSb.Append("</entity>");            fetchXmlSb.Append("</fetch>");            var userRolesInTeam = service.RetrieveMultiple(new FetchExpression(fetchXmlSb.ToString())).Entities.Select(x => x.GetAttributeValue<string>("name"));            return userRolesDirect.Concat(userRolesInTeam);        }    }}

 

得到的结果如下,这个Excel有两个Sheet,我分别截图,我的测试结果是把用户直接授予的角色和用户加入团队获取的角色都拿到了。

 

 


©著作权归作者所有:来自51CTO博客作者luoyong0201的原创作品,如需转载,请注明出处,否则将追究法律责任

你的鼓励让我更有动力

赞赏

0人进行了赞赏支持

更多相关文章

  1. 如何解决Dynamics 365的错误:用户身份验证无效,MSIS0006
  2. 手把手教你做用户画像体系规划
  3. 学生课程表表格/用户注册表单
  4. 用户的基本权限
  5. 用户的特殊权利
  6. jQuery常用dom操作之验证用户名
  7. 用户管理
  8. 统信UOS中普通用户忘记密码处理方法
  9. 课程表、用户注册及 css 预习

随机推荐

  1. WebBrowser 遇到 javascript:void(0) 页
  2. IT兄弟连 JavaWeb教程 文件上传技术
  3. 读取Excel文件并跳过空行但不是空列
  4. Spring MVC-集成(Integration)-集成LOG4J示
  5. 有关JavaScript的认识
  6. Java将一个字符串中的多个连一起的空格变
  7. Java提高篇——equals()方法和“==”运算
  8. javascript 基础知识点
  9. 关于Javascript中声明变量、函数的笔记
  10. 如何在Spring Data(JPA)派生查询中按多个属