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.
Como verificar o acesso a registros relacionados
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);
}
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"]);
}
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
principalobjectaccess
tabela (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 , Create
que 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>