关注本人微信和易信公众号: 微软动态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 = ;
rolesWorksheet.Cells[, ] = "角色名称";
rolesWorksheet.Cells[, ] = "业务部门";
rolesWorksheet.Cells[, ] = "角色ID";
//rolesWorksheet.Rows[1].Font.Bold = true;//字体加粗
row++;
foreach (var roleEntity in ecRoles.Entities)
{
rolesWorksheet.Cells[row, ] = roleEntity.GetAttributeValue<string>("name");
rolesWorksheet.Cells[row, ] = roleEntity.GetAttributeValue<EntityReference>("businessunitid").Name;
rolesWorksheet.Cells[row, ] = roleEntity.GetAttributeValue<Guid>("roleid").ToString();
row++;
}
//rolesWorksheet.Columns[1].AutoFit();//自动列宽
rolesWorksheet.Range["A1", "C" + (row - )].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 = ;
usersWorksheet.Cells[, ] = "用户姓名";
usersWorksheet.Cells[, ] = "业务部门";
usersWorksheet.Cells[, ] = "用户账户";
usersWorksheet.Cells[, ] = "用户角色";
usersWorksheet.Cells[, ] = "用户ID";
row++;
foreach (var userEntity in ecUsers.Entities)
{
usersWorksheet.Cells[row, ] = userEntity.GetAttributeValue<string>("fullname");
usersWorksheet.Cells[row, ] = userEntity.GetAttributeValue<EntityReference>("businessunitid").Name;
usersWorksheet.Cells[row, ] = userEntity.GetAttributeValue<string>("domainname");
usersWorksheet.Cells[row, ] = string.Join(",", GetUserRoles(crmSvc.OrganizationServiceProxy, userEntity.GetAttributeValue<Guid>("systemuserid")).Distinct());
usersWorksheet.Cells[row, ] = userEntity.GetAttributeValue<Guid>("systemuserid").ToString();
row++;
}
usersWorksheet.Range["A1", "E" + (row - )].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,我分别截图,我的测试结果是把用户直接授予的角色和用户加入团队获取的角色都拿到了。
 
 

将Dynamics 365中的用户及其角色、角色导出到Excel中的更多相关文章

  1. html table表格导出excel的方法 html5 table导出Excel HTML用JS导出Excel的五种方法 html中table导出Excel 前端开发 将table内容导出到excel HTML table导出到Excel中的解决办法 js实现table导出Excel,保留table样式

    先上代码   <script type="text/javascript" language="javascript">   var idTmr; ...

  2. 将datagrid中数据导出到excel中 -------<<工作日志2014-6-6>>

    前台datagrid数据绑定 #region 导出到excel中    /// <summary>    /// 2014-6-6    /// </summary>    / ...

  3. 将Datagridview中的数据导出至Excel中

        首先添加一个模块ImportToExcel,并添加引用         然后导入命名空间: Imports Microsoft.Office.Interop Imports System.Da ...

  4. Winform 中 dataGridView 导出到Excel中的方法总结

    最近,在做CS端数据导出到Excel中时网上找了很多代码感觉都不是自己想要的,通过自己的整理归纳得到一个比较通用的方法,就给大家分享一下: 该方法需要用到两个参数(即对象),一个  DataGridV ...

  5. HTML table导出到Excel中的解决办法

    第一部分:html+js 1.需要使用的表格数据(先不考虑动态生成的table) <table class="table tableStyles" id="tabl ...

  6. C# html的Table导出到Excel中

    C#中导出Excel分为两大类.一类是Winform的,一类是Web.今天说的这一种是Web中的一种,把页面上的Table部分导出到Excel中. Table导出Excel,简单点说,分为以下几步: ...

  7. 把数据库里面的stu表中的数据,导出到excel中

    # 2.写代码实现,把我的数据库里面的stu表中的数据,导出到excel中 #编号 名字 性别 # 需求分析:# 1.连接好数据库,写好SQL,查到数据 [[1,'name1','男'],[1,'na ...

  8. html table导出到Excel中,不走后台,js完成

    静态表格table <table class="table tableStyles" id="tables"> <caption>不正经 ...

  9. JS将页面中表格,导出到Excel中(IE中)

    原文地址:http://blog.csdn.net/sinat_15114467/article/details/51098522 var idTmr; function getExplorer() ...

随机推荐

  1. SQL语句题

    SQL语句题 Student(Sno,Sname,Sage,Ssex)注释:学生表(学号,姓名,性别年龄,性别) Course(Cno,Cname,Tno) 注释:课程表(课程号,课程名称,教师编号) ...

  2. [Swift]LeetCode540. 有序数组中的单一元素 | Single Element in a Sorted Array

    Given a sorted array consisting of only integers where every element appears twice except for one el ...

  3. [Swift]LeetCode904. 水果成篮 | Fruit Into Baskets

    In a row of trees, the i-th tree produces fruit with type tree[i]. You start at any tree of your cho ...

  4. 使用(POI)SAX处理Excel大文件,防止内存溢出

    POISAXReader h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-chi ...

  5. MT2018笔试题之计算数字位数

    一.计算数字位数 1.题目 给定一个数字T,计算从1到T的所有正整数的位数和.比如T=13,则12345678910111213有17位数字. 输入描述 3 13 4 5 输出 17 4 5 2.思路 ...

  6. 【从零开始自制CPU之学习篇06】寄存器

    上一篇文章学习了总线的相关知识,途中ABC当时假设为一个个的8位寄存器.这一篇要学习怎么构建这个寄存器. 这分为两个三个部分,数据输入,寄存器,数据输出.首先不管输出,来看数据输入和寄存器这两个部分. ...

  7. 初探Java设计模式2:结构型模式(代理模式,适配器模式等)

    行为型模式 行为型模式关注的是各个类之间的相互作用,将职责划分清楚,使得我们的代码更加地清晰. 策略模式 策略模式太常用了,所以把它放到最前面进行介绍.它比较简单,我就不废话,直接用代码说事吧. 下面 ...

  8. Python进阶:自定义对象实现切片功能

    2018-12-31 更新声明:切片系列文章本是分三篇写成,现已合并成一篇.合并后,修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔接做了大量改动.原系列的单篇就不删除了,毕竟也是 ...

  9. 阿里注册中心nacos使用整合Dubbo-原创

    阿里注册中心nacos是今年开源的框架,一开始以为就是个zk.后面看了图才明白他对标的竟然是consul\eureka,最重要是完美支持dubbo.我想今年开源它也是别有用意 .(目前nacos0.7 ...

  10. github访问很慢解决方案

    首先要解决的就是这个访问速度的问题: 获取Github相关网站的ip 访问https://www.ipaddress.com,拉下来,找到页面中下方的“IP Address Tools – Quick ...