Freigeben und Zuweisen

In diesem Artikel befassen wir uns mit dem Sicherheitszugriff beim Teilen und Zuweisen von Datensätzen.

Freigeben von Datensätzen

Das Freigeben ermöglicht es Benutzern, anderen Benutzern oder Teams Zugriff auf spezifische Kundeninformationen zu gewähren. Das Freigeben von Datensätzen ist nützlich für die gemeinsame Nutzung von Informationen mit Benutzern in Rollen, die nur die Zugriffsebene Basic haben. Beispiel: In einer Organisation, die Verkäufern Basic Lese- und Schreibzugriff auf Konten gewährt, kann ein Verkäufer eine Verkaufschance mit einem anderen Verkäufer teilen, damit beide den Fortschritt eines wichtigen Verkaufs verfolgen können.

Aus Sicherheitsgründen sollten Sie es sich zur Gewohnheit machen, nur die notwendigen Datensätze der kleinstmöglichen Benutzergruppe freizugeben. Gewähren Sie nur den minimalen Zugriff, den Benutzer benötigen, um ihre Arbeit zu erledigen. Ein Benutzer hat möglicherweise Zugriff auf den gleichen Datensatz in mehreren Kontexten. Beispielsweise kann ein Benutzer möglicherweise einen Datensatz direkt mit spezifischen Zugriffsrechten freigeben, und er ist möglicherweise auch in einem Team, in dem derselbe Datensatz mit unterschiedlichen Zugriffsrechten freigegeben ist. In diesem Fall sind die Zugriffsrechte, über die dieser Benutzer für den Datensatz verfügt, die Vereinigung aller Rechte.

Wenn Sie einen Datensatz für einen anderen Benutzer mi der GrantAccess-Nachricht freigeben, müssen Sie angeben, welche Zugriffsrechte Sie dem anderen Benutzer gewähren möchten. Verwenden Sie die Nachricht ModifyAccess, um den Zugriff eines freigegebenen Datensatzes zu aktivieren. Zugriffsrechte auf einen freigegebenen Datensatz können für jeden Benutzer anders sein, für den der Datensatz freigegeben wird. Allerdings können Sie einem Benutzer keine Rechte geben, die er nicht auch für diesen Tabellentyp hätte, basierend auf der Rolle, die diesem Benutzer zugewiesen wurde. Wenn ein Benutzer z. B. keine Leseberechtigung für Konten hat und Sie ein Konto mit diesem Benutzer teilen, kann der Benutzer dieses Konto nicht sehen.

GrantAccess-Beispiel

Diese Beispiele zeigen die Verwendung der GrantAccess-Nachricht, um einen Datensatz mit einem anderen Prinzipal zu teilen.

Die folgende statische Methode ShareRecord zeigt, wie die PrincipalAccess-Klasse verwendet wird, um einen Verweis auf einen Prinzipal (Benutzer, Team oder Organisation) mit einer Reihe von AccessRights anzugeben, die die Rechte enthalten, die dem Auftraggeber zu gewähren sind.

/// <summary>
/// Shares a record with a principal
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
/// <param name="principal">The user, team, or organization to share the record with.</param>
/// <param name="access">The access rights to grant</param>
/// <param name="record">The record to share</param>
static void ShareRecord(
   IOrganizationService service,
   EntityReference principal,
   AccessRights access,
   EntityReference record)
{

   PrincipalAccess principalAccess = new()
   {
         AccessMask = access,
         Principal = principal
   };

   GrantAccessRequest request = new()
   {
         PrincipalAccess = principalAccess,
         Target = record
   };

   service.Execute(request);
}

ModifyAccess-Beispiel

Diese Beispiele zeigen die Verwendung der ModifyAccess-Nachricht zum Ändern des Zugriffs, der einem Prinzipal für einen freigegebenen Datensatz gewährt wird.

Die folgende statische Methode ModifyShare zeigt, wie die PrincipalAccess-Klasse verwendet wird, um einen Verweis auf einen Prinzipal (Benutzer, Team oder Organisation) mit einer Reihe von AccessRights anzugeben, die die Rechte enthalten, die für den Prinzipal geändert werden.

/// <summary>
/// Modifies the access to a shared record.
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
/// <param name="principal">The user, team, or organization to modify rights to the shared.</param>
/// <param name="access">The access rights to modify</param>
/// <param name="record">The shared record</param>
static void ModifyShare(
   IOrganizationService service,
   EntityReference principal,
   AccessRights access,
   EntityReference record)
{
   PrincipalAccess principalAccess = new()
   {
         AccessMask = access,
         Principal = principal
   };

   ModifyAccessRequest request = new()
   {

         PrincipalAccess = principalAccess,
         Target = record
   };

   service.Execute(request);
}

