Entwicklerhandbuch zu Windows Information Protection (WIP)Windows Information Protection (WIP) developer guide

Eine optimierte App unterscheidet zwischen Firmen- oder persönlichen Daten und weiß, welche sie schützen soll, basierend auf Windows Information Protection (WIP)-Richtlinien, die vom Administrator definiert werden.An enlightened app differentiates between corporate and personal data and knows which to protect based on Windows Information Protection (WIP) policies defined by the administrator.

In diesem Handbuch zeigen wir Ihnen, wie eine erstellt wird.In this guide, we'll show you how to build one. Wenn Sie fertig sind, werden Richtlinienadministratoren Ihrer App vertrauen, Daten für ihre Organisation zu verwenden.When you're done, policy administrators will be able to trust your app to consume their organization's data. Und Mitarbeiter schätzen es, dass ihre persönlichen Daten auf den Geräten unangetastet bleiben, auch wenn sie die Registrierung des Geräts in der mobilen Geräteverwaltung (Mobile Device Management, MDM) aufheben oder das Unternehmen ganz verlassen.And employees will love that you've kept their personal data intact on their device even if they un-enroll from the organization's mobile device management (MDM) or leave the organization entirely.

Hinweis Dieses Handbuch unterstützt Sie beim aufklären einer UWP-app.Note This guide helps you enlighten a UWP app. Wenn Sie eine C++-Windows-Desktop-App aufklären möchten, finden Sie weitere Informationen im Entwicklerhandbuch zu Windows Information Protection (WIP) (C++).If you want to enlighten a C++ Windows desktop app, see Windows Information Protection (WIP) developer guide (C++).

Weitere Informationen zu WIP und optimierten Apps hier: Windows Information Protection (WIP).You can read more about WIP and enlightened apps here: Windows Information Protection (WIP).

Ein vollständiges Beispiel finden Sie hier.You can find a complete sample here.

Wenn Sie bereit sind, die einzelnen Aufgaben durchzugehen, lassen Sie uns starten.If you're ready to go through each task, let's start.

Sammeln Sie zuerst die gewünschten Informationen.First, gather what you need

Sie benötigen Folgendes:You'll need these:

  • Ein virtueller Testcomputer (Virtual Machine, VM), auf dem Windows 10, Version 1607 oder höher, ausgeführt wird.A test Virtual Machine (VM) that runs Windows 10, version 1607 or higher. Sie debuggen Ihre App unter Verwendung dieses virtuellen Testcomputers.You'll debug your app against this test VM.

  • Einen Entwicklungs Computer, auf dem Windows 10, Version 1607 oder höher, ausgeführt wird.A development computer that runs Windows 10, version 1607 or higher. Dies kann Ihr virtueller Testcomputer sein, wenn Visual Studio darauf installiert ist.This could be your test VM if you have Visual Studio installed on it.

Richten Sie Ihre Entwicklungsumgebung ein.Setup your development environment

Sie führen folgende Schritte aus:You'll do these things:

Installieren Sie den WIP Setup Developer Assistant auf dem virtuellen Testcomputer.Install the WIP Setup Developer Assistant onto your test VM

Verwenden Sie dieses Tool, um eine Windows Information Protection-Richtlinie auf Ihrem virtuellen Testcomputer einzurichten.Use this tool to setup a Windows Information Protection policy on your test VM.

Laden Sie das Tool hier herunter: WIP Setup Developer Assistant.Download the tool here: WIP Setup Developer Assistant.

Erstellen einer SchutzrichtlinieCreate a protection policy

Definieren Sie die Richtlinie, indem Sie in jedem Abschnitt des WIP Setup Developer Assistant Informationen eingeben.Define your policy by adding information to each section in the WIP setup developer assistant. Um mehr über die Verwendung der einzelnen Einstellungen zu erfahren, wählen Sie das daneben angezeigte Hilfesymbol aus.Choose the help icon next to any setting to learn more about how to use it.

Allgemeine Informationen zur Verwendung dieses Tools finden Sie im Abschnitt „Versionshinweise“ auf der Downloadseite der App.For more general guidance about how to use this tool, see the Version notes section on the app download page.

Richten Sie ein Visual Studio-Projekt ein.Setup a Visual Studio project

  1. Öffnen Sie das Projekt auf Ihrem Entwicklungscomputer.On your development computer, open your project.

  2. Fügen Sie einen Verweis auf die Desktop- und Mobilerweiterungen für die Universelle Windows-Plattform (UWP) hinzu.Add a reference to the desktop and mobile extensions for Universal Windows Platform (UWP).

    UWP-Erweiterungen hinzufügen

  3. Fügen Sie diese Funktion Ihrer Paket Manifest-Datei hinzu:Add this capability to your package manifest file:

       <rescap:Capability Name="enterpriseDataPolicy"/>
    

    Optionale Info: Das Präfix „Rescap“ bedeutet eingeschränkte Funktion.Optional Reading: The "rescap" prefix means Restricted Capability. Siehe Spezielle und eingeschränkte Funktionen.See Special and restricted capabilities.

  4. Fügen Sie diesen Namespace der Paketmanifestdatei hinzu:Add this namespace to your package manifest file:

      xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
    
  5. Fügen Sie das Namespacepräfix dem <ignorableNamespaces>-Element der Paketmanifestdatei hinzu.Add the namespace prefix to the <ignorableNamespaces> element of your package manifest file.

        <IgnorableNamespaces="uap mp rescap">
    

    Auf diese Weise ignoriert Windows die enterpriseDataPolicy-Funktion, wenn Ihre App auf einer Version des Windows-Betriebssystems ausgeführt wird, die eingeschränkte Funktionen nicht unterstützt.This way, if your app runs on a version of the Windows operating system that doesn't support restricted capabilities, Windows will ignore the enterpriseDataPolicy capability.

Richten Sie das Remotedebuggen ein.Setup remote debugging

Installieren Sie Visual Studio-Remotetools auf Ihrem virtuellen Testcomputer nur dann, wenn Sie Ihre App auf einem anderem Computer als einem virtuellen Computer entwickeln.Install Visual Studio Remote Tools on your test VM only if you are developing your app on a computer other than your VM. Starten Sie den Remotedebugger auf dem Entwicklungscomputer, und überprüfen Sie, ob Ihre App auf dem virtuellen Testcomputer ausgeführt wird.Then, on your development computer start the remote debugger and see if your app runs on the test VM.

Siehe Anweisungen zu Remote-PCs.See Remote PC instructions.

Fügen Sie diese Namespaces zu Ihren Codedateien hinzu.Add these namespaces to your code files

Fügen Sie diese using-Anweisungen am Anfang Ihrer Codedateien ein (Verwenden Sie Codeausschnitte aus diesem Handbuch):Add these using statements to the top of your code files(The snippets in this guide use them):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Security.EnterpriseData;
using Windows.Web.Http;
using Windows.Storage.Streams;
using Windows.ApplicationModel.DataTransfer;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml;
using Windows.ApplicationModel.Activation;
using Windows.Web.Http.Filters;
using Windows.Storage;
using Windows.Data.Xml.Dom;
using Windows.Foundation.Metadata;
using Windows.Web.Http.Headers;

Bestimmen, ob WIP-APIs in Ihrer APP verwendet werden sollenDetermine whether to use WIP APIs in your app

