如何清除繼承的存取
本文介紹如何在 Microsoft Dataverse 中變更數據表的串聯組態時,移除記錄的繼承存取權。
徵狀
在 Reparent 或 Share 動作的數據表關聯性串連行為變更為 [沒有串聯] 之後,您就可以繼續存取應該移除的相關記錄。
如何驗證相關記錄的存取權
使用者可能會回報他們具有非預期的記錄存取權。 有兩種方式可以驗證相關記錄的存取權:使用 [檢查存取] 功能或 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);
}
動作 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"]);
}
當沒有太多相符的記錄時,訊 ResetInheritedAccess
息會嘗試同步執行。 然後值 ResetInheritedAccessResponse
會以 ExecutionMode : Sync
結尾。 如果有許多相符的記錄,作業會花費較長的時間,且值會以 ExecutionMode : Async
結尾。 系統會建立名為 的 Denormalization_PrincipalObjectAccess_principalobjectaccess:<caller ID>
系統作業,您可以監視該作業是否成功。 如需詳細資訊,請參閱使用程式代碼 監視系統作業 或 管理系統作業。
訊 ResetInheritedAccess
息需要 FetchXml 查詢來識別記錄。 此查詢必須符合下列需求:
- 使用 (
principalobjectaccess
POA) 表。 - 只傳回數據行
principalobjectaccessid
。 - 不得包含任何
link-entity
專案。 您無法將聯結新增至另一個資料表。 - 僅篩選數據表的數據
principalobjectaccess
行。
此數據表可作為 principalobjectaccess 實體類型提供給 Web API 使用。 它不包含在 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 列舉 成員值適用於 accessrightsmask
和 inheritedaccessrightsmask
資料行:
存取類型 | 值 | 描述 |
---|---|---|
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>