Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O Windows Recall avalia os metadados JSON fornecidos através de UserActivity.ContentInfo para decidir se deve capturar uma janela e como classificar instantâneos de acordo com as políticas empresariais de Prevenção de Perda de Dados (DLP). Ao fornecer etiquetas de sensibilidade (quando conhecidas), Recall pode consultar o fornecedor DLP para decisões de aplicação (por exemplo, captura de blocos) e apresentar metadados apropriados aos utilizadores.
Quando enviar metadados
Envie ou atualize UserActivity sempre que:
- Alterações no documento ou item ativo
- Um rótulo de sensibilidade é adicionado, removido ou alterado
- Transições de estado de indeterminado para conhecido
- A tua aplicação inicia (para estabelecer uma linha de base)
Modelo de sensibilidade
A sua aplicação pode reportar conteúdos num dos três estados:
-
Sensível: Inclua o objeto
informationProtectioncom uma matrizlabels -
Não sensível: Omitir completamente o
informationProtectionobjeto -
Indeterminado: Incluir
informationProtection.state = "undetermined"(Recall bloqueia captura até que o estado seja resolvido)
A ausência do informationProtection objeto significa que o conteúdo não é sensível.
Estrutura JSON
Áreas de topo recomendadas:
-
@context:https://schema.org -
@type: Por exemplo, "DocumentObject", "Evento", "Artigo" -
identifier: ID único estável
Padrão de objeto de proteção da informação (apenas para sensíveis ou indeterminados) (ilustrativo, não literal JSON):
"informationProtection": {
"@type": "SensitivityLabel",
"state": "<state>", // "sensitive" or "undetermined"
"labels": [ // include only when state == "sensitive"
{
"labelID": "<label GUID>",
"organizationID": "<tenant GUID>"
}
]
}
Regras:
- Substitua
<state>porsensitiveouundetermined. - Inclua o
labelsarray apenas quando o estado forsensitive. -
@typedentro do objeto é sempreSensitivityLabel. - Várias etiquetas permitidas; Recall aplica a etiqueta mais restritiva devolvida pelo provedor DLP.
Exemplos mínimos
Sensível (único):
{
"@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"
}
]
}
}
Não sensível
{
"@context": "https://schema.org",
"@type": "DocumentObject",
"identifier": "doc-123"
}
Não determinado
{
"@context": "https://schema.org",
"@type": "DocumentObject",
"identifier": "doc-123",
"informationProtection": {
"@type": "SensitivityLabel",
"state": "undetermined"
}
}
Exemplo de múltiplos rótulos
"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"
}
]
}
Utilização da API (C#)
Método auxiliar
O seguinte método de ajuda demonstra como atualizar ContentInfo com etiquetas de sensibilidade:
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();
}
Manípulo de tração
O seguinte handler de pull demonstra como responder a pedidos sob demanda 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();
}
}
Empurrar vs puxar
Adote uma abordagem híbrida:
- A puxada inicial estabelece a linha de base
- Enviar atualizações imediatamente em caso de alterações
Benefícios: baixa latência, evita etiquetas obsoletas, reduz a sobrecarga das sondagens, suporta captura rápida a pedido.
Ligações relacionadas
Windows developer