Partilhar via


Como limpar o acesso herdado

Este artigo apresenta como remover o acesso herdado para registros quando a configuração em cascata de uma tabela é alterada no Microsoft Dataverse.

Sintomas

Depois que o comportamento em cascata de um relacionamento de tabela para a ação Reassociar ou Compartilhar for alterado para Sem Cascata, você continuará a ter acesso aos registros relacionados que devem ser removidos.

Os usuários podem relatar que têm acesso inesperado aos registros. Há duas maneiras de verificar o acesso aos registros relacionados: usando o recurso Verificar Acesso ou a RetrieveAccessOrigin mensagem.

Use o recurso Verificar acesso

Use o recurso Verificar Acesso em aplicativos baseados em modelo para verificar quem tem acesso a um registro. Os administradores podem usar esse recurso para verificar usuários individuais ou todos os usuários que têm acesso a um registro.

Ao usar o verificador de acesso, você verá uma lista de motivos pelos quais um usuário tem acesso. Alguns desses motivos indicam que o compartilhamento foi concedido devido ao acesso a um registro relacionado. Por exemplo:

  • O registro foi compartilhado comigo porque tenho acesso ao registro relacionado.
  • O registro foi compartilhado com a(s) equipe(s) da qual sou membro porque a equipe tem acesso ao registro relacionado.

Usar a mensagem RetrieveAccessOrigin

Os desenvolvedores podem usar a RetrieveAccessOrigin mensagem para detectar quais usuários têm acesso a um registro. Essa mensagem retorna uma frase que descreve por que o usuário tem acesso. Qualquer um dos seguintes resultados indica que o acesso foi concedido devido ao compartilhamento de um registro relacionado:

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

Para obter mais informações, consulte Determinar por que um usuário tem acesso com código.

Motivo

Quando o comportamento em cascata de uma relação de tabela é alterado, o Dataverse inicia um trabalho assíncrono para remover o acesso concedido anteriormente aos usuários. No entanto, esse trabalho pode falhar, resultando na retenção de acesso dos usuários.

Resolução

A primeira etapa para resolver esse problema é recriar o trabalho do sistema para remover o acesso. Se o trabalho falhar, um desenvolvedor poderá usar a ResetInheritedAccess mensagem para aplicar a alteração a um conjunto especificado de registros.

Recrie o trabalho do sistema para remover o acesso

Os desenvolvedores podem usar a mensagem para tentar criar um trabalho assíncrono CreateAsyncJobToRevokeInheritedAccess novamente.

Use a 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);
}

Saiba mais sobre como usar mensagens com o SDK para .NET.

A CreateAsyncJobToRevokeInheritedAccess ação cria um novo trabalho assíncrono chamado RevokeInheritedAccess. Você pode monitorar o sucesso deste trabalho. Para obter mais informações, consulte monitorando trabalhos do sistema ou gerenciando trabalhos do sistema com código.

Redefinir o acesso herdado

Se a recriação do trabalho do sistema para remover o acesso falhar, um desenvolvedor com privilégios de administrador do sistema ou personalizador do sistema poderá usar a ResetInheritedAccess mensagem para direcionar um subconjunto de registros correspondentes. Talvez seja necessário usar essa mensagem várias vezes para remover o acesso a todos os registros.

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

Saiba mais sobre como usar mensagens com o SDK para .NET.

A ResetInheritedAccess mensagem tenta ser executada de forma síncrona quando não há muitos registros correspondentes. Em seguida, o ResetInheritedAccessResponse valor termina com ExecutionMode : Sync. Se houver muitos registros correspondentes, a operação levará mais tempo e o valor terminará com ExecutionMode : Async. Um trabalho do sistema chamado Denormalization_PrincipalObjectAccess_principalobjectaccess:<caller ID> é criado e você pode monitorar o sucesso desse trabalho. Para obter mais informações, consulte monitorando trabalhos do sistema ou gerenciando trabalhos do sistema com código.

