Windows Recall では、 UserActivity.ContentInfo によって提供される JSON メタデータを評価して、ウィンドウをキャプチャするかどうか、およびエンタープライズ データ損失防止 (DLP) ポリシーでスナップショットを分類する方法を決定します。 秘密度ラベル (既知の場合) を指定することで、 Recall は DLP プロバイダーに対してクエリを実行して実施の決定 (キャプチャのブロックなど) を行い、適切なメタデータをユーザーに表示できます。
メタデータを送信するタイミング
次の場合に UserActivity を送信または更新します。
- 作業中のドキュメントまたはアイテムが変更される
- 秘密度ラベルの追加、削除、または変更
- 状態が未確定から既知に遷移する
- アプリが起動する (ベースラインを確立するため)
感度モデル
アプリは、次の 3 つの状態のいずれかでコンテンツを報告できます。
-
機密:
informationProtection配列を持つlabelsオブジェクトを含める -
非機密:
informationProtectionオブジェクトを完全に省略する -
未確定:
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();
}
}
プッシュとプル
ハイブリッド アプローチを採用する:
- 初期プルによってベースラインが確立される
- 変更時に更新をすぐにプッシュする
利点: 待機時間が短く、古いラベルが回避され、ポーリングのオーバーヘッドが削減され、迅速なオンデマンド キャプチャがサポートされます。
関連リンク
Windows developer