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.
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 Aktionen Reparentieren oder Freigeben in Kein Kaskadieren 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 die Funktion "Zugriff überprüfen" oder die RetrieveAccessOrigin Nachricht.
Verwenden der Funktion "Zugriff überprüfen"
Verwenden Sie die Funktion "Zugriff ü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:
- Der Datensatz wurde mit mir geteilt, weil ich Zugriff auf den zugehörigen Datensatz habe.
- Datensatz wurde für Team(en) freigegeben, in denen ich Mitglied bin, weil das Team Zugriff auf verwandte Datensätze hat.
Verwenden Sie die Nachricht RetrieveAccessOrigin
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 weist darauf hin, 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 den Zugriff zu entfernen, der den Benutzern zuvor gewährt wurde. Dieser Auftrag kann jedoch fehlschlagen, was dazu führt, dass Benutzer den Zugriff beibehalten.
Beschluss
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 Systemprozess 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 dieser Aufgabe überwachen, aber es gibt keine Möglichkeit, sich die Datensätze im Voraus anzusehen, die betroffen sind. 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 Systemanpasserberechtigungen die ResetInheritedAccess Nachricht verwenden, um eine Teilmenge der übereinstimmenden Datensätze anzusprechen. 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
principalobjectaccessidSpalte zurück. - Darf keine
link-entityElemente enthalten. Sie können keine Verknüpfung zu einer anderen Tabelle hinzufügen. - Filtern Sie nur nach Spalten der
principalobjectaccessTabelle.
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 | Typ | Beschreibung |
|---|---|---|
accessrightsmask |
Integer | Enthält die kombinierten AccessRights-Enum-Mitgliedswerte für die Zugriffsrechte, die der Prinzipal direkt hat. |
changedon |
Datum und Uhrzeit | Das letzte Datum, an dem der Zugriff des Schulleiters auf den Datensatz geändert wurde. |
inheritedaccessrightsmask |
Integer | Enthält die kombinierten AccessRights-Enumerationswerte für die Zugriffsrechte, die aufgrund der Vererbung angewendet werden. |
objectid |
Eindeutiger Bezeichner | Die ID des Datensatzes, auf den der Prinzipal Zugriff hat. |
objecttypecode |
Integer | 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 |
Integer | Der Typcode des Prinzipals.
SystemUser = 8, Team = 9. |
Die folgenden AccessRights Enum-Mitgliedswerte 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 | Das Recht, den angegebenen Datensatz an einen anderen Datensatz anzufügen. |
AppendTo |
16 | Das Recht, einen weiteren Datensatz an den angegebenen Datensatz anzufügen. |
Create |
32 | Das Recht, einen Datensatz zu erstellen. |
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 von Create, was nicht erforderlich ist, 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="aaaaaaaa-bbbb-cccc-1111-222222222222" />
<condition attribute="objectid" operator="eq" value="aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb" />
</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="aaaaaaaa-bbbb-cccc-1111-222222222222" />
</filter>
</entity>
</fetch>