Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Windows Recall évalue les métadonnées JSON fournies UserActivity.ContentInfo pour décider s’il faut capturer une fenêtre et comment classifier des instantanés sous des stratégies DLP (Data Loss Prevention) d’entreprise. En fournissant des étiquettes de confidentialité (lorsqu’elles sont connues), Recall vous pouvez interroger le fournisseur DLP pour obtenir des décisions d’application (par exemple, bloquer la capture) et afficher les métadonnées appropriées aux utilisateurs.
Quand envoyer des métadonnées
Envoyez ou mettez à jour un UserActivity lorsque :
- Modifications apportées au document ou à l’élément actif
- Une étiquette de confidentialité est ajoutée, supprimée ou modifiée
- Transitions d’état indéterminées à connues
- Votre application démarre (pour établir une base de référence)
Modèle de sensibilité
Votre application peut signaler du contenu dans l’un des trois états suivants :
-
Sensible : Inclure l’objet
informationProtectionavec un tableaulabels -
Non sensible : omettez entièrement l’objet
informationProtection -
Indéterminé : Include
informationProtection.state = "undetermined"(Recall bloque la capture jusqu’à ce que l’état soit résolu)
L'absence de l'objet informationProtection signifie que le contenu n’est pas confidentiel.
Structure JSON
Champs de niveau supérieur recommandés :
-
@context:https://schema.org -
@type: par exemple, « DocumentObject », « Event », « Article » -
identifier: Identifiant stable et unique
Objet de protection des informations (pour les données sensibles ou indéterminées uniquement) motif (illustration, et non JSON littéral) :
"informationProtection": {
"@type": "SensitivityLabel",
"state": "<state>", // "sensitive" or "undetermined"
"labels": [ // include only when state == "sensitive"
{
"labelID": "<label GUID>",
"organizationID": "<tenant GUID>"
}
]
}
Règlement:
- Remplacez
<state>parsensitiveouundetermined. - Incluez le tableau uniquement lorsque l’état
labelsestsensitive. - L'intérieur de l'objet
@typeest toujoursSensitivityLabel. - Plusieurs étiquettes autorisées ; Recall applique l'étiquette la plus restrictive retournée par le fournisseur DLP.
Exemples minimaux
Sensible (unique) :
{
"@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"
}
]
}
}
Non sensible
{
"@context": "https://schema.org",
"@type": "DocumentObject",
"identifier": "doc-123"
}
Indéterminé
{
"@context": "https://schema.org",
"@type": "DocumentObject",
"identifier": "doc-123",
"informationProtection": {
"@type": "SensitivityLabel",
"state": "undetermined"
}
}
Exemple d’étiquettes multiples
"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"
}
]
}
Utilisation de l’API (C#)
Méthode auxiliaire
La méthode d'assistance suivante démontre comment mettre à jour ContentInfo avec des étiquettes de confidentialité :
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();
}
Gestionnaire d’extraction
Le gestionnaire de récupération suivant montre comment répondre aux demandes sur demande 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();
}
}
Push et pull
Adoptez une approche hybride :
- L’extraction initiale établit la ligne de référence
- Envoyer des mises à jour immédiatement sur les modifications
Avantages : faible latence, évite les étiquettes obsolètes, réduit la surcharge d’interrogation, prend en charge la capture rapide à la demande.
Liens connexes
Windows developer