Freigabe und Vererbung

Wenn ein Datensatz erstellt wird und der übergeordneten Datensatz über bestimmte Freigabeneigenschaften verfügt, erbt der neue Datensatz diese Eigenschaften. Beispielsweise arbeiten Joe und Mike an einem Lead mit hoher Priorität. Joe erstellt einen neuen Lead und zwei Aktivitäten, gibt den Lead für Mike frei und wählt eine überlappende Freigabe. Mike führt ein Telefongespräch und sendet eine E-Mail wegen dem neuen Lead. Joe sieht, dass Mike das Unternehmen zweimal kontaktiert hat, deshalb ruft Joe nicht nochmal an.

Die Freigabe wird für einzelne Datensätze verwaltet. Ein Datensatz erbt die Freigabeeigenschaften von seinem Übergeordneten und verwaltet seine eigenen Freigabeeigenschaften. Daher kann ein Datensatz zwei Sätze von Freigabeeigenschaften haben – einen, den er selbst hat, und einen, den er von seinem übergeordneten Benutzer erbt.

Beim Entfernen der Freigabe eines übergeordneten Datensatzes werden die Freigabeeigenschaften von Objekten (Datensätzen), die er vom übergeordneten Datensatz erbte, entfernt. Das bedeutet, dass für alle Benutzer, für die dieser Datensatz zuvor sichtbar war, er nun nicht mehr sichtbar ist. Untergeordnete Objekte könnten für einige dieser Benutzer freigegeben werden, wenn sie einzeln freigegeben würden und nicht vom übergeordneten Datensatz.

Datensätze zuweisen

Jeder mit Zuweisen Zugriffsrechten auf einen Datensatz kann diesen Datensatz einem anderen Benutzer zuweisen. Um einen Datensatz zuzuweisen, ändern Sie den ownerid-Suchwert, um auf einen neuen Prinzipal zu verweisen.

Hinweis

Das SDK verfügt über eine AssignRequest-Klasse, die veraltet ist. Weitere Informationen: Veraltete Update-Nachrichten

Wenn ein Datensatz zugeordnet wird, wird der neue Benutzer, das neue Team oder die neue Organisation der Besitzer des Datensatzes und der damit verknüpften Datensätze. Die ursprünglichen Besitzer, also Benutzer, Team oder Organisation, verlieren den Besitz des Datensatzes, geben ihn aber automatisch für den neuen Besitzer frei.

In Microsoft Dataverse kann der Systemadministrator für eine Organisation entscheiden, ob Datensätze nach dem Zuweisungsvorgang für vorherige Eigentümern freigegeben werden sollen oder nicht. Wenn Neu zugewiesene Datensätze mit dem ursprünglichen Besitzer teilen ausgewählt ist (siehe Systemeinstellungen > Allgemein), dann teilt der vorherige Besitzer den Datensatz mit allen Zugriffsrechten nach dem Zuweisungsvorgang. Andernfalls hat der bisherige Besitzer keine Freigabe für den Datensatz und kann auf den Datensatz möglicherweise nicht zugreifen, abhängig von den Zugriffsrechten. Die Spalte ShareToPreviousOwnerOnAssign der Tabelle Organization steuert diese Einstellung.

Hinweis

Die Termintabelle verfügt über eine spezielle Logik, wenn ein Termin einem anderen Benutzer zugewiesen wird. Wenn der aktuelle Besitzer noch ein Teilnehmer wie z. B. der Organisator oder ein Teilnehmer ist, wird der Termindatensatz mit diesem Benutzer geteilt, wenn der Termin neu zugewiesen wird. Dieses Verhalten tritt auch dann auf, wenn die Neu zugewiesene Datensätze mit dem ursprünglichen Besitzer teilen-Einstellung deaktiviert ist. Da der Termin möglicherweise mit dem vorherigen Besitzer geteilt wird, benötigt der Benutzer, der das Meeting zuweist, die Zuordnen- und Teilen-Zugriffsrechte auf den Datensatz.

Zugriff widerrufen

Der Besitzer des Datensatzes kann mithilfe der RevokeAccess-Nachricht den Benutzerzugriff auf den freigegebenen Datensatz widerrufen (entfernen).

Die folgende statische Methode RevokeShare zeigt, wie einem Benutzer der Freigabezugriff auf einen Datensatz mithilfe der RevokeAccessRequest-Klasse entzogen wird.

