共有および割り当て
この記事では、レコードを共有および割り当てる際のセキュリティ アクセスについて説明します。
レコードの共有
共有によって、その他のユーザーやチームが特定の顧客情報にアクセスできるようになります。 レコードの共有は、ベーシック のアクセス レベルしかないロールのユーザーと情報を共有する際に便利です。 たとえば、営業担当者に取引先企業へのベーシックの読み取りおよび書き込みアクセス権限を与える組織において、営業担当者は営業案件を別の営業担当者と共有し、重要な販売の進行状況を両者が追跡できるようにすることができます。
セキュリティ上の理由のため、共有する必要があるレコードだけを最小限のユーザーと共有してください。 ユーザーが業務のために必要な最小限のアクセス権だけを付与してください。 一人のユーザーが、同一のレコードに対するアクセス権を複数のコンテキストで持つ場合があります。 たとえば、特定のアクセス権によってレコードを直接共有しているユーザーが、同じレコードを他のアクセス権で共有しているチームに属している場合です。 この場合、このユーザーのレコードに対するアクセス権は、すべての権限を合わせたものになります。
GrantAccess
メッセージを使用してレコードを別のユーザーと共有するときは、他のユーザーに付与するアクセス権を指し示す必要があります。 共有レコードのアクセスを変更するには、ModifyAccess
メッセージを使用します。 共有レコードに対するアクセス権は、レコードを共有するユーザーごとに変えることができます。 ただし、ユーザーに割り当てられたロールに基づいてその種類のテーブルに付与される権限以外の権限を与えることはできません。 たとえば、取引先企業に対する 読み取り 特権がユーザーにない場合、そのユーザーと取引先企業を共有した場合でも、ユーザーはその取引先企業を表示することはできません。
GrantAccess の例
この例は、GrantAccess
メッセージを使用した別のプリンシパルとレコードの共有方法を示しています。
次の ShareRecord
静的メソッドは、PrincipalAccess クラス を使用して、プリンシパル (ユーザー、チーム、または組織) への参照をプリンシパルに付与される権利を含む AccessRights のセットで指定する方法を示しています。
/// <summary>
/// Shares a record with a principal
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
/// <param name="principal">The user, team, or organization to share the record with.</param>
/// <param name="access">The access rights to grant</param>
/// <param name="record">The record to share</param>
static void ShareRecord(
IOrganizationService service,
EntityReference principal,
AccessRights access,
EntityReference record)
{
PrincipalAccess principalAccess = new()
{
AccessMask = access,
Principal = principal
};
GrantAccessRequest request = new()
{
PrincipalAccess = principalAccess,
Target = record
};
service.Execute(request);
}
ModifyAccess の例
これらの例は、ModifyAccess
メッセージを使用して、共有レコードに対してプリンシパルに付与されるアクセスを変更する方法を示しています。
次の ModifyShare
静的メソッドは、PrincipalAccess クラス を使用して、プリンシパル (ユーザー、チーム、または組織) への参照を、プリンシパル用に変更される権利を含む AccessRights のセットで指定する方法を示しています。
/// <summary>
/// Modifies the access to a shared record.
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
/// <param name="principal">The user, team, or organization to modify rights to the shared.</param>
/// <param name="access">The access rights to modify</param>
/// <param name="record">The shared record</param>
static void ModifyShare(
IOrganizationService service,
EntityReference principal,
AccessRights access,
EntityReference record)
{
PrincipalAccess principalAccess = new()
{
AccessMask = access,
Principal = principal
};
ModifyAccessRequest request = new()
{
PrincipalAccess = principalAccess,
Target = record
};
service.Execute(request);
}
共有および継承
レコードの作成時に、そのレコードの親レコードに特定の共有プロパティがある場合、新しく作成されたレコードはそれらのプロパティを継承します。 たとえば、佐藤さんと安田さんは優先度の高い潜在顧客を担当しているとします。 佐藤さんが 1 件の新規潜在顧客と 2 つの活動を作成し、その潜在顧客を安田さんと共有し、伝播共有を選択します。 安田さんが新規潜在顧客に電話をかけ、電子メールを送信します。 佐藤さんには安田さんがその会社に 2 回連絡したことがわかるため、さらに電話をかけることはしません。
共有は、各レコードで個別に保持されます。 レコードは親から共有プロパティを継承し、かつ独自の共有プロパティを保持します。 したがって、1 つのレコードは、共有プロパティを 2 セット (1 つは独自のもの、もう 1 つは親から継承したもの) を持つことができます。
親レコードの共有を削除すると、親から継承したオブジェクト (レコード) の共有プロパティが削除されます。 これは、削除前はレコードを表示できたすべてのユーザーが、そのレコードを表示できなくなることを意味します。 子オブジェクトが親レコード経由ではなく個別に共有されている場合、これらのユーザーの一部は子オブジェクトを引き続き共有できます。
レコードの割り当て
レコードの割り当て特権を持つユーザーは、レコードを別のユーザーに割り当てることができます。 レコードを割り当てるには、ownerid
検索値を変更して新しいプリンシパルを参照します。
ヒント
SDK には、非推奨の AssignRequest クラス が含まれています。 詳細: 従来の更新メッセージ
レコードが新しいユーザーに割り当てられると、新しいユーザー、チーム、組織は、レコードと、それに関連するレコードの所有者になります。 元のユーザー、チーム、組織は、レコードの所有権を失いますが、新しい所有者と自動的にそのレコードを共有します。
Microsoft Dataverse では、システム管理者は、組織において、割り当て操作の後にレコードを前の所有者と共有する必要があるかどうかを決定できます。 再割り当てされたレコードを元の所有者と共有する を選択すると (システム設定>一般)、割り当て操作後に前の所有者が、すべてのアクセス権限を保持してレコードを共有します。 そうでなければ、前の所有者はレコードを共有せず、その所有者が持っている特権によっては、レコードにアクセスできなくなる場合があります。 組織テーブルの ShareToPreviousOwnerOnAssign 列はこの設定を制御します。
ヒント
予約テーブル には、予約が別のユーザーに割り当てられるときの特別なロジックが含まれます。 現在の所有者がまだ開催者や出席者などの参加者である場合、予定が再割り当てされると、予定レコードはこのユーザーと共有されます。 この動作は、再割り当てされたレコードを元の所有者と共有する 設定が無効である場合でも発生します。 予定は前の所有者と共有される可能性があるため、会議を割り当てるユーザーには、レコードに対する 割当 と 共有 のアクセス権両方が必要です。
アクセスの取り消し
レコードの所有者は、RevokeAccess
メッセージを使用して、共有レコードへのユーザー アクセスを取り消す (削除する) ことができます。
次の RevokeShare
静的メソッドは、RevokeAccessRequest クラス を使用して、ユーザーのレコードへの共有アクセスを削除する方法を示しています。
/// <summary>
/// Revokes access to a shared record.
/// </summary>
/// <param name="service">Authenticated client implementing the IOrganizationService interface</param>
/// <param name="principal">The user, team, or organization to revoke rights to the shared record.</param>
/// <param name="record">The shared record</param>
static void RevokeShare(
IOrganizationService service,
EntityReference principal,
EntityReference record)
{
RevokeAccessRequest request = new()
{
Revokee = principal,
Target = record
};
service.Execute(request);
}
詳細: 共有アクセス。
ユーザーにアクセスがなぜあるか確認する
モデル駆動型アプリのアクセスのチェック 機能は、ユーザーがレコードにアクセスできる理由を理解できるように情報を提供します。 この情報をコードで取得するには、RetrieveAccessOrigin
メッセージを使用します。 特定のユーザーおよびレコードに関する情報が渡されると、このメッセージはユーザーがアクセス権を持っている理由を説明する文を返します。 操作が成功した場合に考えられる応答は次のとおりです。
Access origin could not be determined because FCB is disabled.
PrincipalId is object owner (<record ID>)
PrincipalId is member of team (<team ID>) who is object owner (<record ID>)
PrincipalId is member of organization (<organization ID>) who is object owner (<record ID>)
PrincipalId has access to (<hierarchy security principal ID>) through hierarchy security. (<hierarchy security principal ID>) is object owner (<record ID>)
PrincipalId has direct poa access to object (<record ID>)
PrincipalId is member of team (<team ID>) who has poa access to object (<record ID>)
PrincipalId is member of organization (<organization ID>) who has poa access to object (<record ID>)
PrincipalId is owner of a parent entity of object (<child record ID>)
PrincipalId is member of team (<team ID>) who is owner of a parent entity of object (<child record ID>)
PrincipalId is member of organization (<organization ID>) who is owner of a parent entity of object (<child record ID>)
PrincipalId has access to (<hierarchy security principal ID>) through hierarchy security. (<hierarchy security principal ID>) is owner of a parent entity of object (<child record ID>)
PrincipalId has poa access to object's root entity (<child record ID>)
PrincipalId is member of team (<team ID>) who has poa access to object's root entity (<child record ID>)
PrincipalId is member of organization (<organization ID>) who has poa access to object's root entity (<child record ID>)
Access origin could not be found. Access does not come from POA table or object ownership.
ヒント
現在、SDK には RetrieveAccessOriginRequest
または RetrieveAccessOriginResponse
クラスがありません。 このメッセージを使用するには、OrganizationRequest クラスと OrganizationResponse クラスを使用する必要があります。 .NET 用 SDK でメッセージを利用する詳細については、次をご覧ください。
/// <summary>
/// Describes why a principal (systemuser or team) has access to a record.
/// </summary>
/// <param name="service">The authenticated IOrganizationService instance to use.</param>
/// <param name="objectId">The unique identifier of a record.</param>
/// <param name="tableLogicalName">The logical name of the table for the record in the ObjectId parameter.</param>
/// <param name="principalId">The unique identifier of the systemuser or team record.</param>
/// <returns>A sentence explaining why the principal has access to a record.</returns>
public static void OutputRetrieveAccessOrigin(IOrganizationService service,
Guid objectId,
string tableLogicalName,
Guid principalId)
{
var parameters = new ParameterCollection()
{
{ "ObjectId", objectId},
{ "LogicalName", tableLogicalName},
{ "PrincipalId", principalId}
};
var request = new OrganizationRequest()
{
RequestName = "RetrieveAccessOrigin",
Parameters = parameters
};
var response = service.Execute(request);
Console.WriteLine(response.Results["Response"]);
}
サンプル出力: PrincipalId is object owner (aaaaaaaa-bbbb-cccc-1111-222222222222)
参照
サンプル: GrantAccess、ModifyAccess、および RevokeAccess メッセージを使用したレコードの共有