Udostępnij za pośrednictwem


Jak wyczyścić dostęp dziedziczony

W tym artykule przedstawiono sposób usuwania dziedziczonego dostępu dla rekordów po zmianie kaskadowej konfiguracji tabeli w usłudze Microsoft Dataverse.

Symptomy

Po zmianie kaskadowego zachowania relacji tabeli dla akcji Reparent lub Share na Brak kaskady nadal będziesz mieć dostęp do powiązanych rekordów, które powinny zostać usunięte.

Użytkownicy mogą zgłaszać, że mają nieoczekiwany dostęp do rekordów. Istnieją dwa sposoby weryfikowania dostępu do powiązanych rekordów: za pomocą funkcji Sprawdź dostęp lub komunikatu RetrieveAccessOrigin .

Korzystanie z funkcji Sprawdzanie dostępu

Użyj funkcji Sprawdzanie dostępu w aplikacjach opartych na modelu, aby sprawdzić, kto ma dostęp do rekordu. Administratorzy mogą używać tej funkcji do sprawdzania poszczególnych użytkowników lub wszystkich użytkowników, którzy mają dostęp do rekordu.

Podczas korzystania z narzędzia sprawdzania dostępu zostanie wyświetlona lista przyczyn, dla których użytkownik ma dostęp. Niektóre z tych powodów wskazują, że udostępnianie zostało przyznane z powodu dostępu do powiązanego rekordu. Przykład:

  • Rekord został mi udostępniony, ponieważ mam dostęp do powiązanego rekordu.
  • Rekord został udostępniony zespołom, których jestem członkiem, ponieważ zespół ma dostęp do powiązanego rekordu.

Użyj komunikatu RetrieveAccessOrigin

Deweloperzy mogą użyć komunikatu RetrieveAccessOrigin , aby wykryć, którzy użytkownicy mają dostęp do rekordu. Ten komunikat zwraca zdanie opisujące, dlaczego użytkownik ma dostęp. Dowolny z następujących wyników wskazuje, że dostęp został udzielony z powodu udostępniania powiązanego rekordu:

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

Aby uzyskać więcej informacji, zobacz Określanie, dlaczego użytkownik ma dostęp za pomocą kodu.

Przyczyna

Po zmianie kaskadowego zachowania relacji tabeli usługa Dataverse uruchamia zadanie asynchroniczne w celu usunięcia użytkowników dostępu, którym udzielono wcześniej dostępu. Jednak to zadanie może zakończyć się niepowodzeniem, co spowoduje, że użytkownicy zachowają dostęp.

Rozwiązanie

Pierwszym krokiem rozwiązania tego problemu jest ponowne utworzenie zadania systemowego w celu usunięcia dostępu. Jeśli zadanie nie powiedzie się, deweloper może użyć komunikatu ResetInheritedAccess , aby zastosować zmianę do określonego zestawu rekordów.

Ponowne tworzenie zadania systemowego w celu usunięcia dostępu

Deweloperzy mogą użyć tego komunikatu CreateAsyncJobToRevokeInheritedAccess , aby spróbować ponownie utworzyć zadanie asynchroniczne.

Użyj klasy 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);
}

Dowiedz się więcej na temat korzystania z komunikatów z zestawem SDK dla platformy .NET.

Akcja CreateAsyncJobToRevokeInheritedAccess tworzy nowe zadanie asynchroniczne o nazwie RevokeInheritedAccess. Możesz monitorować powodzenie tego zadania. Aby uzyskać więcej informacji, zobacz monitorowanie zadań systemowych lub zarządzanie zadaniami systemowych przy użyciu kodu.

Resetowanie dostępu dziedziczonego

Jeśli ponowne utworzenie zadania systemowego w celu usunięcia dostępu zakończy się niepowodzeniem, deweloper z uprawnieniami administratora systemu lub konfiguratora systemu może użyć komunikatu ResetInheritedAccess do kierowania podzestawu pasujących rekordów. Może być konieczne użycie tego komunikatu kilka razy, aby usunąć dostęp do wszystkich rekordów.

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

Dowiedz się więcej na temat korzystania z komunikatów z zestawem SDK dla platformy .NET.

Komunikat ResetInheritedAccess próbuje wykonać synchronicznie, gdy nie ma wielu pasujących rekordów. ResetInheritedAccessResponse Następnie wartość kończy się wartością ExecutionMode : Sync. Jeśli istnieje wiele pasujących rekordów, operacja trwa dłużej, a wartość kończy się wartością ExecutionMode : Async. Zostanie utworzone zadanie systemowe o nazwie Denormalization_PrincipalObjectAccess_principalobjectaccess:<caller ID> i można monitorować powodzenie tego zadania. Aby uzyskać więcej informacji, zobacz monitorowanie zadań systemowych lub zarządzanie zadaniami systemowych przy użyciu kodu.

