Overgenomen toegang opschonen
In dit artikel wordt uitgelegd hoe u overgenomen toegang voor records verwijdert wanneer de trapsgewijze configuratie van een tabel in Microsoft Dataverse verandert.
Symptomen
Nadat het trapsgewijze gedrag van een tabelrelatie voor de actie Reparent of Delen is gewijzigd in Geen trapsgewijs, hebt u nog steeds toegang tot de gerelateerde records die moeten worden verwijderd.
De toegang tot gerelateerde records controleren
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 te controleren die toegang hebben tot een record.
Wanneer u de toegangscontrole gebruikt, ziet u een lijst met redenen waarom een gebruiker toegang heeft. Enkele 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 gerelateerde records.
- De record is gedeeld met team(s) waarvan ik lid ben omdat het team toegang heeft tot gerelateerde records.
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 de 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 toegangsgebruikers te verwijderen. Deze taak kan echter mislukken, waardoor gebruikers toegang behouden.
Oplossing
De eerste stap om dit probleem op te lossen, is 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 een asynchrone taak opnieuw 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 wordt een nieuwe asynchrone taak met de naam RevokeInheritedAccess
gemaakt. U kunt het succes van deze taak controleren, maar er is geen manier om een voorbeeld van de records te bekijken die worden beïnvloed. Zie systeemtaken bewaken of systeemtaken beheren met code voor meer informatie.
Overgenomen toegang opnieuw instellen
Als het opnieuw maken van de systeemtaak om de toegang te verwijderen mislukt, kan een ontwikkelaar met bevoegdheden voor 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 met ExecutionMode : Sync
. Als er veel overeenkomende records zijn, duurt de bewerking langer en eindigt de waarde met 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 ResetInheritedAccess
het bericht is een FetchXml-query vereist om de records te identificeren. Deze query moet voldoen aan de volgende vereisten:
- Gebruik de
principalobjectaccess
tabel (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. Het is niet opgenomen in de Dataverse-tabel-/entiteitsverwijzing omdat de POA-tabel geen ondersteuning biedt voor een bewerking voor het wijzigen van directe gegevens. 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 | Description |
---|---|---|
accessrightsmask |
Geheel getal | Bevat de gecombineerde accessRights-enum-ledenwaarden voor de toegangsrechten die de principal rechtstreeks heeft. |
changedon |
DateTime | De laatste datum waarop de principal toegang heeft 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: Blader door tabeldefinities in uw omgeving. |
principalid |
Unieke id | De id van de gebruiker of het team die 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-enumlidwaarden zijn van toepassing op de accessrightsmask
en inheritedaccessrightsmask
kolommen:
Toegangstype | Weergegeven als | 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 een ander team. |
Mogelijk ziet u dat de inheritedaccessrightsmask
waarde doorgaans 135.069.719 is. Deze waarde omvat alle toegangstypen, met uitzondering van Create
, 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 voor een bepaald 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 opnieuw instellen voor een opgegeven gebruiker voor alle objecttypen
<fetch>
<entity name="principalobjectaccess">
<attribute name="principalobjectaccessid"/>
<filter type="and">
<condition attribute="principalid" operator="eq" value="9b5f621b-584e-423f-99fd-4620bb00bf1f" />
</filter>
</entity>
</fetch>