次の方法で共有


を使用して秘密度ラベルを提供する

Windows Recall では、 UserActivity.ContentInfo によって提供される JSON メタデータを評価して、ウィンドウをキャプチャするかどうか、およびエンタープライズ データ損失防止 (DLP) ポリシーでスナップショットを分類する方法を決定します。 秘密度ラベル (既知の場合) を指定することで、 Recall は DLP プロバイダーに対してクエリを実行して実施の決定 (キャプチャのブロックなど) を行い、適切なメタデータをユーザーに表示できます。

メタデータを送信するタイミング

次の場合に UserActivity を送信または更新します。

  • 作業中のドキュメントまたはアイテムが変更される
  • 秘密度ラベルの追加、削除、または変更
  • 状態が未確定から既知に遷移する
  • アプリが起動する (ベースラインを確立するため)

感度モデル

アプリは、次の 3 つの状態のいずれかでコンテンツを報告できます。

  1. 機密: informationProtection配列を持つlabels オブジェクトを含める
  2. 非機密: informationProtection オブジェクトを完全に省略する
  3. 未確定: informationProtection.state = "undetermined" を含める (Recall 状態が解決されるまでキャプチャをブロックします)

informationProtection オブジェクトが存在しないということは、コンテンツが機密でないことを意味します。

JSON 構造体

推奨される最上位フィールド:

  • @context: https://schema.org
  • @type: たとえば、"DocumentObject"、"Event"、"Article"
  • identifier: 安定した一意の ID

情報保護オブジェクト (機密情報または未確定の場合のみ) パターン (リテラル JSON ではなく例示):

"informationProtection": {
  "@type": "SensitivityLabel",
  "state": "<state>",              // "sensitive" or "undetermined"
  "labels": [                       // include only when state == "sensitive"
    {
      "labelID": "<label GUID>",
      "organizationID": "<tenant GUID>"
    }
  ]
}

準則:

  • <state>sensitiveまたはundeterminedに置き換えます。
  • 状態がlabels場合にのみ、sensitive配列を含めます。
  • @type オブジェクト内は常に SensitivityLabel
  • 複数のラベルを使用できます。 Recall は、DLP プロバイダーによって返される最も制限の厳しい値を適用します。

最小限の例

機密性の高い (単一):

{
  "@context": "https://schema.org",
  "@type": "DocumentObject",
  "identifier": "doc-123",
  "informationProtection": {
    "@type": "SensitivityLabel",
    "state": "sensitive",
    "labels": [
      {
        "labelID": "F96E0B19-8C3A-4D5A-8B9A-2E8CFC43247B",
        "organizationID": "D3FE4C20-9C77-45AB-A8E7-9870D3C9C856"
      }
    ]
  }
}

機密ではない

{
  "@context": "https://schema.org",
  "@type": "DocumentObject",
  "identifier": "doc-123"
}

[Undetermined]\(不明\)

{
  "@context": "https://schema.org",
  "@type": "DocumentObject",
  "identifier": "doc-123",
  "informationProtection": {
    "@type": "SensitivityLabel",
    "state": "undetermined"
  }
}

複数のラベルの例

"informationProtection": {
  "@type": "SensitivityLabel",
  "state": "sensitive",
  "labels": [
    {
      "labelID": "F96E0B19-8C3A-4D5A-8B9A-2E8CFC43247B",
      "organizationID": "D3FE4C20-9C77-45AB-A8E7-9870D3C9C856"
    },
    {
      "labelID": "9A724CF8-E7D2-4B1C-8F4A-1D2E7B3A6C8D",
      "organizationID": "7C56AB24-9E32-44FA-B7D8-1E9F43C7A92B"
    }
  ]
}

API の使用方法 (C#)

ヘルパー メソッド

次のヘルパー メソッドは、秘密度ラベルを使用して ContentInfo を更新する方法を示しています。

private async Task UpdateContentInfoAsync(
    string contentId,
    string state, // "sensitive" | "undetermined" | "none"
    IEnumerable<(string LabelId, string OrgId)>? labels = null)
{
    var channel = UserActivityChannel.GetDefault();
    var activity = await channel.GetOrCreateUserActivityAsync(contentId);
    activity.ActivationUri = new Uri($"my-app://content/{contentId}");

    string json;
    if (state == "sensitive" && labels != null)
    {
        var labelItems = string.Join(",",
            labels.Select(l => $@"{{ \"labelID\": \"{l.LabelId}\", \"organizationID\": \"{l.OrgId}\" }}"));
        json = $@"{{
  \"@context\": \"https://schema.org\",
  \"@type\": \"DocumentObject\",
  \"identifier\": \"{contentId}\",
  \"informationProtection\": {{
    \"@type\": \"SensitivityLabel\",
    \"state\": \"sensitive\",
    \"labels\": [ {labelItems} ]
  }}
}}";
    }
    else if (state == "undetermined")
    {
        json = $@"{{
  \"@context\": \"https://schema.org\",
  \"@type\": \"DocumentObject\",
  \"identifier\": \"{contentId}\",
  \"informationProtection\": {{
    \"@type\": \"SensitivityLabel\",
    \"state\": \"undetermined\"
  }}
}}";
    }
    else
    {
        json = $@"{{
  \"@context\": \"https://schema.org\",
  \"@type\": \"DocumentObject\",
  \"identifier\": \"{contentId}\"
}}";
    }

    activity.ContentInfo = UserActivityContentInfo.FromJson(json);
    await activity.SaveAsync();
}

プル ハンドラー

次のプル ハンドラーは、オンデマンドの UserActivity 要求に応答する方法を示しています。

private async void UserActivityRequested(
    UserActivityRequestManager sender,
    UserActivityRequestedEventArgs args)
{
    var deferral = args.GetDeferral();
    try
    {
        string id = GetCurrentContentId();
        var (state, labels) = GetCurrentSensitivity(); // app logic
        var channel = UserActivityChannel.GetDefault();
        var activity = await channel.GetOrCreateUserActivityAsync(id);
        activity.ActivationUri = new Uri($"my-app://content/{id}");
        string json = BuildContentInfoJson(id, state, labels);
        activity.ContentInfo = UserActivityContentInfo.FromJson(json);
        args.Request.SetUserActivity(activity);
    }
    finally
    {
        deferral.Complete();
    }
}

プッシュとプル

ハイブリッド アプローチを採用する:

  • 初期プルによってベースラインが確立される
  • 変更時に更新をすぐにプッシュする

利点: 待機時間が短く、古いラベルが回避され、ポーリングのオーバーヘッドが削減され、迅速なオンデマンド キャプチャがサポートされます。