Freigeben über


Bereinigen des geerbten Zugriffs

In diesem Artikel wird erläutert, wie Sie geerbten Zugriff für Datensätze entfernen, wenn sich die kaskadierte Konfiguration einer Tabelle in Microsoft Dataverse ändert.

Symptome

Nachdem das Cascading-Verhalten einer Tabellenbeziehung für die Aktion "Aktualisieren " oder "Freigeben " in "Keine Weitergabe" geändert wurde, haben Sie weiterhin Zugriff auf die zugehörigen Datensätze, die entfernt werden sollen.

Benutzer können melden, dass sie unerwarteten Zugriff auf Datensätze haben. Es gibt zwei Möglichkeiten, den Zugriff auf die zugehörigen Datensätze zu überprüfen: verwenden Sie das Feature "Access überprüfen" oder die RetrieveAccessOrigin Nachricht.

Verwenden der Funktion "Zugriff überprüfen"

Verwenden Sie das Feature "Access überprüfen" in modellgesteuerten Apps, um zu überprüfen, wer Zugriff auf einen Datensatz hat. Administratoren können dieses Feature verwenden, um einzelne Benutzer oder alle Benutzer zu überprüfen, die Zugriff auf einen Datensatz haben.

Wenn Sie die Zugriffsüberprüfung verwenden, wird eine Liste der Gründe angezeigt, warum ein Benutzer Zugriff hat. Einige dieser Gründe deuten darauf hin, dass die Freigabe aufgrund des Zugriffs auf einen verknüpften Datensatz gewährt wurde. Zum Beispiel:

  • Datensatz wurde für mich freigegeben, weil ich Zugriff auf verwandte Datensätze habe.
  • Datensatz wurde für Team(en) freigegeben, in denen ich Mitglied bin, weil das Team Zugriff auf verwandte Datensätze hat.

Verwenden der RetrieveAccessOrigin-Nachricht

Entwickler können die RetrieveAccessOrigin Meldung verwenden, um zu erkennen, welche Benutzer Zugriff auf einen Datensatz haben. Diese Nachricht gibt einen Satz zurück, der beschreibt, warum der Benutzer über den Zugriff verfügt. Jedes der folgenden Ergebnisse gibt an, dass der Zugriff aufgrund der Freigabe eines verknüpften Datensatzes gewährt wurde:

PrincipalId is owner of a parent entity of object (<record ID>)
PrincipalId is member of team (<team ID>) who is owner of a parent entity of object (<record ID>)
PrincipalId is member of organization (<organization ID>) who is owner of a parent entity of object (<record ID>)
PrincipalId has access to (<parent record ID>) through hierarchy security. (<parent record ID>) is owner of a parent entity of object (<record ID>)

Weitere Informationen finden Sie unter Ermitteln, warum ein Benutzer Zugriff mit Code hat.

Ursache

Wenn sich das Cascading-Verhalten für eine Tabellenbeziehung ändert, startet Dataverse einen asynchronen Auftrag, um die Zugriffsbenutzer zu entfernen, die zuvor erteilt wurden. Dieser Auftrag kann jedoch fehlschlagen, was dazu führt, dass Benutzer den Zugriff beibehalten.

Lösung

Der erste Schritt zur Behebung dieses Problems besteht darin, den Systemauftrag neu zu erstellen, um den Zugriff zu entfernen. Wenn der Auftrag fehlschlägt, kann ein Entwickler die ResetInheritedAccess Nachricht verwenden, um die Änderung auf eine bestimmte Gruppe von Datensätzen anzuwenden.

Erstellen Sie den Systemauftrag neu, um den Zugriff zu entfernen.

Entwickler können die CreateAsyncJobToRevokeInheritedAccess Meldung verwenden, um erneut einen asynchronen Auftrag zu erstellen.

Verwenden Sie die Microsoft.Xrm.Sdk.Messages.CreateAsyncJobToRevokeInheritedAccessRequest-Klasse.