/// <summary>
/// Revokes access to a shared record.
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
/// <param name="principal">The user, team, or organization to revoke rights to the shared record.</param>
/// <param name="record">The shared record</param>
static void RevokeShare(
   IOrganizationService service,
   EntityReference principal,
   EntityReference record)
{
   RevokeAccessRequest request = new()
   {
         Revokee = principal,
         Target = record
   };

   service.Execute(request);
}

Weitere Informationen: Freigeben Zugriff

Bestimmen, warum ein Benutzer über Zugriff verfügt

Die Funktion Zugriff überprüfen in modellgesteuerten Apps stellt Informationen bereit, damit Benutzer verstehen können, warum ein Benutzer Zugriff auf einen Datensatz hat. Um diese Informationen mit Code abzurufen, verwenden Sie die Nachricht RetrieveAccessOrigin. Wenn Informationen zu einem bestimmten Benutzer und Datensatz übergeben werden, gibt diese Nachricht einen Satz zurück, der beschreibt, warum der Benutzer Zugriff hat. Im Folgenden sind die möglichen Antworten aufgeführt, wenn der Vorgang erfolgreich ist:

Access origin could not be determined because FCB is disabled.
PrincipalId is object owner (<record ID>)
PrincipalId is member of team (<team ID>) who is object owner (<record ID>)
PrincipalId is member of organization (<organization ID>) who is object owner (<record ID>)
PrincipalId has access to (<hierarchy security principal ID>) through hierarchy security. (<hierarchy security principal ID>) is object owner (<record ID>)
PrincipalId has direct poa access to object (<record ID>)
PrincipalId is member of team (<team ID>) who has poa access to object (<record ID>)
PrincipalId is member of organization (<organization ID>) who has poa access to object (<record ID>)
PrincipalId is owner of a parent entity of object (<child record ID>)
PrincipalId is member of team (<team ID>) who is owner of a parent entity of object (<child record ID>)
PrincipalId is member of organization (<organization ID>) who is owner of a parent entity of object (<child record ID>)
PrincipalId has access to (<hierarchy security principal ID>) through hierarchy security. (<hierarchy security principal ID>) is owner of a parent entity of object (<child record ID>)
PrincipalId has poa access to object's root entity (<child record ID>)
PrincipalId is member of team (<team ID>) who has poa access to object's root entity (<child record ID>)
PrincipalId is member of organization (<organization ID>) who has poa access to object's root entity (<child record ID>)
Access origin could not be found. Access does not come from POA table or object ownership.

Hinweis

Derzeit gibt es im SDK keine Klasse RetrieveAccessOriginRequest oder RetrieveAccessOriginResponse. Um diese Nachricht zu verwenden, müssen Sie die Klassen OrganizationRequest und OrganizationResponse verwenden. Weitere Informationen zur Verwendung von Nachrichten mit dem SDK für .NET.

/// <summary>
/// Describes why a principal (systemuser or team) has access to a record.
/// </summary>
/// <param name="service">The authenticated IOrganizationService instance to use.</param>
/// <param name="objectId">The unique identifier of a record.</param>
/// <param name="tableLogicalName">The logical name of the table for the record in the ObjectId parameter.</param>
/// <param name="principalId">The unique identifier of the systemuser or team record.</param>
/// <returns>A sentence explaining why the principal has access to a record.</returns>
public static void OutputRetrieveAccessOrigin(IOrganizationService service,
    Guid objectId,
    string tableLogicalName,
    Guid principalId)
{
 
    var parameters = new ParameterCollection()
        {
            { "ObjectId", objectId},
            { "LogicalName", tableLogicalName},
            { "PrincipalId", principalId}
        };
 
    var request = new OrganizationRequest()
    {
        RequestName = "RetrieveAccessOrigin",
        Parameters = parameters
    };
 
    var response = service.Execute(request);
 
    Console.WriteLine(response.Results["Response"]);
}

Beispielausgabe: PrincipalId is object owner (e41ac31a-dcdf-ed11-a7c7-000d3a993550)

Siehe auch

Beispiel: Datensätze mithilfe von GrantAccess, ModifyAccess und RevokeAccess Nachrichten teilen

Hinweis

Können Sie uns Ihre Präferenzen für die Dokumentationssprache mitteilen? Nehmen Sie an einer kurzen Umfrage teil. (Beachten Sie, dass diese Umfrage auf Englisch ist.)

Die Umfrage dauert etwa sieben Minuten. Es werden keine personenbezogenen Daten erhoben. (Datenschutzbestimmungen).