Komunikat ResetInheritedAccess wymaga zapytania FetchXml w celu zidentyfikowania rekordów. To zapytanie musi spełniać następujące wymagania:

  • principalobjectaccessUżyj tabeli (POA).
  • Zwraca tylko kolumnę principalobjectaccessid .
  • Nie może zawierać żadnych link-entity elementów. Nie można dodać sprzężenia do innej tabeli.
  • Filtruj tylko kolumny principalobjectaccess tabeli.

Ta tabela jest dostępna dla internetowego interfejsu API jako typ jednostki principalobjectaccess. Nie jest ona uwzględniona w odwołaniu do tabeli/jednostki usługi Dataverse , ponieważ tabela POA nie obsługuje żadnej operacji bezpośredniej modyfikacji danych. Aby tworzyć zapytanie FetchXml, musisz znać kolumny tej tabeli.

Kolumny tabeli POA

Należy utworzyć zapytanie FetchXml przy użyciu tylko tych kolumn.

Nazwa logiczna Wpisać Opis
accessrightsmask Liczba całkowita Zawiera połączone wartości składowe wyliczenia AccessRights dla praw dostępu, które podmiot zabezpieczeń ma bezpośrednio.
changedon Datetime Ostatnia data zmiany dostępu podmiotu zabezpieczeń do rekordu.
inheritedaccessrightsmask Liczba całkowita Zawiera połączone wartości składowe wyliczenia AccessRights dla praw dostępu, które są stosowane z powodu dziedziczenia.
objectid Unikatowy identyfikator Identyfikator rekordu, do który podmiot zabezpieczeń ma dostęp.
objecttypecode Liczba całkowita Wartość EntityMetadata.ObjectTypeCode odpowiadająca tabeli. Ta wartość nie musi być taka sama w przypadku różnych środowisk. W przypadku tabel niestandardowych jest ona przypisywana na podstawie kolejności, w jakiej została utworzona tabela. Aby uzyskać tę wartość, może być konieczne wyświetlenie metadanych tabeli. Istnieje kilka narzędzi społeczności, aby to znaleźć. Oto rozwiązanie firmy Microsoft: przeglądanie definicji tabel w środowisku.
principalid Unikatowy identyfikator Identyfikator użytkownika lub zespołu, który ma dostęp.
principalobjectaccessid Unikatowy identyfikator Klucz podstawowy tabeli POA.
principaltypecode Liczba całkowita Kod typu podmiotu zabezpieczeń. SystemUser = 8, Team = 9.

Następujące wartości składowe wyliczenia AccessRights mają zastosowanie do accessrightsmask kolumn i inheritedaccessrightsmask :

Typ dostępu Value Opis
None 0 Brak dostępu.
Read 1 Prawo do odczytu rekordu.
Write 2 Prawo do zaktualizowania rekordu.
Append 4 Prawo do dołączania określonego rekordu do innego rekordu.
AppendTo 16 Prawo do dołączenia innego rekordu do określonego rekordu.
Create 32 Prawo do utworzenia rekordu.
Delete 65,536 Prawo do usunięcia rekordu.
Share 262,144 Prawo do udostępniania rekordu.
Assign 524,288 Prawo do przypisania określonego rekordu do innego użytkownika lub zespołu.

Może zostać wyświetlona inheritedaccessrightsmask wartość 135 069 719. Ta wartość obejmuje wszystkie typy dostępu z wyjątkiem Create, co nie jest konieczne, ponieważ te prawa mają zastosowanie tylko do już utworzonych rekordów.

Przykłady fetchXml

Ta sekcja zawiera kilka przykładów zapytań FetchXml, których można użyć z komunikatem ResetInheritedAccess . Aby uzyskać więcej informacji, zobacz Używanie fetchXML do konstruowania zapytania.

Resetowanie dziedziczonego dostępu dla określonego użytkownika dla określonego konta
<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>
Resetuj dziedziczony dostęp do wszystkich wierszy podrzędnych dla określonego typu obiektu
<fetch>
    <entity name="principalobjectaccess">
        <attribute name="principalobjectaccessid"/>
        <filter type="and">
            <condition attribute="objecttypecode" operator="eq" value="10042" />
        </filter>
    </entity>
</fetch>
Resetuj dostęp dziedziczony udzielony określonemu użytkownikowi dla wszystkich typów obiektów
<fetch>
    <entity name="principalobjectaccess">
        <attribute name="principalobjectaccessid"/>
        <filter type="and">
            <condition attribute="principalid" operator="eq" value="9b5f621b-584e-423f-99fd-4620bb00bf1f" />
        </filter>
    </entity>
</fetch>