A ResetInheritedAccess mensagem requer uma consulta FetchXml para identificar os registros. Essa consulta deve atender aos seguintes requisitos:

  • Use a principalobjectaccesstabela (POA).
  • Retorna apenas a principalobjectaccessid coluna.
  • Não deve incluir nenhum link-entity elemento. Você não pode adicionar uma junção a outra tabela.
  • Filtre apenas as colunas da principalobjectaccess tabela.

Essa tabela está disponível para a API Web como o tipo de entidade principalobjectaccess. Ele não está incluído na referência de tabela/entidade do Dataverse porque a tabela POA não dá suporte a nenhum tipo de operação de modificação direta de dados. Você precisa conhecer as colunas dessa tabela para compor a consulta FetchXml.

Colunas da tabela POA

Você precisa compor uma consulta FetchXml usando apenas essas colunas.

Nome lógico Type Descrição
accessrightsmask Inteiro Contém os valores combinados de membro de enumeração AccessRights para os direitos de acesso que a entidade de segurança tem diretamente.
changedon Data e Hora A última data em que o acesso da entidade de segurança ao registro foi alterado.
inheritedaccessrightsmask Inteiro Contém os valores combinados de membro de enumeração AccessRights para os direitos de acesso aplicados devido à herança.
objectid Identificador Exclusivo A ID do registro ao qual a entidade de segurança tem acesso.
objecttypecode Inteiro O valor EntityMetadata.ObjectTypeCode que corresponde à tabela. Esse valor não é necessariamente o mesmo para ambientes diferentes. Para tabelas personalizadas, ele é atribuído com base na ordem em que a tabela foi criada. Para obter esse valor, talvez seja necessário exibir os metadados da tabela. Existem várias ferramentas da comunidade para encontrar isso. Aqui está uma solução da Microsoft: Procurar definições de tabela em seu ambiente.
principalid Identificador Exclusivo A ID do usuário ou da equipe que tem acesso.
principalobjectaccessid Identificador Exclusivo A chave primária da tabela POA.
principaltypecode Inteiro O código de tipo da entidade de segurança. SystemUser = 8, Team = 9.

Os seguintes valores de membro de enumeração AccessRights se aplicam às accessrightsmask colunas e inheritedaccessrightsmask :

Tipo de acesso Valor Descrição
None 0 Sem acesso.
Read 1 O direito de ler um registro.
Write 2 O direito de atualizar um registro.
Append 4 O direito de anexar o registro especificado a outro registro.
AppendTo 16 O direito de anexar outro registro ao registro especificado.
Create 32 O direito de criar um registro.
Delete 65.536 O direito de excluir um registro.
Share 262,144 O direito de compartilhar um registro.
Assign 524,288 O direito de atribuir o registro especificado a outro usuário ou equipe.

Você pode ver que o inheritedaccessrightsmask valor geralmente é 135.069.719. Esse valor inclui todos os tipos de acesso, exceto , Createque não é necessário porque esses direitos se aplicam apenas a registros já criados.

Exemplos de FetchXml

Esta seção inclui alguns exemplos de consultas FetchXml que você pode usar com a ResetInheritedAccess mensagem. Para obter mais informações, consulte Usar FetchXML para construir uma consulta.

Redefinir o acesso herdado concedido a um determinado usuário para uma conta específica
<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>
Redefinir o acesso herdado concedido a todas as linhas filho para um tipo de objeto especificado
<fetch>
    <entity name="principalobjectaccess">
        <attribute name="principalobjectaccessid"/>
        <filter type="and">
            <condition attribute="objecttypecode" operator="eq" value="10042" />
        </filter>
    </entity>
</fetch>
Redefinir o acesso herdado concedido a um usuário especificado para todos os tipos de objeto
<fetch>
    <entity name="principalobjectaccess">
        <attribute name="principalobjectaccessid"/>
        <filter type="and">
            <condition attribute="principalid" operator="eq" value="9b5f621b-584e-423f-99fd-4620bb00bf1f" />
        </filter>
    </entity>
</fetch>