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.

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 principalobjectaccesstabel (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 Createvan , 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>