Overgenomen toegang opschonen
In dit artikel wordt uitgelegd hoe u overgenomen toegang voor records verwijdert wanneer de trapsgewijze configuratie van een tabel wordt gewijzigd in Microsoft Dataverse.
Symptomen
Nadat het trapsgewijze gedrag van een tabelrelatie voor de actie Reparent of Delen is gewijzigd in Geen trapsgewijs, blijft u toegang hebben tot de gerelateerde records die moeten worden verwijderd.
De toegang tot gerelateerde records controleren
Gebruikers kunnen melden dat ze onverwachte toegang hebben tot records. Er zijn twee manieren waarop u de toegang tot de gerelateerde records kunt controleren: met behulp van de functie Toegang controleren of het RetrieveAccessOrigin
bericht.
De functie Toegang controleren gebruiken
Gebruik de functie Toegang controleren in modelgestuurde apps om te controleren wie toegang heeft tot een record. Beheerders kunnen deze functie gebruiken om afzonderlijke gebruikers of alle gebruikers die toegang hebben tot een record te controleren.
Wanneer u de toegangscontrole gebruikt, ziet u een lijst met redenen waarom een gebruiker toegang heeft. Sommige van deze redenen geven aan dat het delen is verleend vanwege toegang tot een gerelateerde record. Bijvoorbeeld:
- De record is met mij gedeeld omdat ik toegang heb tot de gerelateerde record.
- De record is gedeeld met team(s) waarvan ik lid ben omdat het team toegang heeft tot een gerelateerde record.
Het bericht RetrieveAccessOrigin gebruiken
Ontwikkelaars kunnen het RetrieveAccessOrigin
bericht gebruiken om te detecteren welke gebruikers toegang hebben tot een record. Dit bericht retourneert een zin waarin wordt beschreven waarom de gebruiker toegang heeft. Een van de volgende resultaten geeft aan dat de toegang is verleend vanwege het delen van een gerelateerde record:
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>)
Zie Bepalen waarom een gebruiker toegang heeft met code voor meer informatie.
Oorzaak
Wanneer het trapsgewijze gedrag voor een tabelrelatie verandert, start Dataverse een asynchrone taak om de toegang te verwijderen die gebruikers eerder zijn verleend. Deze taak kan echter mislukken, waardoor gebruikers toegang behouden.
Oplossing
De eerste stap om dit probleem op te lossen, bestaat uit het opnieuw maken van de systeemtaak om de toegang te verwijderen. Als de taak mislukt, kan een ontwikkelaar het ResetInheritedAccess
bericht gebruiken om de wijziging toe te passen op een opgegeven set records.
De systeemtaak opnieuw maken om de toegang te verwijderen
Ontwikkelaars kunnen het CreateAsyncJobToRevokeInheritedAccess
bericht gebruiken om opnieuw een asynchrone taak te maken.
Gebruik de klasse Microsoft.Xrm.Sdk.Messages.CreateAsyncJobToRevokeInheritedAccessRequest.
/// <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);
}
Meer informatie over het gebruik van berichten met de SDK voor .NET.
Met de CreateAsyncJobToRevokeInheritedAccess
actie maakt u een nieuwe asynchrone taak met de naam RevokeInheritedAccess
. U kunt het succes van deze taak controleren. Zie Systeemtaken bewaken of systeemtaken beheren met code voor meer informatie.
Overgenomen toegang opnieuw instellen
Als het opnieuw maken van de systeemtaak om toegang te verwijderen mislukt, kan een ontwikkelaar met bevoegdheden van de systeembeheerder of systeemaanpassing het ResetInheritedAccess
bericht gebruiken om een subset van overeenkomende records te richten. Mogelijk moet u dit bericht meerdere keren gebruiken om de toegang tot alle records te verwijderen.
/// <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"]);
}
Meer informatie over het gebruik van berichten met de SDK voor .NET.
Het ResetInheritedAccess
bericht probeert synchroon uit te voeren wanneer er niet veel overeenkomende records zijn. Vervolgens eindigt de ResetInheritedAccessResponse
waarde op ExecutionMode : Sync
. Als er veel overeenkomende records zijn, duurt de bewerking langer en eindigt de waarde op ExecutionMode : Async
. Er wordt een systeemtaak met de naam Denormalization_PrincipalObjectAccess_principalobjectaccess:<caller ID>
gemaakt en u kunt het succes van die taak controleren. Zie Systeemtaken bewaken of systeemtaken beheren met code voor meer informatie.
Voor het ResetInheritedAccess
bericht is een FetchXml-query vereist om de records te identificeren. Deze query moet voldoen aan de volgende vereisten:
- Gebruik de
principalobjectaccess
tabel (POA). - Alleen de
principalobjectaccessid
kolom retourneren. - Mag geen
link-entity
elementen bevatten. U kunt geen join toevoegen aan een andere tabel. - Filter alleen op kolommen van de
principalobjectaccess
tabel.
Deze tabel is beschikbaar voor de web-API als het entiteitstype principalobjectaccess. Deze is niet opgenomen in de tabel-/entiteitverwijzing van Dataverse , omdat de POA-tabel geen directe bewerking van gegevenswijziging ondersteunt. U moet de kolommen van deze tabel kennen om de FetchXml-query op te stellen.
POA-tabelkolommen
U moet een FetchXml-query opstellen met alleen deze kolommen.
Logische naam | Type | Omschrijving |
---|---|---|
accessrightsmask |
Geheel getal | Bevat de gecombineerde accessrights enum-ledenwaarden voor de toegangsrechten die de principal rechtstreeks heeft. |
changedon |
Datetime | De laatste datum waarop de toegang van de principal tot de record is gewijzigd. |
inheritedaccessrightsmask |
Geheel getal | Bevat de gecombineerde AccessRights- enum-ledenwaarden voor de toegangsrechten die worden toegepast vanwege overname. |
objectid |
Unieke id | De id van de record waartoe de principal toegang heeft. |
objecttypecode |
Geheel getal | De waarde EntityMetadata.ObjectTypeCode die overeenkomt met de tabel. Deze waarde is niet noodzakelijkerwijs hetzelfde voor verschillende omgevingen. Voor aangepaste tabellen wordt deze toegewezen op basis van de volgorde waarin de tabel is gemaakt. Als u deze waarde wilt ophalen, moet u mogelijk de metagegevens voor de tabel bekijken. Er zijn verschillende communityhulpprogramma's om dit te vinden. Hier volgt een oplossing van Microsoft: Door tabeldefinities bladeren in uw omgeving. |
principalid |
Unieke id | De id van de gebruiker of het team dat toegang heeft. |
principalobjectaccessid |
Unieke id | De primaire sleutel van de POA-tabel. |
principaltypecode |
Geheel getal | De typecode van de principal.
SystemUser = 8, Team = 9. |
De volgende accessrights enum-ledenwaarden zijn van toepassing op de accessrightsmask
kolommen en inheritedaccessrightsmask
:
Toegangstype | Waarde | Beschrijving |
---|---|---|
None |
0 | Geen toegang. |
Read |
1 | Het recht om een record te lezen. |
Write |
2 | Het recht om een record bij te werken. |
Append |
4 | Het recht om de opgegeven record toe te voegen aan een andere record. |
AppendTo |
16 | Het recht om een andere record toe te voegen aan de opgegeven record. |
Create |
32 | Het recht om een record te maken. |
Delete |
65,536 | Het recht om een record te verwijderen. |
Share |
262,144 | Het recht om een record te delen. |
Assign |
524,288 | Het recht om de opgegeven record toe te wijzen aan een andere gebruiker of team. |
Mogelijk ziet u dat de inheritedaccessrightsmask
waarde meestal 135.069.719 is. Deze waarde omvat alle toegangstypen, met uitzondering Create
van , die niet nodig is omdat deze rechten alleen van toepassing zijn op records die al zijn gemaakt.
FetchXml-voorbeelden
Deze sectie bevat enkele voorbeelden van FetchXml-query's die u met het ResetInheritedAccess
bericht kunt gebruiken. Zie FetchXML gebruiken om een query te maken voor meer informatie.
Overgenomen toegang die is verleend aan een bepaalde gebruiker voor een specifiek account opnieuw instellen
<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>
Overgenomen toegang voor alle onderliggende rijen voor een opgegeven objecttype opnieuw instellen
<fetch>
<entity name="principalobjectaccess">
<attribute name="principalobjectaccessid"/>
<filter type="and">
<condition attribute="objecttypecode" operator="eq" value="10042" />
</filter>
</entity>
</fetch>
Overgenomen toegang die is verleend aan een opgegeven gebruiker voor alle objecttypen opnieuw instellen
<fetch>
<entity name="principalobjectaccess">
<attribute name="principalobjectaccessid"/>
<filter type="and">
<condition attribute="principalid" operator="eq" value="9b5f621b-584e-423f-99fd-4620bb00bf1f" />
</filter>
</entity>
</fetch>