Stellen Sie sicher, dass das Betriebssystem, mit dem Ihre APP ausgeführt wird, WIP unterstützt und WIP auf dem Gerät aktiviert ist.Ensure that the operating system that runs your app supports WIP and that WIP is enabled on the device.

bool use_WIP_APIs = false;

if ((ApiInformation.IsApiContractPresent
    ("Windows.Security.EnterpriseData.EnterpriseDataContract", 3)
    && ProtectionPolicyManager.IsProtectionEnabled))
{
    use_WIP_APIs = true;
}
else
{
    use_WIP_APIs = false;
}

Die WIP-APIs werden nicht aufgerufen, wenn das Betriebssystem WIP nicht unterstützt, oder WIP nicht auf dem Gerät aktiviert ist.Don't call WIP APIs if the operating system doesn't support WIP or WIP is not enabled on the device.

Lesen von UnternehmensdatenRead enterprise data

Um geschützte Dateien, Netzwerk Endpunkte, Zwischenablage Daten und Daten zu lesen, die Sie aus einem Freigabe Vertrag akzeptieren, muss Ihre APP Zugriff anfordern.To read protected files, network endpoints, clipboard data and data that you accept from a Share contract, your app will have to request access.

Windows Information Protection erteilt Ihrer APP die Berechtigung, wenn Ihre APP in der Liste der zulässigen Schutzrichtlinien enthalten ist.Windows Information Protection gives your app permission if your app is on the protection policy's allowed list.

In diesem Abschnitt:In this section:

Lesen von Daten aus einer DateiRead data from a file

Schritt 1: Dateihandle herunterladenStep 1: Get the file handle

    Windows.Storage.StorageFolder storageFolder =
        Windows.Storage.ApplicationData.Current.LocalFolder;

    Windows.Storage.StorageFile file =
        await storageFolder.GetFileAsync(fileName);

Schritt 2: Stellen Sie fest, ob Ihre App die Datei öffnen kannStep 2: Determine whether your app can open the file

Überprüfen Sie fileschutzmanager. getschutzinfoasync , um zu bestimmen, ob Ihre APP die Datei öffnen kann.Call FileProtectionManager.GetProtectionInfoAsync to determine whether your app can open the file.

FileProtectionInfo protectionInfo = await FileProtectionManager.GetProtectionInfoAsync(file);

if ((protectionInfo.Status != FileProtectionStatus.Protected &&
    protectionInfo.Status != FileProtectionStatus.Unprotected))
{
    return false;
}
else if (protectionInfo.Status == FileProtectionStatus.Revoked)
{
    // Code goes here to handle this situation. Perhaps, show UI
    // saying that the user's data has been revoked.
}

Der fileschutzstatus -Wert Protected bedeutet, dass die Datei geschützt ist und Ihre APP Sie öffnen kann, da ihre app in der Liste der zulässigen Richtlinien enthalten ist.A FileProtectionStatus value of Protected means that the file is protected and your app can open it because your app is on the policy's allowed list.

Der fileschutzstatus -Wert ungeschützt bedeutet, dass die Datei nicht geschützt ist und die APP die Datei öffnen kann, auch wenn Ihre APP nicht in der Liste der zulässigen Richtlinien enthalten ist.A FileProtectionStatus value of UnProtected means that the file is not protected and your app can open the file even your app is not on the policy's allowed list.

APIsAPIs
FileProtectionManager.GetProtectionInfoAsyncFileProtectionManager.GetProtectionInfoAsync
FileschutzinfoFileProtectionInfo
FileProtectionStatusFileProtectionStatus
ProtectionPolicyManager.IsIdentityManagedProtectionPolicyManager.IsIdentityManaged

Schritt 3: Lesen Sie die Datei in einen Datenstrom oder Puffer einStep 3: Read the file into a stream or buffer

Lesen Sie die Datei in einen DatenstromRead the file into a stream

var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);

Lesen Sie die Datei in einen PufferRead the file into a buffer

var buffer = await Windows.Storage.FileIO.ReadBufferAsync(file);

Lesen Sie Daten von einem Netzwerkendpunkt ausRead data from a network endpoint

Erstellen Sie einen geschützten Threadkontext zum Lesen aus einem Unternehmens-Endpunkt.Create a protected thread context to read from an enterprise endpoint.

Schritt 1: Abrufen der Identität des NetzwerkendpunktesStep 1: Get the identity of the network endpoint

Uri resourceURI = new Uri("http://contoso.com/stockData.xml");

Windows.Networking.HostName hostName =
    new Windows.Networking.HostName(resourceURI.Host);

string identity = await ProtectionPolicyManager.
    GetPrimaryManagedIdentityForNetworkEndpointAsync(hostName);

Wenn der Endpunkt nicht mithilfe der Gruppenrichtlinie verwaltet wird, erhalten Sie einen leeren String zurück.If the endpoint isn't managed by policy, you'll get back an empty string.

APIsAPIs
ProtectionPolicyManager.GetPrimaryManagedIdentityForNetworkEndpointAsyncProtectionPolicyManager.GetPrimaryManagedIdentityForNetworkEndpointAsync

Schritt 2: Erstellen eines geschützten ThreadkontextsStep 2: Create a protected thread context

Wenn der Endpunkt durch die Richtlinie verwaltet wird, erstellen Sie einen geschützten Threadkontext.If the endpoint is managed by policy, create a protected thread context. Dadurch werden alle Netzwerkverbindungen markiert, die mit dieser Identität auf demselben Thread hergestellt werden.This tags any network connections that you make on the same thread to the identity.

Sie erhalten auch Zugriff auf Unternehmensnetzwerkressourcen, die von dieser Richtlinie verwaltet werden.It also gives you access to enterprise network resources that are managed by that policy.

if (!string.IsNullOrEmpty(identity))
{
    using (ThreadNetworkContext threadNetworkContext =
            ProtectionPolicyManager.CreateCurrentThreadNetworkContext(identity))
    {
        return await GetDataFromNetworkRedirectHelperMethod(resourceURI);
    }
}
else
{
    return await GetDataFromNetworkRedirectHelperMethod(resourceURI);
}

Dieses Beispiel umschließt Socket-Aufrufe in einem using-Block.This example encloses socket calls in a using block. Wenn Sie dies nicht tun, stellen Sie sicher, dass Sie den Threadkontext schließen, nachdem Sie die Ressource abgerufen haben.If you don't do this, make sure that you close the thread context after you've retrieved your resource. Siehe ThreadNetworkContext.Close.See ThreadNetworkContext.Close.

Erstellen Sie keine persönlichen Dateien auf geschützten Threads, da diese Dateien automatisch verschlüsselt werden.Don't create any personal files on that protected thread because those files will be automatically encrypted.

Die ProtectionPolicyManager.CreateCurrentThreadNetworkContext-Methode gibt ein ThreadNetworkContext-Objekt zurück, unabhängig davon, ob der Endpunkt durch die Richtlinie verwaltet wird.The ProtectionPolicyManager.CreateCurrentThreadNetworkContext method returns a ThreadNetworkContext object whether or not the endpoint is being managed by policy. Wenn Ihre App persönliche und Unternehmensressourcen behandelt, rufen Sie ProtectionPolicyManager.CreateCurrentThreadNetworkContext für alle Identitäten auf.If your app handles both personal and enterprise resources, call ProtectionPolicyManager.CreateCurrentThreadNetworkContext for all identities. Nachdem Sie die Ressource erhalten haben, geben Sie den ThreadNetworkContext frei, um jedes Identitätstag des aktuellen Threads zu deaktivieren.After you get the resource, dispose the ThreadNetworkContext to clear any identity tag from the current thread.