/// <summary>
/// Creates and executes an asynchronous cleanup job to revoke inherited access granted through cascading inheritance.
/// </summary>
/// <param name="service">The authenticated IOrganizationService instance to use.</param>
/// <param name="relationshipSchemaName">The schema name of the entity relationship.</param>
public static void CreateAsyncJobToRevokeInheritedAccessExample(IOrganizationService service, string relationshipSchemaName)
{
    var request = new Microsoft.Xrm.Sdk.Messages.CreateAsyncJobToRevokeInheritedAccessRequest()
    {
        RelationshipSchema = relationshipSchemaName
    };

    service.Execute(request);
}

Weitere Informationen zur Verwendung von Nachrichten mit dem SDK für .NET.

Die CreateAsyncJobToRevokeInheritedAccess Aktion erstellt einen neuen asynchronen Auftrag namens RevokeInheritedAccess. Sie können den Erfolg dieses Auftrags überwachen. Weitere Informationen finden Sie unter Überwachen von Systemaufträgen oder Verwalten von Systemaufträgen mit Code.

Geerbten Zugriff zurücksetzen

Wenn das Erneute Erstellen des Systemauftrags zum Entfernen des Zugriffs fehlschlägt, kann ein Entwickler mit Systemadministrator- oder Systempasserberechtigungen die ResetInheritedAccess Nachricht verwenden, um eine Teilmenge der übereinstimmenden Datensätze abzuzielen. Möglicherweise müssen Sie diese Nachricht mehrmals verwenden, um den Zugriff auf alle Datensätze zu entfernen.

/// <summary>
/// Resets the inherited access for the matching records.
/// </summary>
/// <param name="service">The authenticated IOrganizationService instance to use.</param>
/// <param name="fetchXml">The fetchxml query.</param>
public static void OutputResetInheritedAccess(IOrganizationService service, string fetchXml)
{
    var parameters = new ParameterCollection()
    {
        { "FetchXml", fetchXml}
    };

    var request = new OrganizationRequest()
    {
        RequestName = "ResetInheritedAccess",
        Parameters = parameters
    };

    var response = service.Execute(request);

    Console.WriteLine(response.Results["ResetInheritedAccessResponse"]);
}

Weitere Informationen zur Verwendung von Nachrichten mit dem SDK für .NET.

Die ResetInheritedAccess Nachricht versucht, synchron auszuführen, wenn nicht viele übereinstimmende Datensätze vorhanden sind. Dann endet der ResetInheritedAccessResponse Wert mit ExecutionMode : Sync. Wenn viele übereinstimmende Datensätze vorhanden sind, dauert der Vorgang länger, und der Wert endet mit ExecutionMode : Async. Ein benannter Denormalization_PrincipalObjectAccess_principalobjectaccess:<caller ID> Systemauftrag wird erstellt, und Sie können den Erfolg dieses Auftrags überwachen. Weitere Informationen finden Sie unter Überwachen von Systemaufträgen oder Verwalten von Systemaufträgen mit Code.

Für die ResetInheritedAccess Nachricht ist eine FetchXml-Abfrage erforderlich, um die Datensätze zu identifizieren. Diese Abfrage muss die folgenden Anforderungen erfüllen:

  • Verwenden Sie die principalobjectaccessTabelle (POA).
  • Gibt nur die principalobjectaccessid Spalte zurück.
  • Darf keine link-entity Elemente enthalten. Sie können keine Verknüpfung zu einer anderen Tabelle hinzufügen.
  • Filtern Sie nur nach Spalten der principalobjectaccess Tabelle.

Diese Tabelle ist für die Web-API als Entitätstyp "principalobjectaccess" verfügbar. Sie ist nicht im Dataverse-Tabellen-/Entitätsverweis enthalten, da die POA-Tabelle keine Art von direkten Datenänderungsvorgang unterstützt. Sie müssen die Spalten dieser Tabelle kennen, um die FetchXml-Abfrage zu verfassen.

POA-Tabellenspalten

Sie müssen eine FetchXml-Abfrage nur mit diesen Spalten verfassen.

