Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Microsoft Project für das Web wird bald Microsoft Planner, die derzeit für Kunden eingeführt wird. Weitere Informationen zum Einrichten des neuen Planner für Ihre organization finden Sie unter Microsoft Planner für Administratoren.
Project for the Web ist standardmäßig zusammenarbeitend und ermöglicht allen lizenzierten Teammitgliedern vollzugriff auf das gesamte Projekt. Aber manchmal möchten Sie einige Teamkollegen daran hindern, Projekte zu löschen. In diesem Artikel wird erläutert, wie Sie ein Dataverse-Plug-In verwenden, um das Löschen von Projekten auch in Dynamics 365 Project Operations zu blockieren.
Sie können dieses Plug-In so ändern, dass die Berechtigung zum Löschen ausschließlich dem Projektbesitzer, dem Manager, einem Admin oder auf andere Weise erteilt wird. Darüber hinaus können Dataverse-Plug-Ins verwendet werden, um andere Vorgänge zu überprüfen oder zu ändern, die für Dataverse-Entitäten (Projekte, Aufgaben, Teams usw.) und deren Beziehung zu anderen Entitäten ausgeführt werden.
Voraussetzungen
Zugriff auf Administratorebene auf eine Microsoft Dataverse-Umgebung
Eine modellgesteuerte App, die das Konto und die Aufgabentabellen enthält
Tipp
Hilfe beim Erstellen einer solchen App erhalten Sie unter Erstellen Ihrer ersten modellgesteuerten App von Grund auf.
Visual Studio 2017 (oder höher)
Kenntnisse der Programmiersprache Visual C#
Das Plug-In-Registrierungstool
Tipp
Unter Herunterladen von Tools aus NuGet finden Sie Schritte zum Verwenden eines PowerShell-Skripts zum Herunterladen der neuesten Tools aus NuGet.
Erstellen eines neuen Dataverse-Plug-Ins in Visual Studio
Starten Sie Visual Studio.
Wählen Sie Neues Projekt erstellen aus.
Wählen Sie die Vorlagen klassenbibliothek (.NET Framework) und dann Weiter aus.
Benennen Sie Ihr Projekt, wählen Sie die .NET Framework 4.6.2 und dann Erstellen aus.
Benennen Sie die Klasse in Ihrer Projektmappe ProjectBlockDeletePlugin.cs. Dadurch wird es einfacher, Code zu lesen und seinen Zweck zu verstehen.
Hinzufügen eines NuGet-Pakets
Wählen Sie auf der oberen Symbolleiste Tools > NuGetPackageManager > NuGet-Pakete für Lösungen verwalten aus.
Suchen Sie auf der Registerkarte Durchsuchen nach Microsoft.CrmSdk.CoreAssemblies, und installieren Sie die neueste stabile Version für Ihr Projekt.
Registrieren Ihres Plug-Ins
Hinweis
- Sie erstellen ein Vorvalidierungs-Plug-In. Sie wird ausgeführt, wenn ein Vorgang (Löschen) für die Dataverse-Entität (Project) aufgerufen wird.
- Wenn jemand versucht, ein Projekt zu löschen, überprüft das Plug-In die GUID des Benutzers, der versucht, ein Projekt in Project für das Web zu löschen. Anschließend wird Dataverse überprüft, um festzustellen, ob der Benutzer zu einer Teams-Gruppe gehört, die Projekte löschen darf. Andernfalls bricht das Plug-In den Löschvorgang ab.
- Weitere Informationen zu den Möglichkeiten von Dataverse-Plug-Ins finden Sie in der Offiziellen Dataverse-Plug-In-Dokumentation.
Öffnen Sie die neue Klassendatei (ProjectBlockDeletePlugin.cs), und fügen Sie den folgenden Klassencode ein, ersetzen Sie jedoch die GUID für die Team-ID, die die Berechtigung zum Löschen erhält. Die GUID finden Sie in 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; } } } } }
Wichtig
Stellen Sie sicher, dass Ihre Klasse öffentlich ist und ProjectBlockDeletePlugin.cs benannt ist.
Signieren Der Assembly
Wählen Sie Projektmappen-Explorer im Kontextmenü ihres neuen Plug-Ins Eigenschaften aus.
Wählen Sie auf der Registerkarte Signierendie Option Assembly signieren und dann in den Dropdownoptionen neu aus.
Schließen Sie das Dialogfeld Schlüssel für starken Namen erstellen ab.
Wählen Sie im Kontextmenü Ihres Projekts Erstellen aus.
Registrieren Ihres Dataverse-Plug-Ins
Starten Sie das Plug-In-Registrierungstool.
Wählen Sie Neue Verbindung erstellen aus, und geben Sie dann das Konto ein, über das Sie das Plug-In bei Dataverse registrieren möchten.
Wählen Sie Register > Register New Assembly (Neue Assembly registrieren) aus.
Laden Sie die Assembly aus der .DLL-Datei in den Debugordner Ihres Projekts.
Wählen Sie Ausgewählte Plug-Ins registrieren aus.
Wählen Sie in der Liste der registrierten Plug-Ins im Kontextmenü Ihrer Plug-In-Assembly die Option Neuen Schritt registrieren aus.
Registrieren Sie den Vorvalidierungsschritt, um das Plug-In auszuführen, wenn jemand versucht, einen Löschvorgang für eine msdyn_project Entität auszuführen:
Testen Des neuen Plug-Ins
- Öffnen Sie Project für das Web mit einem Konto, das sich nicht in der Gruppe befindet, die löschen kann (das Sie in das Plug-In integriert haben).
- Versuchen Sie in der Project-Tabelle , eine Zeile zu löschen.
- Wenn Ihr Plug-In funktioniert, schlägt ihr Versuch mit einer Warnung fehl ("Sie verfügen nicht über die Berechtigung zum Löschen von Projekten. Die Löschberechtigung ist nur...").