Dela via


Så här rensar du ärvd åtkomst

Den här artikeln beskriver hur du tar bort ärvd åtkomst för poster när konfigurationen av en tabell ändras i Microsoft Dataverse.

Symptom

När det sammanhängande beteendet för en tabellrelation för åtgärden Reparent eller Share har ändrats till Ingen kaskad fortsätter du att ha åtkomst till de relaterade poster som ska tas bort.

Användare kan rapportera att de har oväntad åtkomst till poster. Det finns två sätt att verifiera åtkomsten till relaterade poster: med hjälp av funktionen Kontrollera åtkomst eller RetrieveAccessOrigin meddelandet.

Använda funktionen Kontrollera åtkomst

Använd funktionen Kontrollera åtkomst i modelldrivna appar för att kontrollera vem som har åtkomst till en post. Administratörer kan använda den här funktionen för att kontrollera enskilda användare eller alla användare som har åtkomst till en post.

När du använder åtkomstkontrollen visas en lista med orsaker till varför en användare har åtkomst. Några av dessa orsaker tyder på att delning beviljades på grund av åtkomst till en relaterad post. Till exempel:

  • Posten delades med mig eftersom jag har åtkomst till relaterad post.
  • Posten delades med team som jag är medlem i eftersom teamet har åtkomst till relaterade poster.

Använda meddelandet RetrieveAccessOrigin

Utvecklare kan använda meddelandet RetrieveAccessOrigin för att identifiera vilka användare som har åtkomst till en post. Det här meddelandet returnerar en mening som beskriver varför användaren har åtkomsten. Något av följande resultat indikerar att åtkomsten beviljades på grund av delning av en relaterad post:

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>)

Mer information finns i Ta reda på varför en användare har åtkomst med kod.

Orsak

När det sammanhängande beteendet för en tabellrelation ändras startar Dataverse ett asynkront jobb för att ta bort åtkomstanvändarna som tidigare beviljats. Det här jobbet kan dock misslyckas, vilket resulterar i att användare behåller åtkomsten.

Åtgärd

Det första steget för att lösa det här problemet är att återskapa systemjobbet för att ta bort åtkomsten. Om jobbet misslyckas kan en utvecklare använda ResetInheritedAccess meddelandet för att tillämpa ändringen på en angiven uppsättning poster.

Återskapa systemjobbet för att ta bort åtkomst

Utvecklare kan använda meddelandet CreateAsyncJobToRevokeInheritedAccess för att försöka skapa ett asynkront jobb igen.

Använd klassen 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);
}

Läs mer om att använda meddelanden med SDK för .NET.

Åtgärden CreateAsyncJobToRevokeInheritedAccess skapar ett nytt asynkront jobb med namnet RevokeInheritedAccess. Du kan övervaka jobbets framgång. Mer information finns i övervaka systemjobb eller hantera systemjobb med kod.

Återställa ärvd åtkomst

Om det inte går att återskapa systemjobbet för att ta bort åtkomst kan en utvecklare med behörighet som systemadministratör eller systemanpassare använda ResetInheritedAccess meddelandet för att rikta in sig på en delmängd matchande poster. Du kan behöva använda det här meddelandet flera gånger för att ta bort åtkomsten till alla poster.

/// <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"]);
}

Läs mer om att använda meddelanden med SDK för .NET.

Meddelandet ResetInheritedAccess försöker köra synkront när det inte finns många matchande poster. Sedan slutar värdet ResetInheritedAccessResponse med ExecutionMode : Sync. Om det finns många matchande poster tar åtgärden längre tid och värdet slutar med ExecutionMode : Async. Ett systemjobb med namnet Denormalization_PrincipalObjectAccess_principalobjectaccess:<caller ID> skapas och du kan övervaka jobbets framgång. Mer information finns i övervaka systemjobb eller hantera systemjobb med kod.

