共用方式為


如何清除繼承的存取權

本文介紹如何在 dataverse Microsoft 中數據表的串聯組態變更時,移除記錄的繼承存取權。

徵兆

將 ReparentShare 動作之數據表關聯性的串聯行為變更為 [無串聯] 之後,您可以繼續存取應該移除的相關記錄。

使用者可能會報告他們有非預期的記錄存取權。 有兩種方式可以驗證相關記錄的存取權:使用 [檢查存取 ] 功能或 RetrieveAccessOrigin 訊息。

使用檢查存取功能

使用模型驅動應用程式中的 [檢查存取 ] 功能來檢查誰可以存取記錄。 系統管理員可以使用這項功能來檢查可存取記錄的個別使用者或所有使用者。

使用存取檢查程式時,您會看到使用者具有存取權的原因清單。 其中一些原因表示因為相關記錄的存取權而授與共用。 例如:

  • 記錄與我共用,因為我有相關記錄的存取權。
  • 記錄是與小組共用的,我是一個成員,因為團隊可以存取相關的記錄。

使用 RetrieveAccessOrigin 訊息

開發人員可以使用 RetrieveAccessOrigin 訊息來偵測哪些使用者可以存取記錄。 此訊息會傳回描述使用者存取權原因的句子。 下列任何結果都表示因為共用相關記錄而授與存取權:

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

如需詳細資訊,請參閱 判斷用戶為何具有程式碼的存取權。

原因

當數據表關聯性的串聯行為變更時,Dataverse 會啟動異步作業來移除先前授與存取用戶的許可權。 不過,此作業可能會失敗,導致使用者保留存取權。

解決方法

解決此問題的第一個步驟是重新建立系統作業以移除存取權。 如果作業失敗,開發人員可以使用 ResetInheritedAccess 訊息將變更套用至指定的記錄集。

重新建立系統作業以移除存取權

開發人員可以使用 CreateAsyncJobToRevokeInheritedAccess 訊息再次嘗試建立異步作業。

使用 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);
}

深入瞭解如何搭配 SDK for .NET 使用訊息。

動作 CreateAsyncJobToRevokeInheritedAccess 會建立名為 RevokeInheritedAccess的新異步作業。 您可以監視此作業的成功。 如需詳細資訊,請參閱使用程式代碼監視系統作業或管理系統作業。

重設繼承的存取權

如果 重新建立系統作業以移除存取 失敗,具有系統管理員或系統自定義員許可權的開發人員可以使用 ResetInheritedAccess 訊息,以相符記錄的子集為目標。 您可能需要多次使用此訊息來移除所有記錄的存取權。

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

深入瞭解如何搭配 SDK for .NET 使用訊息。

ResetInheritedAccess當記錄不多時,訊息會嘗試同步執行。 然後,值會 ResetInheritedAccessResponseExecutionMode : Sync結尾。 如果有許多相符的記錄,作業會花費較長的時間,而值會以 ExecutionMode : Async結尾。 系統會建立名為 Denormalization_PrincipalObjectAccess_principalobjectaccess:<caller ID> 的系統作業,而且您可以監視該作業的成功。 如需詳細資訊,請參閱使用程式代碼監視系統作業或管理系統作業。

訊息 ResetInheritedAccess 需要 FetchXml 查詢來識別記錄。 此查詢必須符合下列需求:

  • principalobjectaccess使用 (POA) 資料表。
  • 只傳回數據 principalobjectaccessid 行。
  • 不得包含任何 link-entity 專案。 您無法將聯結新增至另一個資料表。
  • 只篩選數據表的數據 principalobjectaccess 行。

此數據表可供 Web API 作為 principalobjectaccess 實體類型使用。 它不包含在 Dataverse 數據表/實體參考,因為 POA 數據表不支援任何類型的直接數據修改作業。 您必須知道此數據表的數據行,才能撰寫 FetchXml 查詢。

POA 數據表數據行

您只需要使用這些數據行來撰寫 FetchXml 查詢。

邏輯名稱 類型​ 描述
accessrightsmask 整數 包含主體直接擁有之訪問許可權的合併 AccessRights 列舉 成員值。
changedon Datetime 主體存取記錄的最後一個日期已變更。
inheritedaccessrightsmask 整數 包含因繼承而套用之訪問許可權的 合併 AccessRights 列舉 成員值。
objectid 唯一識別碼 主體可存取之記錄的標識碼。
objecttypecode 整數 對應至數據表的 EntityMetadata.ObjectTypeCode 值。 對於不同的環境,此值不一定相同。 針對自定義數據表,會根據建立數據表的順序來指派。 若要取得此值,您可能需要檢視數據表的元數據。 有數個社群工具可找到此專案。 以下是來自Microsoft的解決方案: 瀏覽您環境中的數據表定義。
principalid 唯一識別碼 具有存取權的使用者或小組標識碼。
principalobjectaccessid 唯一識別碼 POA 數據表的主鍵。
principaltypecode 整數 主體的類型代碼。 SystemUser = 8, Team = 9。

下列 AccessRights 列舉 成員值適用於 accessrightsmaskinheritedaccessrightsmask 資料行:

存取類型 描述
None 0 不允許存取。
Read 1 讀取記錄的權利。
Write 2 更新記錄的權利。
Append 4 將指定記錄附加至另一筆記錄的右邊。
AppendTo 16 將另一筆記錄附加至指定記錄的右邊。
Create 32 建立記錄的權利。
Delete 65,536 刪除記錄的權利。
Share 262,144 共用記錄的權利。
Assign 524,288 將指定記錄指派給其他使用者或小組的權利。

您可能會看到 inheritedaccessrightsmask 值通常是 135,069,719。 這個值包含 除了 以外的 Create所有存取類型,這不是必要的,因為這些許可權僅適用於已建立的記錄。

FetchXml 範例

本節包含一些您可以搭配 ResetInheritedAccess 訊息使用的 FetchXml 查詢範例。 如需詳細資訊,請參閱 使用 FetchXML 建構查詢

針對特定帳戶,重設特定用戶的繼承存取權
<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>
重設指定物件類型之所有子數據列的繼承存取權
<fetch>
    <entity name="principalobjectaccess">
        <attribute name="principalobjectaccessid"/>
        <filter type="and">
            <condition attribute="objecttypecode" operator="eq" value="10042" />
        </filter>
    </entity>
</fetch>
針對所有物件類型,重設指定用戶的繼承存取權
<fetch>
    <entity name="principalobjectaccess">
        <attribute name="principalobjectaccessid"/>
        <filter type="and">
            <condition attribute="principalid" operator="eq" value="9b5f621b-584e-423f-99fd-4620bb00bf1f" />
        </filter>
    </entity>
</fetch>