关注本人微信和易信公众号: 微软动态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. Python网络爬虫与如何爬取段子的项目实例

    一.网络爬虫 Python爬虫开发工程师,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页 ...

  2. 查看和修改Linux服务器的时区和时间

    一.查看和修改Linux的时区1. 查看当前时区 命令 : "date -R" 2. 修改设置Linux服务器时区方法 A 命令 : "tzselect" 方法 ...

  3. [Swift]LeetCode271. 加码解码字符串 $ Encode and Decode Strings

    Design an algorithm to encode a list of strings to a string. The encoded string is then sent over th ...

  4. [Swift]LeetCode870. 优势洗牌 | Advantage Shuffle

    Given two arrays A and B of equal size, the advantage of A with respect to B is the number of indice ...

  5. 面试挂了阿里却拿到网易offer,一个三年Java程序员的面试总结!

    前言 15年毕业到现在有三年多了,最近去面试了阿里集团(菜鸟网络,蚂蚁金服),网易,滴滴,点我达,最终收到点我达,网易offer,蚂蚁金服二面挂掉,菜鸟网络一个月了还在流程中... 最终有幸去了网易. ...

  6. spark计算两个DataFrame的差集、交集、合集

    spark 计算两个dataframe 的差集.交集.合集,只选择某一列来对比比较好.新建两个 dataframe : import org.apache.spark.{SparkConf, Spar ...

  7. Django+Bootstrap+Mysql 搭建个人博客(四)

    4.1.博客分类 (1)blog_tags.py @register.simple_tag def get_categories(): return Category.objects.all() @r ...

  8. 『最大M子段和 线性DP』

    最大M子段和(51nod 1052) Description N个整数组成的序列a[1],a[2],a[3],-,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M &g ...

  9. 《深入理解Java虚拟机》-----第2章 Java内存区域与内存溢出异常

    2.1 概述 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又是执行最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任 ...

  10. 分享一个很通用c语言的Makefile

    编写Makefile是一个苦乐交织的事情,快乐是因为从一堆需要手工逐个处理的编译过程,进步到一条命令完成,看着代码顺畅的在屏幕上滚动,编译为最终的产品,那个过程无比愉悦:而痛苦则是,写代码已经很累了, ...