APIsAPIs
ProtectionPolicyManager.GetForCurrentViewProtectionPolicyManager.GetForCurrentView
ProtectionPolicyManager.IdentityProtectionPolicyManager.Identity
ProtectionPolicyManager.CreateCurrentThreadNetworkContextProtectionPolicyManager.CreateCurrentThreadNetworkContext

Schritt 3: Lesen Sie die Ressource in einen PufferStep 3: Read the resource into a buffer

private static async Task<IBuffer> GetDataFromNetworkHelperMethod(Uri resourceURI)
{
    HttpClient client;

    client = new HttpClient();

    try { return await client.GetBufferAsync(resourceURI); }

    catch (Exception) { return null; }
}

Optionale Verwenden Sie ein Header Token, anstatt einen geschützten Thread Kontext zu erstellen.(Optional) Use a header token instead of creating a protected thread context

public static async Task<IBuffer> GetDataFromNetworkbyUsingHeader(Uri resourceURI)
{
    HttpClient client;

    Windows.Networking.HostName hostName =
        new Windows.Networking.HostName(resourceURI.Host);

    string identity = await ProtectionPolicyManager.
        GetPrimaryManagedIdentityForNetworkEndpointAsync(hostName);

    if (!string.IsNullOrEmpty(identity))
    {
        client = new HttpClient();

        HttpRequestHeaderCollection headerCollection = client.DefaultRequestHeaders;

        headerCollection.Add("X-MS-Windows-HttpClient-EnterpriseId", identity);

        return await GetDataFromNetworkbyUsingHeaderHelperMethod(client, resourceURI);
    }
    else
    {
        client = new HttpClient();
        return await GetDataFromNetworkbyUsingHeaderHelperMethod(client, resourceURI);
    }

}

private static async Task<IBuffer> GetDataFromNetworkbyUsingHeaderHelperMethod(HttpClient client, Uri resourceURI)
{

    try { return await client.GetBufferAsync(resourceURI); }

    catch (Exception) { return null; }
}

Handle-Seite leitet weiterHandle page redirects

In einigen Fällen leitet ein Webserver Datenverkehr auf eine aktuellere Version einer Ressource weiter.Sometimes a web server will redirect traffic to a more current version of a resource.

Um damit umzugehen, stellen Sie Anfragen, bis der Antwortstatus Ihrer Anfrage den Wert OK hat.To handle this, make requests until the response status of your request has a value of OK.

Verwenden Sie dann den URI der Antwort, um die Identität des Endpunkts abzurufen.Then use the URI of that response to get the identity of the endpoint. Hier ist eine Möglichkeit, dies zu tun:Here's one way to do this:

private static async Task<IBuffer> GetDataFromNetworkRedirectHelperMethod(Uri resourceURI)
{
    HttpClient client = null;

    HttpBaseProtocolFilter filter = new HttpBaseProtocolFilter();
    filter.AllowAutoRedirect = false;

    client = new HttpClient(filter);

    HttpResponseMessage response = null;

        HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Get, resourceURI);
        response = await client.SendRequestAsync(message);

    if (response.StatusCode == HttpStatusCode.MultipleChoices ||
        response.StatusCode == HttpStatusCode.MovedPermanently ||
        response.StatusCode == HttpStatusCode.Found ||
        response.StatusCode == HttpStatusCode.SeeOther ||
        response.StatusCode == HttpStatusCode.NotModified ||
        response.StatusCode == HttpStatusCode.UseProxy ||
        response.StatusCode == HttpStatusCode.TemporaryRedirect ||
        response.StatusCode == HttpStatusCode.PermanentRedirect)
    {
        message = new HttpRequestMessage(HttpMethod.Get, message.RequestUri);
        response = await client.SendRequestAsync(message);

        try { return await response.Content.ReadAsBufferAsync(); }

        catch (Exception) { return null; }
    }
    else
    {
        try { return await response.Content.ReadAsBufferAsync(); }

        catch (Exception) { return null; }
    }
}

APIsAPIs
ProtectionPolicyManager.GetPrimaryManagedIdentityForNetworkEndpointAsyncProtectionPolicyManager.GetPrimaryManagedIdentityForNetworkEndpointAsync
ProtectionPolicyManager.CreateCurrentThreadNetworkContextProtectionPolicyManager.CreateCurrentThreadNetworkContext
ProtectionPolicyManager.GetForCurrentViewProtectionPolicyManager.GetForCurrentView
ProtectionPolicyManager.IdentityProtectionPolicyManager.Identity

Daten aus der Zwischenablage lesenRead data from the clipboard

Erhalten Sie die Berechtigung zum Verwenden von Daten aus der ZwischenablageGet permission to use data from the clipboard

Zum Abrufen von Daten aus der Zwischenablage bitten Sie Windows um Erlaubnis.To get data from the clipboard, ask Windows for permission. Verwenden Sie dazu DataPackageView.RequestAccessAsync .Use DataPackageView.RequestAccessAsync to do that.

public static async Task PasteText(TextBox textBox)
{
    DataPackageView dataPackageView = Clipboard.GetContent();

    if (dataPackageView.Contains(StandardDataFormats.Text))
    {
        ProtectionPolicyEvaluationResult result = await dataPackageView.RequestAccessAsync();

        if (result == ProtectionPolicyEvaluationResult..Allowed)
        {
            string contentsOfClipboard = await dataPackageView.GetTextAsync();
            textBox.Text = contentsOfClipboard;
        }
    }
}

APIsAPIs
DataPackageView.RequestAccessAsyncDataPackageView.RequestAccessAsync

Ausblenden oder Deaktivieren von Features, die Daten aus der Zwischenablage verwendenHide or disable features that use clipboard data

Ermitteln Sie, ob die aktuelle Ansicht über die Berechtigung zum Abrufen von Daten, die sich in der Zwischenablage befinden, verfügt.Determine whether current view has permission to get data that is on the clipboard.

Wenn dies nicht der Fall ist, können Sie Steuerelemente, mit denen Benutzer Informationen aus der Zwischenablage einsetzen oder den Inhalt in der Vorschau anzeigen, deaktivieren oder ausblenden.If it doesn't, you can disable or hide controls that let users paste information from the clipboard or preview its contents.

private bool IsClipboardAllowedAsync()
{
    ProtectionPolicyEvaluationResult protectionPolicyEvaluationResult = ProtectionPolicyEvaluationResult.Blocked;

    DataPackageView dataPackageView = Clipboard.GetContent();

    if (dataPackageView.Contains(StandardDataFormats.Text))

        protectionPolicyEvaluationResult =
            ProtectionPolicyManager.CheckAccess(dataPackageView.Properties.EnterpriseId,
                ProtectionPolicyManager.GetForCurrentView().Identity);

    return (protectionPolicyEvaluationResult == ProtectionPolicyEvaluationResult.Allowed |
        protectionPolicyEvaluationResult == ProtectionPolicyEvaluationResult.ConsentRequired);
}