Logischer Name Type Beschreibung
accessrightsmask Ganzzahl Enthält die kombinierten AccessRights-Enumerationsmemberwerte für die Zugriffsrechte, die der Prinzipal direkt hat.
changedon DateTime Das letzte Datum, an dem der Zugriff des Prinzipals auf den Datensatz geändert wurde.
inheritedaccessrightsmask Ganzzahl Enthält die kombinierten AccessRights-Enumerationsmemberwerte für die Zugriffsrechte, die aufgrund der Vererbung angewendet werden.
objectid Eindeutiger Bezeichner Die ID des Datensatzes, auf den der Prinzipal Zugriff hat.
objecttypecode Ganzzahl Der EntityMetadata.ObjectTypeCode-Wert , der der Tabelle entspricht. Dieser Wert ist nicht unbedingt für verschiedene Umgebungen identisch. Bei benutzerdefinierten Tabellen wird sie basierend auf der Reihenfolge zugewiesen, in der die Tabelle erstellt wurde. Um diesen Wert abzurufen, müssen Sie möglicherweise die Metadaten für die Tabelle anzeigen. Es gibt mehrere Communitytools, um dies zu finden. Hier ist eine Lösung von Microsoft: Durchsuchen von Tabellendefinitionen in Ihrer Umgebung.
principalid Eindeutiger Bezeichner Die ID des Benutzers oder Teams, der Zugriff hat.
principalobjectaccessid Eindeutiger Bezeichner Der Primärschlüssel der POA-Tabelle.
principaltypecode Ganzzahl Der Typcode des Prinzipals. SystemUser = 8, Team = 9.

Die folgenden AccessRights-Enumerationsmemberwerte gelten für die accessrightsmask und inheritedaccessrightsmask spalten:

Zugriffstyp Wert Beschreibung
None 0 Kein Zugriff.
Read 1 Das Recht zum Lesen eines Datensatzes.
Write 2 Das Recht, einen Datensatz zu aktualisieren.
Append 4 Rechts, um den angegebenen Datensatz an einen anderen Datensatz anzufügen.
AppendTo 16 Rechts, um einen anderen Datensatz an den angegebenen Datensatz anzufügen.
Create 32 Das Recht zum Erstellen eines Datensatzes.
Delete 65.536 Das Recht, einen Datensatz zu löschen.
Share 262,144 Das Recht, einen Datensatz zu teilen.
Assign 524,288 Das Recht, den angegebenen Datensatz einem anderen Benutzer oder Team zuzuweisen.

Möglicherweise sehen Sie, dass der inheritedaccessrightsmask Wert in der Regel 135.069.719 beträgt. Dieser Wert enthält alle Zugriffstypen mit Ausnahme Createder erforderlichen Elemente, da diese Rechte nur für bereits erstellte Datensätze gelten.

FetchXml-Beispiele

Dieser Abschnitt enthält einige Beispiele für FetchXml-Abfragen, die Sie möglicherweise mit der ResetInheritedAccess Nachricht verwenden. Weitere Informationen finden Sie unter Verwenden Sie FetchXML, um eine Abfrage zu erstellen.

Setzen Sie den geerbten Zugriff zurück, der einem bestimmten Benutzer für ein bestimmtes Konto gewährt wurde
<fetch>
    <entity name="principalobjectaccess">
        <attribute name="principalobjectaccessid"/>
        <filter type="and">
            <condition attribute="principalid" operator="eq" value="9b5f621b-584e-423f-99fd-4620bb00bf1f" />
            <condition attribute="objectid" operator="eq" value="B52B7A48-EAFB-ED11-884B-00224809B6C7" />
        </filter>
    </entity>
</fetch>
Setzen Sie den geerbten Zugriff zurück, der allen untergeordneten Zeilen für einen angegebenen Objekttyp gewährt wurde
<fetch>
    <entity name="principalobjectaccess">
        <attribute name="principalobjectaccessid"/>
        <filter type="and">
            <condition attribute="objecttypecode" operator="eq" value="10042" />
        </filter>
    </entity>
</fetch>
Setzen Sie den geerbten Zugriff zurück, der einem bestimmten Benutzer für alle Objekttypen gewährt wurde
<fetch>
    <entity name="principalobjectaccess">
        <attribute name="principalobjectaccessid"/>
        <filter type="and">
            <condition attribute="principalid" operator="eq" value="9b5f621b-584e-423f-99fd-4620bb00bf1f" />
        </filter>
    </entity>
</fetch>