Разработка
25
Ноя
0

PowerShell своими руками

PowerShell – отличное решение для выполнения повторяющихся или административных задач в MS CRM. MS CRM SDK предоставляет готовую библиотеку для взаимодействия с CRM. Но если ее возможностей не достаточно, то ничего не мешает Вам написать свои собственные cmdlet (набор команд для PowerShell).

Рассмотрим, как это можно сделать:

  • Откройте Visual Studio и создайте проект библиотеки классов;
  • Помимо стандартных библиотек для работы с CRM, добавьте ссылку на библиотеку System.Management.Automation.
    Если таковой нет в Вашей системе, то установите ее через NuGET:

    Install-Package System.Management.Automation
  • Замените код на следующий:
    using System;
    using System.ServiceModel.Description;
    
    using System.Management.Automation;
    
    using Microsoft.Xrm.Client.Services;
    using Microsoft.Xrm.Sdk;
    using Microsoft.Xrm.Sdk.Client;
    
    namespace My.Crm.PowerShell
    {
    
        // Команды в PowerShell именуются парой глагол-существительное
        // В данном случае команда будет называться Add-OrganizationService
        [Cmdlet(VerbsCommon.Get, "OrganizationService")]
    
        // Наследуемся от класса Cmdlet
        public class Get_OrganizationService : Cmdlet
        {
            [Parameter(Mandatory = true, HelpMessage = "CRM URL")] // Определяем параметр как обязательный.
            [ValidateNotNullOrEmpty] // Проверяем что параметр заполнен
            public string CRMURL { get; set; }
    
            [Parameter(Mandatory = true, HelpMessage = "User Login")]
            [ValidateNotNullOrEmpty]
            public string Login { get; set; }
    
            [Parameter(Mandatory = true, HelpMessage = "User Password")]
            [ValidateNotNullOrEmpty]
            public string Pass { get; set; }
    
            protected override void ProcessRecord()
            {
                // Подключаемся к CRM
                ClientCredentials credentials = new ClientCredentials();
                credentials.Windows.ClientCredential = new System.Net.NetworkCredential(Login, Pass, "D2012");
                Uri uri = new Uri(CRMURL + "/XRMServices/2011/Organization.svc");
                OrganizationServiceProxy proxy = new OrganizationServiceProxy(uri, null, credentials, null);
                proxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
                IOrganizationService service = (IOrganizationService)proxy;
    
                // Выводим сообщение в консоли PowerShell
                WriteVerbose("Connect to CRM.");
    
                // Возвращаем объект в PowerShell
                WriteObject(service);            
            }
        }
    
        [Cmdlet(VerbsCommon.Add, "Account")]
        public class Create_Contact: Cmdlet
        {
            [Parameter(Mandatory = true, HelpMessage = "CRM Organization service")]
            [ValidateNotNullOrEmpty]
            public OrganizationService service { get; set; }
    
            [Parameter(Mandatory = true, HelpMessage = "Account Name")]
            [ValidateNotNullOrEmpty]
            public string Name { get; set; }
    
            [Parameter(Mandatory = true, HelpMessage = "Ownership Type Code")]
            [ValidateRange(1, 4)] // Проверка на введенный диапазон значений
            public int OwnerShipCode { get; set; }
    
            // Переопределяем метод ProcessRecord, чтобы обеспечить обработку кода PowerShell'ом
            protected override void ProcessRecord()
            {
                Entity acc = new Entity("account");
                acc["name"] = Name; // Строка
                acc["ownershipcode"] = new OptionSetValue(OwnerShipCode); // Пиклист
    
                Guid accountId = service.Create(acc);
                WriteVerbose("Create Account with ID: " + accountId.ToString());
            }
        }
    }
    

    Что тут у нас есть:

    • У нас тут два класса, наследуемых от базового класса cmdlet (который обеспечивает минимальный набор зависимостей среды выполнения PowerShell). Над каждым классом определено имя команды PowerShell, посредством которых будет происходить обращение к этим классам. По стандартам PowerShell имя команды рекомендуется задавать в виде «Глагол-Существительное». Например:
      Get-OrganizationService
    • Класс Get_OrganizationService подключается к организации CRM. На входе принимает URL до организации и логин/пароль. Все параметры обязательные. Возвращает в PowerShell объект подключения;
    • Класс Create_Account, к понятно из названия, создает в CRM запись организации. На входе принимает название Организации и код пиклиста Тип собственности. При этом для кода пиклиста установлена проверка введенного диапазона значений.
  • Создайте и запустите в папке, в которой скомпилирован проект, следующий PowerShell-скрипт:
    # Получаем путь до текущей папки
    $ScriptPath = $(Split-Path -Path $script:MyInvocation.MyCommand.Path);
    
    # Подключем необходимые сборки
    Add-Type -Path $($ScriptPath + "\microsoft.xrm.sdk.dll");
    Import-Module -Name $($ScriptPath + "\My.Crm.PowerShell.dll");
    
    # Определяем параметры подключения к CRM
    $CrmUrl = "http://crm2015/superfirma";
    $login = "Administrator";
    $Pass= "1qaz@WSX";
    
    # Подключаемся к CRM
    $organizationService = Get-OrganizationService -CRMURL $CrmUrl -Login $login -Pass $Pass -Verbose:$true;
    
    if($organizationService)
    {
        # Значения полей для CRM
        $Name = "Test123";
        $OwnerShipCode = 2;
         
        # Создаем запись
        Add-Account -service $organizationService -Name $Name -OwnerShipCode $OwnerShipCode -Verbose:$true;
    } 
    

    Код делает следующее:

    • Получает путь до текущей папки;
    • Подключает нужные библиотеки (в том числе скомпилированную текущим проектом);
    • Вызывает Cmdlet Get-OrganizationService, который мы определили в проекте.
      Обратите внимание, что мы возвращаем объект подключения к организации CRM прямо в PowerShell, где можем работать с ним так же как в C# — обращаться к его методам и свойствам. Далее этот объект можно повторно использовать для вызова методов CRM SDK. Это сделано исключительно для примера, потому что создать подключение и выполнить GRUD операцию можно и в одном Cmdlet;
    • Если соединение установлено – вызываем Cmdlet Add-Account для создания записи Организации.


Комментарии (0)

*

code