APIsAPIs
ProtectionPolicyEvaluationResultProtectionPolicyEvaluationResult
ProtectionPolicyManager.GetForCurrentViewProtectionPolicyManager.GetForCurrentView
ProtectionPolicyManager.IdentityProtectionPolicyManager.Identity

Verhindern Sie, dass Benutzer mit einem Dialogfeld zur Zustimmung aufgefordert werdenPrevent users from being prompted with a consent dialog box

Ein neues Dokument ist nicht persönlich oder Unternehmen.A new document isn't personal or enterprise. Es ist einfach neu.It's just new. Wenn ein Benutzer Unternehmensdaten in die Datei einsetzt, setzt Windows Richtlinien durch und der Benutzer wird aufgefordert, einem Dialogfeld zuzustimmen.If a user pastes enterprise data into it, Windows enforces policy and the user is prompted with a consent dialog. Dieser Code verhindert, dass dies geschieht.This code prevents that from happening. Es geht bei dieser Aufgabe nicht darum, Daten zu schützen.This task is not about helping to protect data. Es geht mehr darum, Benutzer davon abzuhalten, Dialogfelder zur Zustimmung zu sehen – in Fällen, in denen Ihre App ein völlig neues Element erstellt hat.It's more about keeping users from receiving the consent dialog box in cases where your app creates a brand new item.

private async void PasteText(bool isNewEmptyDocument)
{
    DataPackageView dataPackageView = Clipboard.GetContent();

    if (dataPackageView.Contains(StandardDataFormats.Text))
    {
        if (!string.IsNullOrEmpty(dataPackageView.Properties.EnterpriseId))
        {
            if (isNewEmptyDocument)
            {
                ProtectionPolicyManager.TryApplyProcessUIPolicy(dataPackageView.Properties.EnterpriseId);
                string contentsOfClipboard = contentsOfClipboard = await dataPackageView.GetTextAsync();
                // add this string to the new item or document here.          

            }
            else
            {
                ProtectionPolicyEvaluationResult result = await dataPackageView.RequestAccessAsync();

                if (result == ProtectionPolicyEvaluationResult.Allowed)
                {
                    string contentsOfClipboard = contentsOfClipboard = await dataPackageView.GetTextAsync();
                    // add this string to the new item or document here.
                }
            }
        }
    }
}

APIsAPIs
DataPackageView.RequestAccessAsyncDataPackageView.RequestAccessAsync
ProtectionPolicyEvaluationResultProtectionPolicyEvaluationResult
ProtectionPolicyManager.TryApplyProcessUIPolicyProtectionPolicyManager.TryApplyProcessUIPolicy

Lesen von Daten aus einem Freigabe-VertragRead data from a Share contract

Wenn Mitarbeiter zur Freigabe ihrer Informationen Ihre App auswählen, öffnet Ihre App ein neues Element, das diese Inhalte enthält.When employees choose your app to share their information, your app will open a new item that contains that content.

Wie bereits erwähnt, wird ein neues Element nicht persönlich oder Unternehmen.As we mentioned earlier, a new item isn't personal or enterprise. Es ist einfach neu.It's just new. Wenn Ihr Code Unternehmensinhalt zu dem Element hinzufügt, setzt Windows Richtlinien durch und der Benutzer wird mit einem Zustimmungsdialogfeld aufgefordert.If your code adds enterprise content to the item, Windows enforces policy and the user is prompted with a consent dialog. Dieser Code verhindert, dass dies geschieht.This code prevents that from happening.

protected override async void OnShareTargetActivated(ShareTargetActivatedEventArgs args)
{
    bool isNewEmptyDocument = true;
    string identity = "corp.microsoft.com";

    ShareOperation shareOperation = args.ShareOperation;
    if (shareOperation.Data.Contains(StandardDataFormats.Text))
    {
        if (!string.IsNullOrEmpty(shareOperation.Data.Properties.EnterpriseId))
        {
            if (isNewEmptyDocument)
                // If this is a new and empty document, and we're allowed to access
                // the data, then we can avoid popping the consent dialog
                ProtectionPolicyManager.TryApplyProcessUIPolicy(shareOperation.Data.Properties.EnterpriseId);
            else
            {
                // In this case, we can't optimize the workflow, so we just
                // request consent from the user in this case.

                ProtectionPolicyEvaluationResult protectionPolicyEvaluationResult = await shareOperation.Data.RequestAccessAsync();

                if (protectionPolicyEvaluationResult == ProtectionPolicyEvaluationResult.Allowed)
                {
                    string text = await shareOperation.Data.GetTextAsync();

                    // Do something with that text.
                }
            }
        }
        else
        {
            // If the data has no enterprise identity, then we already have access.
            string text = await shareOperation.Data.GetTextAsync();

            // Do something with that text.
        }

    }

}

APIsAPIs
Schutzpolicymanager. requestaccessasyncProtectionPolicyManager.RequestAccessAsync
ProtectionPolicyEvaluationResultProtectionPolicyEvaluationResult
ProtectionPolicyManager.TryApplyProcessUIPolicyProtectionPolicyManager.TryApplyProcessUIPolicy

Unternehmensdaten schützenProtect enterprise data

Schützen Sie Unternehmensdaten, die Ihre App verlassen.Protect enterprise data that leaves your app. Daten verlassen Ihre App, wenn Sie diese auf einer Seite zeigen. Sichern Sie sie in einer Datei oder einem Netzwerkendpunkt oder über einen Freigabe-Vertrag.Data leaves your app when you show it in a page, save it to a file or network endpoint, or through a share contract.

In diesem Abschnitt:In this section:

Schützen Sie Daten, die auf Seiten angezeigt werden.Protect data that appears in pages

Wenn Sie Daten auf einer Seite anzeigen, können Sie Windows mitteilen, um welche Art von Daten es sich handelt (persönlich oder Unternehmen).When you show data in a page, let Windows know what type of data it is (personal or enterprise). Zu diesem Zweck markieren Sie die aktuelle App-Ansicht, oder markieren Sie den gesamten App-Prozess.To do that, tag the current app view or tag the entire app process.

Wenn Sie die Ansicht oder den Prozess markieren, setzt Windows die Richtlinie durch.When you tag the view or the process, Windows enforces policy on it. Dadurch werden Datenlecks verhindert, die aus Aktionen, die Ihre App nicht steuert, entstehen.This helps prevent data leaks that result from actions that your app doesn't control. Beispielsweise auf einem Computer könnten ein Benutzer mit STRG+V Unternehmensinformationen aus einer Ansicht kopieren und diese Informationen in einer anderen App einsetzen.For example, on a computer, a user could use CTRL-V to copy enterprise information from a view and then paste that information to another app. Windows schützt davor.Windows protects against that. Windows hilft auch, die Freigabe-Verträge durchzusetzen.Windows also helps to enforce share contracts.

Markieren der aktuellen App-AnsichtTag the current app view

Vorgehensweise, wenn Ihre App mehrere Ansichten hat, in denen einige Ansichten Unternehmensdaten und einige persönliche Daten nutzen.Do this if your app has multiple views where some views consume enterprise data and some consume personal data.


