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.
So überprüfen Sie den Zugriff auf verwandte Datensätze
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
principalobjectaccess
Tabelle (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 Create
der 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>