Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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:
-
Vertraulich: Einschließen des
informationProtectionObjekts mit einemlabelsArray -
Nicht vertraulich: Lassen Sie das
informationProtectionObjekt vollständig aus. -
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>durchsensitiveoderundetermined. - Schließen Sie das
labelsArray nur ein, wenn der Zustand istsensitive. -
@typeinnerhalb des Objekts ist immerSensitivityLabel. - 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.
Verwandte Links
Windows developer