// tag as enterprise data. "identity" the string that contains the enterprise ID.
// You'd get that from a file, network endpoint, or clipboard data package.
ProtectionPolicyManager.GetForCurrentView().Identity = identity;

// tag as personal data.
ProtectionPolicyManager.GetForCurrentView().Identity = String.Empty;

APIsAPIs
ProtectionPolicyManager.GetForCurrentViewProtectionPolicyManager.GetForCurrentView
ProtectionPolicyManager.IdentityProtectionPolicyManager.Identity

Markieren des ProzessesTag the process

Vorgehensweise, wenn alle Ansichten in der App mit nur einem Typ von Daten (persönlich oder Unternehmen) verwendet werden.Do this if all views in your app will work with only one type of data (personal or enterprise).

Dadurch müssen Sie nicht unabhängig voneinander markierte Ansichten verwalten.This prevents you from having to manage independently tagged views.



// tag as enterprise data. "identity" the string that contains the enterprise ID.
// You'd get that from a file, network endpoint, or clipboard data package.
bool result =
            ProtectionPolicyManager.TryApplyProcessUIPolicy(identity);

// tag as personal data.
ProtectionPolicyManager.ClearProcessUIPolicy();

APIsAPIs
ProtectionPolicyManager.TryApplyProcessUIPolicyProtectionPolicyManager.TryApplyProcessUIPolicy

Daten in einer Datei schützenProtect data to a file

Erstellen Sie eine geschützte Datei, und schreiben Sie dann hinein.Create a protected file and then write to it.

Schritt 1: Ermitteln Sie, ob Ihre App eine Unternehmensdatei erstellen kannStep 1: Determine if your app can create an enterprise file

Ihre App kann eine Unternehmensdatei erstellen, wenn der Identitätsstring durch die Richtlinie verwaltet wird und Ihre App sich auf der Liste der zulässigen Apps von dieser Richtlinie befindet.Your app can create an enterprise file if the identity string is managed by policy and your app is on the Allowed list of that policy.

  if (!ProtectionPolicyManager.IsIdentityManaged(identity)) return false;

APIsAPIs
ProtectionPolicyManager.IsIdentityManagedProtectionPolicyManager.IsIdentityManaged

Schritt 2: Erstellen Sie die Datei, und schützen Sie die IdentitätStep 2: Create the file and protect it to the identity

StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
StorageFile storageFile = await storageFolder.CreateFileAsync("sample.txt",
    CreationCollisionOption.ReplaceExisting);

FileProtectionInfo fileProtectionInfo =
    await FileProtectionManager.ProtectAsync(storageFile, identity);

APIsAPIs
FileProtectionManager.ProtectAsyncFileProtectionManager.ProtectAsync

Schritt 3: Schreiben Sie die Datenströme oder Puffer in die DateiStep 3: Write that stream or buffer to the file

Schreiben Sie einen DatenstromWrite a stream

    if (fileProtectionInfo.Status == FileProtectionStatus.Protected)
    {
        var stream = await storageFile.OpenAsync(FileAccessMode.ReadWrite);

        using (var outputStream = stream.GetOutputStreamAt(0))
        {
            using (var dataWriter = new DataWriter(outputStream))
            {
                dataWriter.WriteString(enterpriseData);
            }
        }

    }

Schreiben eines PuffersWrite a buffer

     if (fileProtectionInfo.Status == FileProtectionStatus.Protected)
     {
         var buffer = Windows.Security.Cryptography.CryptographicBuffer.ConvertStringToBinary(
             enterpriseData, Windows.Security.Cryptography.BinaryStringEncoding.Utf8);

         await FileIO.WriteBufferAsync(storageFile, buffer);

      }

APIsAPIs
FileschutzinfoFileProtectionInfo
FileProtectionStatusFileProtectionStatus

Schützen von Daten in einer Datei als HintergrundprozessProtect data to a file as a background process

Während der Bildschirm des Geräts gesperrt ist, kann dieser Code ausgeführt werden.This code can run while the screen of the device is locked. Wenn der Administrator eine sichere "Schutz von Daten bei Sperre" (Data Protection Under Lock, DPL) Richtlinie konfiguriert, entfernt Windows die Verschlüsselungsschlüssel, die erforderlich sind, um Zugriff auf geschützte Ressourcen aus dem Arbeitsspeicher des Geräts zu erhalten.If the administrator configured a secure "Data protection under lock" (DPL) policy, Windows removes the encryption keys required to access protected resources from device memory. Dies beugt Datenverlusten vor, wenn das Gerät verloren geht.This prevents data leaks if the device is lost. Das gleiche Feature entfernt auch Schlüssel, die mit geschützten Dateien heruntergeladen wurden, wenn deren Handles geschlossen werden.This same feature also removes keys associated with protected files when their handles are closed.

Sie müssen einen Ansatz verwenden, der das Datei-Handle geöffnet hält, wenn Sie eine Datei erstellen.You'll have to use an approach that keeps the file handle open when you create a file.

Schritt 1: Ermitteln Sie, ob Sie eine Unternehmensdatei erstellen könnenStep 1: Determine if you can create an enterprise file

Sie können eine Unternehmensdatei erstellen, wenn die Identität, die Sie verwenden, durch die Richtlinie verwaltet wird und Ihre App sich auf der Liste der zulässigen Apps dieser Richtlinie befindet.You can create an enterprise file if the identity that you're using is managed by policy and your app is on the allowed list of that policy.

if (!ProtectionPolicyManager.IsIdentityManaged(identity)) return false;

APIsAPIs
ProtectionPolicyManager.IsIdentityManagedProtectionPolicyManager.IsIdentityManaged

Schritt 2: Erstellen Sie eine Datei, und schützen Sie die IdentitätStep 2: Create a file and protect it to the identity

Der FileProtectionManager.CreateProtectedAndOpenAsync erstellt eine geschützte Datei und hält das Datei-Handle geöffnet, während Sie einen Schreibvorgang ausführen.The FileProtectionManager.CreateProtectedAndOpenAsync creates a protected file and keeps the file handle open while you write to it.

StorageFolder storageFolder = ApplicationData.Current.LocalFolder;

ProtectedFileCreateResult protectedFileCreateResult =
    await FileProtectionManager.CreateProtectedAndOpenAsync(storageFolder,
        "sample.txt", identity, CreationCollisionOption.ReplaceExisting);

APIsAPIs
FileProtectionManager.CreateProtectedAndOpenAsyncFileProtectionManager.CreateProtectedAndOpenAsync

Schritt 3: Schreiben Sie Datenströme oder Puffer in die DateiStep 3: Write a stream or buffer to the file

Dieses Beispiel schreibt einen Datenstrom in eine Datei.This example writes a stream to a file.

if (protectedFileCreateResult.ProtectionInfo.Status == FileProtectionStatus.Protected)
{
    IOutputStream outputStream =
        protectedFileCreateResult.Stream.GetOutputStreamAt(0);

    using (DataWriter writer = new DataWriter(outputStream))
    {
        writer.WriteString(enterpriseData);
        await writer.StoreAsync();
        await writer.FlushAsync();
    }

    outputStream.Dispose();
}
else if (protectedFileCreateResult.ProtectionInfo.Status == FileProtectionStatus.AccessSuspended)
{
    // Perform any special processing for the access suspended case.
}

