Бэкап Решений с помощью плагина
Этот плагин выполняет выгрузку всех неуправляемых Решений и прикрепляет их к созданной задаче:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; using Microsoft.Xrm.Sdk.Query; using Microsoft.Xrm.Sdk.Client; using Microsoft.Crm.Sdk.Messages; using System.ServiceModel.Description; using System.Runtime.Serialization; namespace SolutionBackup { // PreSolutionBackup Plugin. public class PreSolutionBackup : IPlugin { public void Execute(IServiceProvider serviceProvider) { IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); try { IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId); // Запрос для возвращения Неуправляемых Решений QueryExpression query = new QueryExpression { EntityName = "solution", ColumnSet = new ColumnSet("friendlyname", "uniquename", "version"), Criteria = new FilterExpression() { Conditions = { // Только неуправляемые new ConditionExpression("ismanaged", ConditionOperator.Equal, false), new ConditionExpression("isvisible", ConditionOperator.Equal, true), new ConditionExpression("uniquename", ConditionOperator.NotEqual, "Default") } } }; // Возвращаем Решения и проверяем что вернулась хотя бы одно Решение EntityCollection solutions = service.RetrieveMultiple(query); if (solutions.Entities.Count == 0) return; // Создаем Задачу, к которой будем крепить Решения Entity task = new Entity("task"); task["subject"] = string.Format("Бэкап - {0}", DateTime.Now); Guid taskId = service.Create(task); // Просматриваем Решения foreach (Entity solution in solutions.Entities) { // Возвращаем само Решение var exportXml = ExportSolution((String)solution["uniquename"], service); // Создаем Примечание, при этом вкладываем в него экспортированиие Решение и присоединяем к Задаче if (exportXml != null) { Entity Annotation = new Entity("annotation"); Annotation["subject"] = string.Format("Решение - {0}.", (String)solution["uniquename"]); Annotation["notetext"] = string.Format("Дата: {0}.", DateTime.Now); Annotation["objectid"] = new EntityReference("task", taskId); Annotation["isdocument"] = true; Annotation["filename"] = string.Format("{0}_{1}.zip", (String)solution["friendlyname"], DateTime.Now); Annotation["mimetype"] = "application/zip"; Annotation["documentbody"] = Convert.ToBase64String(exportXml); service.Create(Annotation); } } } catch (FaultException<OrganizationServiceFault> ex) { throw new InvalidPluginExecutionException("Ошибка: " + ex); } } // Метод выгружает Решение private byte[] ExportSolution(string solutionName, IOrganizationService service) { try { ExportSolutionRequest exportSolutionRequest = new ExportSolutionRequest(); exportSolutionRequest.SolutionName = solutionName; ExportSolutionResponse exportSolutionResponse = (ExportSolutionResponse)service.Execute(exportSolutionRequest); byte[] exportXml = exportSolutionResponse.ExportSolutionFile; return exportXml; } catch (Exception ex) { return null; } } } }
Зарегистрируйте плагин на сообщение Publish All (лучше асинхронно) и каждый раз когда будет нажиматься кнопка Опубликовать все, будет создаваться бэкап текущих Решений.