Meddelandet ResetInheritedAccess kräver en FetchXml-fråga för att identifiera posterna. Den här frågan måste uppfylla följande krav:

  • principalobjectaccessAnvänd tabellen (POA).
  • Returnera endast principalobjectaccessid kolumnen.
  • Får inte innehålla några link-entity element. Du kan inte lägga till en koppling till en annan tabell.
  • Filtrera endast efter kolumner i principalobjectaccess tabellen.

Den här tabellen är tillgänglig för webb-API:et som principalobjectaccess-entitetstyp. Den ingår inte i dataverse-tabellen/entitetsreferensen eftersom POA-tabellen inte stöder någon form av direkt dataändringsåtgärd. Du måste känna till kolumnerna i den här tabellen för att skapa FetchXml-frågan.

POA-tabellkolumner

Du behöver bara skapa en FetchXml-fråga med hjälp av dessa kolumner.

Logiskt namn Type Beskrivning
accessrightsmask Integer Innehåller de kombinerade AccessRights-uppräkningsmedlemsvärdena för de åtkomsträttigheter som huvudnamnet har direkt.
changedon Datum/tid Det sista datumet då huvudkontots åtkomst till posten ändrades.
inheritedaccessrightsmask Integer Innehåller de kombinerade AccessRights-uppräkningsmedlemsvärdena för de åtkomsträttigheter som tillämpas på grund av arv.
objectid Unik identifierare ID:t för posten som huvudkontot har åtkomst till.
objecttypecode Integer Värdet EntityMetadata.ObjectTypeCode som motsvarar tabellen. Det här värdet är inte nödvändigtvis detsamma för olika miljöer. För anpassade tabeller tilldelas den baserat på i vilken ordning tabellen skapades. För att få det här värdet kan du behöva visa metadata för tabellen. Det finns flera communityverktyg för att hitta detta. Här är en lösning från Microsoft: Bläddra bland tabelldefinitioner i din miljö.
principalid Unik identifierare ID:t för den användare eller det team som har åtkomst.
principalobjectaccessid Unik identifierare Primärnyckeln för POA-tabellen.
principaltypecode Integer Typkoden för huvudkontot. SystemUser = 8, Team = 9.

Följande AccessRights-uppräkningsmedlemsvärden gäller för kolumnerna accessrightsmask och inheritedaccessrightsmask :

Åtkomsttyp Värde beskrivning
None 0 Ingen åtkomst.
Read 1 Rätten att läsa en post.
Write 2 Rätten att uppdatera en post.
Append 4 Rätten att lägga till den angivna posten i en annan post.
AppendTo 16 Rätten att lägga till en annan post i den angivna posten.
Create 32 Rätten att skapa en post.
Delete 65 536 Rätten att ta bort en post.
Share 262,144 Rätten att dela en post.
Assign 524,288 Rätten att tilldela den angivna posten till en annan användare eller ett annat team.

Du kan se att värdet inheritedaccessrightsmask ofta är 135 069 719. Det här värdet innehåller alla åtkomsttyper förutom Create, vilket inte är nödvändigt eftersom dessa rättigheter endast gäller för poster som redan har skapats.

FetchXml-exempel

Det här avsnittet innehåller några exempel på FetchXml-frågor som du kan använda med meddelandet ResetInheritedAccess . Mer information finns i Använda FetchXML för att konstruera en fråga.

Återställa ärvd åtkomst som ges till en viss användare för ett visst konto
<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>
Återställ ärvd åtkomst som ges till alla underordnade rader för en angiven objekttyp
<fetch>
    <entity name="principalobjectaccess">
        <attribute name="principalobjectaccessid"/>
        <filter type="and">
            <condition attribute="objecttypecode" operator="eq" value="10042" />
        </filter>
    </entity>
</fetch>
Återställ ärvd åtkomst som ges till en angiven användare för alla objekttyper
<fetch>
    <entity name="principalobjectaccess">
        <attribute name="principalobjectaccessid"/>
        <filter type="and">
            <condition attribute="principalid" operator="eq" value="9b5f621b-584e-423f-99fd-4620bb00bf1f" />
        </filter>
    </entity>
</fetch>