Поделиться через


Предотвращение удаления проектов в среде Project путем создания подключаемого модуля Microsoft Dataverse

Microsoft Project в Интернете скоро станет Планировщик (Майкрософт), которая в настоящее время развертывается для клиентов. Дополнительные сведения о настройке нового Планировщик для организации см. в разделе Планировщик (Майкрософт) для администраторов.

Project for the Web является совместным проектом и предоставляет всем лицензированным участникам команды полный доступ ко всему проекту. Но иногда требуется, чтобы некоторые товарищи по команде не удаляли проекты. В этой статье объясняется, как использовать подключаемый модуль Dataverse для блокировки удаления проектов даже в Dynamics 365 Project Operations.

Этот подключаемый модуль можно изменить, чтобы предоставить разрешение на удаление только владельцу проекта, руководителю, Администратор или иным образом. Кроме того, подключаемые модули Dataverse можно использовать для проверки или изменения любой другой операции, выполняемой с сущностями Dataverse (проекты, задачи, Teams и т. д.) и их связи с другими сущностями.

Предварительные условия

Создание подключаемого модуля Dataverse в Visual Studio

  1. Запустите Visual Studio.

  2. Выберите Создать проект.

  3. Выберите шаблоны Библиотека классов (платформа .NET Framework) и нажмите кнопку Далее.

    Выберите шаблон библиотеки классов.

  4. Присвойте проекту имя, выберите платформа .NET Framework 4.6.2 и нажмите кнопку Создать.

    Создайте библиотеку классов.

  5. Назовите класс в ProjectBlockDeletePlugin.cs решения проекта. Это облегчит чтение в коде и понять его назначение.

Добавление пакета NuGet

  1. На верхней панели инструментов выберите Инструменты > NuGetPackageManager > Управление пакетами NuGet для решений.

  2. На вкладке Обзор найдите Microsoft.CrmSdk.CoreAssemblies и установите последнюю стабильную версию проекта.

    Установите Microsoft.CrmSdk.CoreAssemblies.

Регистрация подключаемого модуля