APIsAPIs
ProtectedFileCreateResult.ProtectionInfoProtectedFileCreateResult.ProtectionInfo
FileProtectionStatusFileProtectionStatus
ProtectedFileCreateResult.DatenstromProtectedFileCreateResult.Stream

Einen Teil einer Datei schützenProtect part of a file

In den meisten Fällen ist es sauberer, Unternehmens- und persönliche Daten separat zu speichern, jedoch können Sie sie in derselben Datei speichern, wenn Sie möchten.In most cases, it's cleaner to store enterprise and personal data separately but you can store them to the same file if you want. Beispielsweise kann Microsoft Outlook Unternehmens-E-Mails zusammen mit den persönlichen E-Mails in einer einzigen Archivdatei speichern.For example, Microsoft Outlook can store enterprise mails alongside of personal mails in a single archive file.

Verschlüsseln Sie die Unternehmensdaten, jedoch nicht die gesamte Datei.Encrypt the enterprise data but not the entire file. Auf diese Weise können Benutzer weiterhin mit der Datei arbeiten, selbst wenn sie von MDM aufgehoben werden oder ihre Unternehmensdatenzugriffsrechte widerrufen werden.That way, users can continue using that file even if they un-enroll from MDM or their enterprise data access rights are revoked. Darüber hinaus sollte Ihre App den Überblick behalten, welche Daten sie verschlüsselt, damit bekannt ist, welche Daten zu schützen sind, wenn sie die Datei zurück in den Arbeitsspeicher liest.Also, your app should keep track of what data it encrypts so that it knows what data to protect when it reads the file back into memory.

Schritt 1: Hinzufügen von Unternehmensdaten zu einem verschlüsselten Datenstrom oder PufferStep 1: Add enterprise data to an encrypted stream or buffer

string enterpriseDataString = "<employees><employee><name>Bill</name><social>xxx-xxx-xxxx</social></employee></employees>";

var enterpriseData= Windows.Security.Cryptography.CryptographicBuffer.ConvertStringToBinary(
        enterpriseDataString, Windows.Security.Cryptography.BinaryStringEncoding.Utf8);

BufferProtectUnprotectResult result =
   await DataProtectionManager.ProtectAsync(enterpriseData, identity);

enterpriseData= result.Buffer;

APIsAPIs
DataProtectionManager.ProtectAsyncDataProtectionManager.ProtectAsync
BufferProtectUnprotectResult.PufferBufferProtectUnprotectResult.buffer

Schritt 2: Hinzufügen von persönlichen Daten zu einem unverschlüsselten Datenstrom oder PufferStep 2: Add personal data to an unencrypted stream or buffer

string personalDataString = "<recipies><recipe><name>BillsCupCakes</name><cooktime>30</cooktime></recipe></recipies>";

var personalData = Windows.Security.Cryptography.CryptographicBuffer.ConvertStringToBinary(
    personalDataString, Windows.Security.Cryptography.BinaryStringEncoding.Utf8);

Schritt 3: Schreiben Sie Datenströme oder Puffer in eine DateiStep 3: Write both streams or buffers to a file

StorageFolder storageFolder = ApplicationData.Current.LocalFolder;

StorageFile storageFile = await storageFolder.CreateFileAsync("data.xml",
    CreationCollisionOption.ReplaceExisting);

 // Write both buffers to the file and save the file.

var stream = await storageFile.OpenAsync(FileAccessMode.ReadWrite);

using (var outputStream = stream.GetOutputStreamAt(0))
{
    using (var dataWriter = new DataWriter(outputStream))
    {
        dataWriter.WriteBuffer(enterpriseData);
        dataWriter.WriteBuffer(personalData);

        await dataWriter.StoreAsync();
        await outputStream.FlushAsync();
    }
}

Schritt 4: Behalten Sie den Überblick über den Speicherort Ihrer Unternehmensdaten in der DateiStep 4: Keep track of the location of your enterprise data in the file

Ihre App ist dafür verantwortlich, die zum Unternehmen gehörigen Daten in der Datei im Blick zu behalten.It's the responsibility of your app to keep track of the data in that file that is enterprise owned.

Sie können diese Informationen in der Datei-Eigenschaft, einer Datenbank oder in einem Kopfzeilentext in der Datei speichern.You can store that information in a property associated with the file, in a database, or in some header text in the file.

Dieses Beispiel sichert die Informationen in eine separate XML-Datei.This example, saves that information to a separate XML file.

StorageFile metaDataFile = await storageFolder.CreateFileAsync("metadata.xml",
   CreationCollisionOption.ReplaceExisting);

await Windows.Storage.FileIO.WriteTextAsync
    (metaDataFile, "<EnterpriseDataMarker start='0' end='" + enterpriseData.Length.ToString() +
    "'></EnterpriseDataMarker>");

Lesen Sie den geschützten Teil einer DateiRead the protected part of a file

Hier wird beschrieben, wie die Unternehmensdaten aus der Datei gelesen werden würde.Here's how you'd read the enterprise data out of that file.

Schritt 1: Abrufen der Position Ihrer Unternehmensdaten in der DateiStep 1: Get the position of your enterprise data in the file

Windows.Storage.StorageFolder storageFolder =
    Windows.Storage.ApplicationData.Current.LocalFolder;

 Windows.Storage.StorageFile metaDataFile =
   await storageFolder.GetFileAsync("metadata.xml");

string metaData = await Windows.Storage.FileIO.ReadTextAsync(metaDataFile);

XmlDocument doc = new XmlDocument();

doc.LoadXml(metaData);

uint startPosition =
    Convert.ToUInt16((doc.FirstChild.Attributes.GetNamedItem("start")).InnerText);

uint endPosition =
    Convert.ToUInt16((doc.FirstChild.Attributes.GetNamedItem("end")).InnerText);

Schritt 2: Öffnen Sie die Datei, und stellen Sie sicher, dass sie nicht geschützt istStep 2: Open the data file and make sure that it's not protected

Windows.Storage.StorageFile dataFile =
    await storageFolder.GetFileAsync("data.xml");

FileProtectionInfo protectionInfo =
    await FileProtectionManager.GetProtectionInfoAsync(dataFile);

if (protectionInfo.Status == FileProtectionStatus.Protected)
    return false;

APIsAPIs
FileProtectionManager.GetProtectionInfoAsyncFileProtectionManager.GetProtectionInfoAsync
FileschutzinfoFileProtectionInfo
FileProtectionStatusFileProtectionStatus

Schritt 3: Lesen Sie in den Unternehmensdaten aus der Datei.Step 3: Read the enterprise data from the file

var stream = await dataFile.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite);

stream.Seek(startPosition);

Windows.Storage.Streams.Buffer tempBuffer = new Windows.Storage.Streams.Buffer(50000);

IBuffer enterpriseData = await stream.ReadAsync(tempBuffer, endPosition, InputStreamOptions.None);

Schritt 4: Entschlüsseln Sie den Puffer, der Unternehmensdaten enthältStep 4: Decrypt the buffer that contains enterprise data

DataProtectionInfo dataProtectionInfo =
   await DataProtectionManager.GetProtectionInfoAsync(enterpriseData);

