Freigeben über


Verhindern des Löschens von Projekten in einer Projektumgebung durch Erstellen eines Microsoft Dataverse-Plug-Ins

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

Erstellen eines neuen Dataverse-Plug-Ins in Visual Studio

  1. Starten Sie Visual Studio.

  2. Wählen Sie Neues Projekt erstellen aus.

  3. Wählen Sie die Vorlagen klassenbibliothek (.NET Framework) und dann Weiter aus.

    Wählen Sie Ihre Klassenbibliotheksvorlage aus.

  4. Benennen Sie Ihr Projekt, wählen Sie die .NET Framework 4.6.2 und dann Erstellen aus.

    Erstellen Sie Ihre Klassenbibliothek.

  5. 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

  1. Wählen Sie auf der oberen Symbolleiste Tools > NuGetPackageManager > NuGet-Pakete für Lösungen verwalten aus.

  2. Suchen Sie auf der Registerkarte Durchsuchen nach Microsoft.CrmSdk.CoreAssemblies, und installieren Sie die neueste stabile Version für Ihr Projekt.

    Installieren Sie Microsoft.CrmSdk.CoreAssemblies.

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.
  1. Ö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

  1. Wählen Sie Projektmappen-Explorer im Kontextmenü ihres neuen Plug-Ins Eigenschaften aus.

  2. Wählen Sie auf der Registerkarte Signierendie Option Assembly signieren und dann in den Dropdownoptionen neu aus.

    {alt-text}

  3. Schließen Sie das Dialogfeld Schlüssel für starken Namen erstellen ab.

  4. Wählen Sie im Kontextmenü Ihres Projekts Erstellen aus.

Registrieren Ihres Dataverse-Plug-Ins

  1. Starten Sie das Plug-In-Registrierungstool.

  2. 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.

    Erstellen einer neuen Verbindung mit Dataverse

  3. Wählen Sie Register > Register New Assembly (Neue Assembly registrieren) aus.

    Registrieren Der neuen Assembly

  4. Laden Sie die Assembly aus der .DLL-Datei in den Debugordner Ihres Projekts.

  5. Wählen Sie Ausgewählte Plug-Ins registrieren aus.

  6. Wählen Sie in der Liste der registrierten Plug-Ins im Kontextmenü Ihrer Plug-In-Assembly die Option Neuen Schritt registrieren aus.

    Registrieren eines Assemblyschritts

  7. 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:

    Registrierung abschließen

Testen Des neuen Plug-Ins

  1. Ö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).
  2. Versuchen Sie in der Project-Tabelle , eine Zeile zu löschen.
  3. 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...").

Nächste Schritte