Freigeben über


Vertraulichkeitsbezeichnungen für Recall mit UserActivityContentInfo bereitstellen

Windows Recall wertet JSON-Metadaten aus, die über UserActivity.ContentInfo bereitgestellt werden, um zu entscheiden, ob ein Fenster erfasst wird und wie Momentaufnahmen im Rahmen von DLP-Richtlinien (Data Loss Prevention, Verhinderung von Datenverlust) klassifiziert werden. Durch die Bereitstellung von Vertraulichkeitsbezeichnungen (sofern bekannt) kann Recall Abfragen zu Erzwingungsentscheidungen an den DLP-Anbieter richten (z. B. Erfassung blockieren) und den Benutzern entsprechende Metadaten anzeigen.

Wann Metadaten gesendet werden sollen

Senden oder Aktualisieren eines UserActivity, wenn:

  • Das aktive Dokument oder element ändert sich
  • Eine Vertraulichkeitsbezeichnung wird hinzugefügt, entfernt oder geändert.
  • Zustandsübergänge von unbestimmt zu bekannt
  • Ihre App wird gestartet (um einen Basisplan einzurichten)

Sensitivitätsmodell

Ihre App kann Inhalte in einem von drei Zuständen melden:

  1. Vertraulich: Einschließen des informationProtection Objekts mit einem labels Array
  2. Nicht vertraulich: Lassen Sie das informationProtection Objekt vollständig aus.
  3. Nicht bestimmt: Einschließen von informationProtection.state = "undetermined" (Recall Blocks werden erfasst, bis der Zustand aufgelöst ist)

Das Fehlen des informationProtection Objekts bedeutet, dass der Inhalt nicht vertraulich ist.

JSON-Struktur

Empfohlene Felder auf oberster Ebene:

  • @context: https://schema.org
  • @type: Beispiel: "DocumentObject", "Event", "Article"
  • identifier: Stabile eindeutige ID

Informationsschutzobjekt (nur für sensible oder unbestimmte Fälle) Beispielmuster (zur Veranschaulichung, kein wörtliches JSON):

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

Regeln:

  • Ersetzen Sie <state> durch sensitive oder undetermined.
  • Schließen Sie das labels Array nur ein, wenn der Zustand ist sensitive.
  • @type innerhalb des Objekts ist immer SensitivityLabel.
  • Mehrere Bezeichnungen sind zulässig; Recall wendet den restriktivsten vom DLP-Anbieter zurückgegebenen an.

Minimale Beispiele

Sensitiv (einzeln):

{
  "@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"
      }
    ]
  }
}

Nicht vertraulich

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

Unbestimmt

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

Beispiel für mehrere Etiketten

"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-Verwendung (C#)

Hilfsmethode

Die folgende Hilfsmethode veranschaulicht, wie Sie ContentInfo mit Vertraulichkeitsbezeichnungen aktualisieren:

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();
}

Pull-Handler

Der folgende Pull-Handler veranschaulicht, wie Sie auf Anfrage-Anforderungen UserActivity reagieren:

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();
    }
}

Push vs Pull

Nehmen Sie einen Hybridansatz an:

  • Der erste Pull legt die Grundlinie fest.
  • Pushupdates sofort bei Änderungen

Vorteile: geringe Latenz, vermeidet veraltete Bezeichnungen, reduziert den Abrufaufwand, unterstützt eine schnelle On-Demand-Erfassung.