if (dataProtectionInfo.Status == DataProtectionStatus.Protected)
{
    BufferProtectUnprotectResult result = await DataProtectionManager.UnprotectAsync(enterpriseData);
    enterpriseData = result.Buffer;
}
else if (dataProtectionInfo.Status == DataProtectionStatus.Revoked)
{
    // Code goes here to handle this situation. Perhaps, show UI
    // saying that the user's data has been revoked.
}

APIsAPIs
DataProtectionInfoDataProtectionInfo
DataProtectionManager.GetProtectionInfoAsyncDataProtectionManager.GetProtectionInfoAsync

Schützen Sie Daten in einem OrdnerProtect data to a folder

Sie können einen Ordner erstellen und diesen schützen.You can create a folder and protect it. Auf diese Weise sind alle Elemente, die Sie zu diesem Ordner hinzufügen, automatisch geschützt.That way any items that you add to that folder are automatically protected.

private async Task<bool> CreateANewFolderAndProtectItAsync(string folderName, string identity)
{
    if (!ProtectionPolicyManager.IsIdentityManaged(identity)) return false;

    StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
    StorageFolder newStorageFolder =
        await storageFolder.CreateFolderAsync(folderName);

    FileProtectionInfo fileProtectionInfo =
        await FileProtectionManager.ProtectAsync(newStorageFolder, identity);

    if (fileProtectionInfo.Status != FileProtectionStatus.Protected)
    {
        // Protection failed.
        return false;
    }
    return true;
}

Stellen Sie sicher, dass der Ordner leer ist, bevor Sie ihn schützen.Make sure that the folder is empty before you protect it. Es ist nicht möglich, einen Ordner zu schützen, der bereits Elemente enthält.You can't protect a folder that already contains items.

APIsAPIs
ProtectionPolicyManager.IsIdentityManagedProtectionPolicyManager.IsIdentityManaged
FileProtectionManager.ProtectAsyncFileProtectionManager.ProtectAsync
FileProtectionInfo.IdentityFileProtectionInfo.Identity
FileProtectionInfo.StatusFileProtectionInfo.Status

Schützen Sie Daten in einem NetzwerkendpunktProtect data to a network end point

Erstellen Sie einen geschützten Threadkontext zum Senden von Daten an einen Unternehmensendpunkt.Create a protected thread context to send that data to an enterprise endpoint.

Schritt 1: Abrufen der Identität des NetzwerkendpunktesStep 1: Get the identity of the network endpoint

Windows.Networking.HostName hostName =
    new Windows.Networking.HostName(resourceURI.Host);

string identity = await ProtectionPolicyManager.
    GetPrimaryManagedIdentityForNetworkEndpointAsync(hostName);

APIsAPIs
ProtectionPolicyManager.GetPrimaryManagedIdentityForNetworkEndpointAsyncProtectionPolicyManager.GetPrimaryManagedIdentityForNetworkEndpointAsync

Schritt 2: Erstellen eines geschützten Threadkontexts und Senden von Daten an den NetzwerkendpunktStep 2: Create a protected thread context and send data to the network endpoint

HttpClient client = null;

if (!string.IsNullOrEmpty(m_EnterpriseId))
{
    ProtectionPolicyManager.GetForCurrentView().Identity = identity;

    using (ThreadNetworkContext threadNetworkContext =
            ProtectionPolicyManager.CreateCurrentThreadNetworkContext(identity))
    {
        client = new HttpClient();
        HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Put, resourceURI);
        message.Content = new HttpStreamContent(dataToWrite);

        HttpResponseMessage response = await client.SendRequestAsync(message);

        if (response.StatusCode == HttpStatusCode.Ok)
            return true;
        else
            return false;
    }
}
else
{
    return false;
}

APIsAPIs
ProtectionPolicyManager.GetForCurrentViewProtectionPolicyManager.GetForCurrentView
ProtectionPolicyManager.IdentityProtectionPolicyManager.Identity
ProtectionPolicyManager.CreateCurrentThreadNetworkContextProtectionPolicyManager.CreateCurrentThreadNetworkContext

Schützen Sie Daten, die Ihre App über einen Freigabe-Vertrag teiltProtect data that your app shares through a share contract

Wenn Benutzer Inhalt aus Ihrer App freigeben sollen, müssen Sie einen Freigabe-Vertrag implementieren und das Ereignis DataTransferManager.DataRequested behandeln.If you want users to share content from your app, you'll have to implement a share contract and handle the DataTransferManager.DataRequested event.

Legen Sie in Ihrem Ereignishandler den Unternehmensidentitätskontext im Datenpaket fest.In your event handler, set the enterprise identity context in the data package.

private void OnShareSourceOperation(object sender, RoutedEventArgs e)
{
    // Register the current page as a share source (or you could do this earlier in your app).
    DataTransferManager.GetForCurrentView().DataRequested += OnDataRequested;
    DataTransferManager.ShowShareUI();
}

private void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
    if (!string.IsNullOrEmpty(this.shareSourceContent))
    {
        var protectionPolicyManager = ProtectionPolicyManager.GetForCurrentView();
        DataPackage requestData = args.Request.Data;
        requestData.Properties.Title = this.shareSourceTitle;
        requestData.Properties.EnterpriseId = protectionPolicyManager.Identity;
        requestData.SetText(this.shareSourceContent);
    }
}

APIsAPIs
ProtectionPolicyManager.GetForCurrentViewProtectionPolicyManager.GetForCurrentView
ProtectionPolicyManager.IdentityProtectionPolicyManager.Identity

Schützen von Dateien, die Sie an einen anderen Speicherort kopierenProtect files that you copy to another location

private async void CopyProtectionFromOneFileToAnother
    (StorageFile sourceStorageFile, StorageFile targetStorageFile)
{
    bool copyResult = await
        FileProtectionManager.CopyProtectionAsync(sourceStorageFile, targetStorageFile);

    if (!copyResult)
    {
        // Copying failed. To diagnose, you could check the file's status.
        // (call FileProtectionManager.GetProtectionInfoAsync and
        // check FileProtectionInfo.Status).
    }
}

APIsAPIs
FileProtectionManager.CopyProtectionAsyncFileProtectionManager.CopyProtectionAsync

Unternehmensdaten schützen, wenn der Bildschirm des Geräts gesperrt istProtect enterprise data when the screen of the device is locked

Entfernen Sie alle sensible Daten im Arbeitsspeicher, wenn das Gerät gesperrt wird.Remove all sensitive data in memory when the device is locked. Wenn der Benutzer das Gerät entsperrt, kann Ihre App diese Daten wieder sicher hinzufügen.When the user unlocks the device, your app can safely add that data back.

Behandeln des ProtectionPolicyManager.ProtectedAccessSuspending Ereignis, damit Ihre App weiß, wann der Bildschirm gesperrt ist.Handle the ProtectionPolicyManager.ProtectedAccessSuspending event so that your app knows when the screen is locked. Dieses Ereignis wird nur ausgelöst, wenn der Administrator einen sicheren Datenschutz bei Sperre in den Richtlinien konfiguriert.This event is raised only if the administrator configures a secure data protection under lock policy. Windows entfernt vorübergehend die Datenschutzschlüssel, welche auf dem Gerät bereitgestellt werden.Windows temporarily removes the data protection keys that are provisioned on the device. Windows entfernt diese Schlüssel, um sicherzustellen, dass es keine nicht autorisierten Zugriffe auf verschlüsselte Daten gibt, wenn das Gerät gesperrt und möglicherweise nicht im Besitz des Besitzers ist.Windows removes these keys to ensure that there is no unauthorized access to encrypted data while the device is locked and possibly not in possession of its owner.

