Condividi tramite


Come pulire l'accesso ereditato

Questo articolo illustra come rimuovere l'accesso ereditato per i record quando la configurazione a catena di una tabella cambia in Microsoft Dataverse.

Sintomi

Dopo che il comportamento a catena di una relazione di tabella per l'azione Reparent o Share viene modificato in Nessuna catena, si continua ad avere accesso ai record correlati che devono essere rimossi.

Gli utenti possono segnalare che hanno accesso imprevisto ai record. Esistono due modi per verificare l'accesso ai record correlati: usando la funzionalità Verifica accesso o il RetrieveAccessOrigin messaggio.

Usare la funzionalità Verifica accesso

Usare la funzionalità Verifica accesso nelle app basate su modello per verificare chi può accedere a un record. Gli amministratori possono usare questa funzionalità per controllare singoli utenti o tutti gli utenti che hanno accesso a un record.

Quando si usa il controllo di accesso, viene visualizzato un elenco dei motivi per cui un utente ha accesso. Alcuni di questi motivi indicano che la condivisione è stata concessa a causa dell'accesso a un record correlato. Ad esempio:

  • Il record è stato condiviso con l'utente corrente perché ho accesso al record correlato.
  • Il record è stato condiviso con i team di cui sono membro perché il team ha accesso al record correlato.

Usare il messaggio RetrieveAccessOrigin

Gli sviluppatori possono usare il RetrieveAccessOrigin messaggio per rilevare quali utenti hanno accesso a un record. Questo messaggio restituisce una frase che descrive il motivo per cui l'utente ha accesso. Uno dei risultati seguenti indica che l'accesso è stato concesso a causa della condivisione di un record correlato:

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

Per altre informazioni, vedere Determinare il motivo per cui un utente ha accesso con codice.

Causa

Quando cambia il comportamento a catena per una relazione di tabella, Dataverse avvia un processo asincrono per rimuovere gli utenti di accesso precedentemente concessi. Tuttavia, questo processo potrebbe non riuscire, consentendo agli utenti di mantenere l'accesso.

Risoluzione

Il primo passaggio per risolvere questo problema consiste nel ricreare il processo di sistema per rimuovere l'accesso. Se il processo non riesce, uno sviluppatore può usare il ResetInheritedAccess messaggio per applicare la modifica a un set specificato di record.

Ricreare il processo di sistema per rimuovere l'accesso

Gli sviluppatori possono usare il CreateAsyncJobToRevokeInheritedAccess messaggio per provare di nuovo a creare un processo asincrono.

Usare la classe 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);
}

Altre informazioni sull'uso dei messaggi con l'SDK per .NET.

L'azione CreateAsyncJobToRevokeInheritedAccess crea un nuovo processo asincrono denominato RevokeInheritedAccess. È possibile monitorare l'esito positivo di questo processo. Per altre informazioni, vedere Monitoraggio dei processi di sistema o gestione dei processi di sistema con codice.

Reimpostare l'accesso ereditato

Se la ricreazione del processo di sistema per rimuovere l'accesso ha esito negativo, uno sviluppatore con privilegi di amministratore di sistema o di addetto alla personalizzazione del sistema può usare il ResetInheritedAccess messaggio per specificare come destinazione un subset di record corrispondenti. Potrebbe essere necessario usare questo messaggio più volte per rimuovere l'accesso a tutti i record.

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

Altre informazioni sull'uso dei messaggi con l'SDK per .NET.

Il ResetInheritedAccess messaggio tenta di eseguire in modo sincrono quando non sono presenti molti record corrispondenti. Il ResetInheritedAccessResponse valore termina quindi con ExecutionMode : Sync. Se sono presenti molti record corrispondenti, l'operazione richiede più tempo e il valore termina con ExecutionMode : Async. Viene creato un processo di sistema denominato Denormalization_PrincipalObjectAccess_principalobjectaccess:<caller ID> ed è possibile monitorare l'esito positivo del processo. Per altre informazioni, vedere Monitoraggio dei processi di sistema o gestione dei processi di sistema con codice.

