关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复240或者20161204可方便获取本文,同时能够在第一间获得我发布的最新的博文信息,follow me!个人网站是 www.luoyong.me 。安全
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); } } }