Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Microsoft Project в Интернете скоро станет Планировщик (Майкрософт), которая в настоящее время развертывается для клиентов. Дополнительные сведения о настройке нового Планировщик для организации см. в разделе Планировщик (Майкрософт) для администраторов.
Project for the Web является совместным проектом и предоставляет всем лицензированным участникам команды полный доступ ко всему проекту. Но иногда требуется, чтобы некоторые товарищи по команде не удаляли проекты. В этой статье объясняется, как использовать подключаемый модуль Dataverse для блокировки удаления проектов даже в Dynamics 365 Project Operations.
Этот подключаемый модуль можно изменить, чтобы предоставить разрешение на удаление только владельцу проекта, руководителю, Администратор или иным образом. Кроме того, подключаемые модули Dataverse можно использовать для проверки или изменения любой другой операции, выполняемой с сущностями Dataverse (проекты, задачи, Teams и т. д.) и их связи с другими сущностями.
Предварительные условия
Доступ на уровне администратора к среде Microsoft Dataverse
Приложение на основе модели, включающее таблицы учетных записей и задач.
Совет
Сведения о создании такого приложения см. в статье Создание первого приложения на основе модели с нуля.
Visual Studio 2017 (или более поздняя версия)
Знание языка программирования Visual C#
Средство регистрации подключаемого модуля
Совет
Перейдите в раздел Скачивание средств из NuGet , чтобы с помощью скрипта PowerShell скачать последние средства из NuGet.
Создание подключаемого модуля Dataverse в Visual Studio
Запустите Visual Studio.
Выберите Создать проект.
Выберите шаблоны Библиотека классов (платформа .NET Framework) и нажмите кнопку Далее.
Присвойте проекту имя, выберите платформа .NET Framework 4.6.2 и нажмите кнопку Создать.
Назовите класс в ProjectBlockDeletePlugin.cs решения проекта. Это облегчит чтение в коде и понять его назначение.
Добавление пакета NuGet
На верхней панели инструментов выберите Инструменты > NuGetPackageManager > Управление пакетами NuGet для решений.
На вкладке Обзор найдите Microsoft.CrmSdk.CoreAssemblies и установите последнюю стабильную версию проекта.
Регистрация подключаемого модуля
Примечание.
- Вы создаете подключаемый модуль предварительной проверки. Он выполняется при вызове операции (Delete) для сущности Dataverse (Project).
- Когда кто-то пытается удалить проект, подключаемый модуль проверяет GUID пользователя, который пытается удалить проект в Project для Интернета. Затем он проверяет Dataverse, чтобы узнать, принадлежит ли пользователь к группе Teams, которой разрешено удалять проекты. В противном случае подключаемый модуль отменяет операцию удаления.
- Дополнительные сведения о контексте и документации о том, что можно сделать с подключаемыми модулями Dataverse, см. в официальной документации по dataverse Plug-In.
Откройте новый файл класса (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.
Подпись сборки
В Обозреватель решений в контекстном меню нового подключаемого модуля выберите Свойства.
На вкладке Подписывание выберите Подписать сборку, а затем выберите Создать... в раскрывающемся списке.
Завершите диалоговое окно Создание ключа строгого имени .
В контекстном меню проекта выберите Сборка.
Регистрация подключаемого модуля Dataverse
Запустите средство регистрации подключаемого модуля.
Выберите Создать новое подключение, а затем введите учетную запись, из которой вы хотите зарегистрировать подключаемый модуль в Dataverse.
Выберите Зарегистрировать > новую сборку.
Загрузите сборку из файла .DLL в папке Отладка проекта.
Выберите Зарегистрировать выбранные подключаемые модули.
В списке зарегистрированных подключаемых модулей выберите Зарегистрировать новый шаг в контекстном меню сборки подключаемого модуля.
Зарегистрируйте шаг предварительной проверки, чтобы запустить подключаемый модуль, когда кто-то пытается выполнить операцию удаления для сущности msdyn_project :
Тестирование нового подключаемого модуля
- Откройте Project в Интернете с помощью учетной записи, которая не входит в группу, которая может удалить (которую вы встроили в подключаемый модуль).
- В таблице Project попытайтесь удалить строку.
- Если подключаемый модуль работает, попытка завершится ошибкой с предупреждением ("У вас нет разрешения на удаление проектов. Разрешение на удаление — только...").