Il ResetInheritedAccess messaggio richiede una query FetchXml per identificare i record. Questa query deve soddisfare i requisiti seguenti:

  • Usare la principalobjectaccesstabella (POA).
  • Restituisce solo la principalobjectaccessid colonna.
  • Non deve includere elementi link-entity . Non è possibile aggiungere un join a un'altra tabella.
  • Filtra solo le colonne della principalobjectaccess tabella.

Questa tabella è disponibile per l'API Web come tipo di entità principalobjectaccess. Non è incluso nel riferimento di tabella/entità Dataverse perché la tabella POA non supporta alcun tipo di operazione di modifica diretta dei dati. È necessario conoscere le colonne di questa tabella per comporre la query FetchXml.

Colonne della tabella POA

È necessario comporre una query FetchXml usando solo queste colonne.

Nome logico Type Descrizione
accessrightsmask Intero Contiene i valori combinati dei membri di enumerazione AccessRights per i diritti di accesso che l'entità ha direttamente.
changedon Data/Ora Data dell'ultima modifica dell'accesso dell'entità al record.
inheritedaccessrightsmask Intero Contiene i valori combinati dei membri di enumerazione AccessRights per i diritti di accesso applicati a causa dell'ereditarietà.
objectid Identificatore univoco ID del record a cui l'entità ha accesso.
objecttypecode Intero Valore EntityMetadata.ObjectTypeCode corrispondente alla tabella. Questo valore non è necessariamente lo stesso per ambienti diversi. Per le tabelle personalizzate, viene assegnato in base all'ordine in cui è stata creata la tabella. Per ottenere questo valore, potrebbe essere necessario visualizzare i metadati per la tabella. Sono disponibili diversi strumenti della community per trovarlo. Ecco una soluzione di Microsoft: Esplorare le definizioni di tabella nell'ambiente in uso.
principalid Identificatore univoco ID dell'utente o del team che ha accesso.
principalobjectaccessid Identificatore univoco Chiave primaria della tabella POA.
principaltypecode Intero Codice di tipo dell'entità. SystemUser = 8, Team = 9.

I valori dei membri di enumerazione AccessRights seguenti si applicano alle accessrightsmask colonne e inheritedaccessrightsmask :

Tipo di accesso valore Descrizione
None 0 Nessun accesso.
Read 1 Diritto di leggere un record.
Write 2 Diritto di aggiornare un record.
Append 4 Diritto di accodare il record specificato a un altro record.
AppendTo 16 Diritto di accodare un altro record al record specificato.
Create 32 Diritto di creare un record.
Delete 65.536 Diritto di eliminare un record.
Share 262,144 Diritto di condividere un record.
Assign 524,288 Diritto di assegnare il record specificato a un altro utente o team.

È possibile notare che il inheritedaccessrightsmask valore è in genere 135.069.719. Questo valore include tutti i tipi di accesso ad eccezione Createdi , che non è necessario perché questi diritti si applicano solo ai record già creati.

Esempi di FetchXml

Questa sezione include alcuni esempi di query FetchXml che è possibile usare con il ResetInheritedAccess messaggio. Per altre informazioni, vedere Usare FetchXML per costruire una query.

Reimpostare l'accesso ereditato assegnato a un determinato utente per un account specifico
<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>
Reimpostare l'accesso ereditato assegnato a tutte le righe figlio per un tipo di oggetto specificato
<fetch>
    <entity name="principalobjectaccess">
        <attribute name="principalobjectaccessid"/>
        <filter type="and">
            <condition attribute="objecttypecode" operator="eq" value="10042" />
        </filter>
    </entity>
</fetch>
Reimpostare l'accesso ereditato assegnato a un utente specificato per tutti i tipi di oggetto
<fetch>
    <entity name="principalobjectaccess">
        <attribute name="principalobjectaccessid"/>
        <filter type="and">
            <condition attribute="principalid" operator="eq" value="9b5f621b-584e-423f-99fd-4620bb00bf1f" />
        </filter>
    </entity>
</fetch>