Behandeln des ProtectionPolicyManager.ProtectedAccessResumed Ereignis, damit Ihre App weiß, wann der Bildschirm entsperrt ist.Handle the ProtectionPolicyManager.ProtectedAccessResumed event so that your app knows when the screen is unlocked. Dieses Ereignis wird ausgelöst, unabhängig davon, ob der Administrator einen sicheren Datenschutz bei Sperre in den Richtlinien konfiguriert.This event is raised regardless of whether the administrator configures a secure data protection under lock policy.

Entfernen Sie sensible Daten im Arbeitsspeicher, wenn der Bildschirm gesperrt wirdRemove sensitive data in memory when the screen is locked

Schützen Sie sensible Daten, und schließen Sie alle Datenströme, die Ihre App auf geschützten Dateien geöffnet hat, um sicherzustellen, dass das System keine sensiblen Daten im Speicher zwischenspeichert.Protect sensitive data, and close any file streams that your app has opened on protected files to help ensure that the system doesn't cache any sensitive data in memory.

Dieses Beispiel sichert Inhalte aus einem TextBlock-Steuerelement in einem verschlüsselten Puffer und entfernt die Inhalte von diesem TextBlock-Steuerelement.This example saves content from a textblock to an encrypted buffer and removes the content from that textblock.

private async void ProtectionPolicyManager_ProtectedAccessSuspending(object sender, ProtectedAccessSuspendingEventArgs e)
{
    Deferral deferral = e.GetDeferral();

    if (ProtectionPolicyManager.GetForCurrentView().Identity != String.Empty)
    {
        IBuffer documentBodyBuffer = CryptographicBuffer.ConvertStringToBinary
           (documentTextBlock.Text, BinaryStringEncoding.Utf8);

        BufferProtectUnprotectResult result = await DataProtectionManager.ProtectAsync
            (documentBodyBuffer, ProtectionPolicyManager.GetForCurrentView().Identity);

        if (result.ProtectionInfo.Status == DataProtectionStatus.Protected)
        {
            this.protectedDocumentBuffer = result.Buffer;
            documentTextBlock.Text = null;
        }
    }

    // Close any open streams that you are actively working with
    // to make sure that we have no unprotected content in memory.

    // Optionally, code goes here to use e.Deadline to determine whether we have more
    // than 15 seconds left before the suspension deadline. If we do then process any
    // messages queued up for sending while we are still able to access them.

    deferral.Complete();
}

APIsAPIs
ProtectionPolicyManager.ProtectedAccessSuspendingProtectionPolicyManager.ProtectedAccessSuspending
ProtectionPolicyManager.GetForCurrentViewProtectionPolicyManager.GetForCurrentView
ProtectionPolicyManager.IdentityProtectionPolicyManager.Identity
DataProtectionManager.ProtectAsyncDataProtectionManager.ProtectAsync
BufferProtectUnprotectResult.PufferBufferProtectUnprotectResult.buffer
ProtectedAccessSuspendingEventArgs.GetDeferralProtectedAccessSuspendingEventArgs.GetDeferral
Deferral.CompleteDeferral.Complete

Fügen Sie wieder sensible Daten ein, wenn das Gerät entsperrt wurdeAdd back sensitive data when the device is unlocked

ProtectionPolicyManager.ProtectedAccessResumed wird ausgelöst, wenn das Gerät entsperrt ist und die Schlüssel wieder auf dem Geräts verfügbar sind.ProtectionPolicyManager.ProtectedAccessResumed is raised when the device is unlocked and the keys are available on the device again.

ProtectedAccessResumedEventArgs.Identities ist eine leere Collection, wenn der Administrator keinen sicheren Datenschutz bei Sperre in den Richtlinien konfiguriert hat.ProtectedAccessResumedEventArgs.Identities is an empty collection if the administrator hasn't configured a secure data protection under lock policy.

In diesem Beispiel erfolgt das Gegenteil der Aktionen des vorherigen Beispiels.This example does the reverse of the previous example. Es entschlüsselt den Puffer, fügt Informationen dieses Puffers zum Textfeld hinzu und gibt anschließend den Puffer frei.It decrypts the buffer, adds information from that buffer back to the textbox and then disposes of the buffer.

private async void ProtectionPolicyManager_ProtectedAccessResumed(object sender, ProtectedAccessResumedEventArgs e)
{
    if (ProtectionPolicyManager.GetForCurrentView().Identity != String.Empty)
    {
        BufferProtectUnprotectResult result = await DataProtectionManager.UnprotectAsync
            (this.protectedDocumentBuffer);

        if (result.ProtectionInfo.Status == DataProtectionStatus.Unprotected)
        {
            // Restore the unprotected version.
            documentTextBlock.Text = CryptographicBuffer.ConvertBinaryToString
                (BinaryStringEncoding.Utf8, result.Buffer);
            this.protectedDocumentBuffer = null;
        }
    }

}

APIsAPIs
ProtectionPolicyManager.ProtectedAccessResumedProtectionPolicyManager.ProtectedAccessResumed
ProtectionPolicyManager.GetForCurrentViewProtectionPolicyManager.GetForCurrentView
ProtectionPolicyManager.IdentityProtectionPolicyManager.Identity
DataProtectionManager.UnprotectAsyncDataProtectionManager.UnprotectAsync
PufferProtectUnprotectResult.StatusBufferProtectUnprotectResult.Status

Behandeln Sie Unternehmensdaten, wenn der geschützte Inhalt verweigert wirdHandle enterprise data when protected content is revoked

Wenn Ihre App benachrichtigt werden soll, wenn ein Gerät von MDM aufgehoben ist oder wenn der Richtlinien-Administrator explizit den Zugriff auf Unternehmensdaten widerruft, behandeln Sie das ProtectionPolicyManager_ProtectedContentRevoked-Ereignis.If you want your app to be notified when the device is un-enrolled from MDM or when the policy administrator explicitly revokes access to enterprise data, handle the ProtectionPolicyManager_ProtectedContentRevoked event.

In diesem Beispiel wird bestimmt, ob die Daten in einem Unternehmenspostfach für eine E-Mail-App gesperrt wurden.This example determines if the data in an enterprise mailbox for an email app has been revoked.

private string mailIdentity = "contoso.com";

void MailAppSetup()
{
    ProtectionPolicyManager.ProtectedContentRevoked += ProtectionPolicyManager_ProtectedContentRevoked;
    // Code goes here to set up mailbox for 'mailIdentity'.
}

private void ProtectionPolicyManager_ProtectedContentRevoked(object sender, ProtectedContentRevokedEventArgs e)
{
    if (!new System.Collections.Generic.List<string>(e.Identities).Contains
        (this.mailIdentity))
    {
        // This event is not for our identity.
        return;
    }

    // Code goes here to delete any metadata associated with 'mailIdentity'.
}

APIsAPIs
ProtectionPolicyManager_ProtectedContentRevokedProtectionPolicyManager_ProtectedContentRevoked

Windows Information Protection (WIP)-BeispielWindows Information Protection (WIP) sample