Примечание.

  • Вы создаете подключаемый модуль предварительной проверки. Он выполняется при вызове операции (Delete) для сущности Dataverse (Project).
  • Когда кто-то пытается удалить проект, подключаемый модуль проверяет GUID пользователя, который пытается удалить проект в Project для Интернета. Затем он проверяет Dataverse, чтобы узнать, принадлежит ли пользователь к группе Teams, которой разрешено удалять проекты. В противном случае подключаемый модуль отменяет операцию удаления.
  • Дополнительные сведения о контексте и документации о том, что можно сделать с подключаемыми модулями Dataverse, см. в официальной документации по dataverse Plug-In.
  1. Откройте новый файл класса (ProjectBlockDeletePlugin.cs) и вставьте следующий код класса, но замените GUID идентификатора группы, который получает право на удаление. Идентификатор GUID можно найти в PowerApps Data Explorer.

     using System;
     using Microsoft.Xrm.Sdk;
     using Microsoft.Xrm.Sdk.Query;
     using System.ServiceModel;
     using Microsoft.Xrm.Sdk.Messages;
     namespace PluginTest.Plugins
    {
     public class ProjectBlockDeletePlugin : IPlugin
       {
         public void Execute(IServiceProvider serviceProvider)
         {
           // Obtain the tracing service
           ITracingService tracingService =
           (ITracingService)serviceProvider.GetService(typeof(ITracingService));
    
           // Obtain the execution context from the service provider.  
           IPluginExecutionContext context = (IPluginExecutionContext)
               serviceProvider.GetService(typeof(IPluginExecutionContext));
    
           // The InputParameters collection contains all the data passed in the message request.  
           if (context.InputParameters.Contains("Target") &&
               context.InputParameters["Target"] is EntityReference)
           {
               // Obtain the target entity from the input parameters.  
               EntityReference projectEntityRef = context.InputParameters["Target"] as EntityReference;
    
               // Obtain the organization service reference which you will need for  
               // web service calls.  
               IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
               IOrganizationService service = serviceFactory.CreateOrganizationService(context.InitiatingUserId);
    
               try
               {
                   // TODO: Manually set which team has Delete privileges
                   Guid TeamWithDeletePrivilegeId = new Guid("0f96b130-c72c-ec11-b6e5-000d3a59eeac");
    
                   // Create the queryExpression for the team entity query
                   QueryExpression query = new QueryExpression("team");
                   query.ColumnSet = new ColumnSet("teamid");
    
                   // Create a Relationship collection query for the user <-> team relationship
                   Relationship teamMembershipRelationship = new Relationship("teammembership_association");
                   RelationshipQueryCollection relationshipCollectionQuery = new RelationshipQueryCollection();
                   relationshipCollectionQuery.Add(teamMembershipRelationship, query);
    
                   // Create a service RetrieveRequest with the system user - the user who launches the plugin - and all the teams the user is related to.
                   RetrieveRequest request = new RetrieveRequest();
                   request.RelatedEntitiesQuery = relationshipCollectionQuery;
                   request.Target = new EntityReference("systemuser", context.InitiatingUserId);
                   request.ColumnSet = new ColumnSet(true);
    
                   // Execute the RetrieveRequest
                   RetrieveResponse userWithTeamRelationships = (RetrieveResponse)service.Execute(request);
    
                   // Loop through all teams that the user is related to find if they belong the team with delete permissions
                   bool userCanDelete = false;
                   foreach (Entity entity in userWithTeamRelationships.Entity.RelatedEntities[teamMembershipRelationship].Entities)
                   {
                       if ((Guid)entity.Attributes["teamid"] == TeamWithDeletePrivilegeId)
                       {
                           userCanDelete = true;
                           break;
                       };
                   }
    
                   // Throw an exception if the user doesn't have permission to delete - aborting the Delete Operation.
                   if (!userCanDelete)
                   {
    
                       // Optional: retrieve the team name with delete privilege for error message,
                       string TeamWithDeletePrivilegeName = service.Retrieve("team", TeamWithDeletePrivilegeId, new ColumnSet("name")).Attributes["name"].ToString();
    
                       throw new InvalidPluginExecutionException("You do not have permission to delete projects. Delete permission is only granted to members of the \"" + TeamWithDeletePrivilegeName + "\" team.");
                   }
    
               }
    
               catch (FaultException<OrganizationServiceFault> ex)
               {
                   throw new InvalidPluginExecutionException("An error occurred in ProjectBlockDeletePlugin.", ex);
               }
    
               catch (Exception ex)
               {
                   tracingService.Trace("ProjectBlockDeletePlugin: {0}", ex.ToString());
                   throw;
               }
           }
         }
       }
    }
    
    

Важно!

Убедитесь, что ваш класс является общедоступным и называется ProjectBlockDeletePlugin.cs.

Подпись сборки

  1. В Обозреватель решений в контекстном меню нового подключаемого модуля выберите Свойства.

  2. На вкладке Подписывание выберите Подписать сборку, а затем выберите Создать... в раскрывающемся списке.

    {alt-text}

  3. Завершите диалоговое окно Создание ключа строгого имени .

  4. В контекстном меню проекта выберите Сборка.

Регистрация подключаемого модуля Dataverse

  1. Запустите средство регистрации подключаемого модуля.

  2. Выберите Создать новое подключение, а затем введите учетную запись, из которой вы хотите зарегистрировать подключаемый модуль в Dataverse.

    Создание нового подключения к Dataverse

  3. Выберите Зарегистрировать > новую сборку.

    Регистрация новой сборки

  4. Загрузите сборку из файла .DLL в папке Отладка проекта.

  5. Выберите Зарегистрировать выбранные подключаемые модули.

  6. В списке зарегистрированных подключаемых модулей выберите Зарегистрировать новый шаг в контекстном меню сборки подключаемого модуля.

    Регистрация шага сборки

  7. Зарегистрируйте шаг предварительной проверки, чтобы запустить подключаемый модуль, когда кто-то пытается выполнить операцию удаления для сущности msdyn_project :

    Завершение регистрации

Тестирование нового подключаемого модуля

  1. Откройте Project в Интернете с помощью учетной записи, которая не входит в группу, которая может удалить (которую вы встроили в подключаемый модуль).
  2. В таблице Project попытайтесь удалить строку.
  3. Если подключаемый модуль работает, попытка завершится ошибкой с предупреждением ("У вас нет разрешения на удаление проектов. Разрешение на удаление — только...").

Дальнейшие действия