Как защитить файлы с помощью выборочного удаления (XAML)

Applies to Windows and Windows Phone

Выборочная очистка позволяет определить в приложении защищаемые файлы, которые можно удалить, когда пользователь приложения теряет право на использование данных из приложения. Так часто случается в организациях, которые разрешают сотрудникам приносить собственные устройства на работу. Когда сотрудник покидает компанию, можно обеспечить удаление файлов компании с личного устройства сотрудника.

Например, допустим, сотрудник приносит личный планшетный компьютер в офис и использует его для работы с электронной почтой компании. Почтовое приложение может защищать все файлы, которые используются в сообщениях электронной почты компании локально на компьютере с помощью выборочной очистки. Такие файлы связываются с компанией с помощью корпоративного идентификатора, например "sample.com". Если пользователь перестает работать в компании, то в следующий раз, когда он открывает корпоративное почтовое приложение, оно может определить, что пользователь больше не является сотрудником, и посредством выборочной очистки запретить доступ ко всем защищенным файлам с данным корпоративным идентификатором. Если приложение пытается получить доступ к файлу и обнаруживает, что доступ запрещен, то оно может удалить такой файл.

Необходимые условия

  • В примере кода в данном разделе предполагается, что заданы следующие глобальные переменные.
    
    ApplicationData appRootFolder = ApplicationData.Current;
    string enterpriseIdentity = "example.com";
    int AccessDeniedHResult = -2147024891;  // Access Denied (0x80070005)
    
    
    

Защита файла или папки с помощью выборочной очистки

Метод ProtectAsync позволяет защитить файл или папку с помощью выборочной очистки. Он определяет файл как защищаемый для корпоративного идентификатора, например "example.com", как показано в предыдущем примере кода. Если метод ProtectAsync применяется для защиты папки, то все файлы в этой папке получают такую же защиту.


// Add a folder and protect it using Selective Wipe.
private async Task<StorageFolder> AddFolder(string folderName)
{
    StorageFolder newFolder = await appRootFolder.LocalFolder.CreateFolderAsync(folderName);

    var status = await ProtectItem(newFolder, enterpriseIdentity);

    return newFolder;
}

// Add a file and protect it using Selective Wipe.
private async Task<StorageFile> AddFile(string fileName, StorageFolder folder)
{
    StorageFile newFile = await folder.CreateFileAsync(fileName);

    var status = 
        await Windows.Security.EnterpriseData.FileRevocationManager.
            GetStatusAsync(newFile);

    if (status != Windows.Security.EnterpriseData.FileProtectionStatus.Protected)
    {
        status = await ProtectItem(newFile, enterpriseIdentity);
    }

    return newFile;
}

private async Task<Windows.Security.EnterpriseData.FileProtectionStatus> 
    ProtectItem(IStorageItem item, string enterpriseIdentity)
{
    var status = 
        await Windows.Security.EnterpriseData.FileRevocationManager.
            ProtectAsync(item, enterpriseIdentity);

    return status;
}


Запрет доступа к защищенным файлам и папкам

Если приложение определяет, что пользователь утратил свои права, вы можете быстро запретить доступ ко всем файлам и папкам, защищаемым по корпоративному идентификатору, с помощью метода Revoke, как показано в следующем примере. Метод Revoke не удаляет файл. Метод Revoke переводит файл в состояние, исключающее доступ. Вы можете добавить в свое приложение код, который будет удалять файл, к которому запрещен доступ, как показано в следующем примере.


private void InitializeApp(string userName)
{
    if (GetUserStatus(userName) == AppUserStatus.NotFound)
    {
        Windows.Security.EnterpriseData.FileRevocationManager.Revoke(enterpriseIdentity);
    }
}


Получение состояния файла

Метод GetStatusAsync позволяет определить состояние защиты с помощью выборочной очистки для файла или папки. Он сообщает, является ли файл защищенным, включена ли защита для файла другим пользователем на компьютере, а также другие сведения. Метод GetStatusAsync часто используется, чтобы определить, следует ли удалить защищенный файл. Например, если доступ к защищенному файлу запрещен, то при попытке доступа к содержимому файла создается исключение "Отказано в доступе". Когда обнаруживается такое исключение, вы можете использовать метод GetStatusAsync, чтобы определить, запрещен ли доступ к файлу с помощью выборочной очистки, и, если это так, удалить этот файл, как показано в следующем примере.


private async Task<IRandomAccessStream> GetFileContents(string filePath)
{
    IRandomAccessStream stream = null;
    StorageFile file = null;

    try
    {
        file = await StorageFile.GetFileFromPathAsync(filePath);
        stream = await file.OpenReadAsync();
    }
    catch (UnauthorizedAccessException e)
    {
        if (e.HResult == AccessDeniedHResult)
        {
            // Delete file if it has been revoked.
            SelectiveWipeCleanup(file);
        }

        return null;
    }

    return stream;
}

// Delete items revoked by Selective Wipe.
private async void SelectiveWipeCleanup(StorageFile file)
{
    var status = await Windows.Security.EnterpriseData.FileRevocationManager.GetStatusAsync(file);
    if (status == Windows.Security.EnterpriseData.FileProtectionStatus.Revoked)
    {
        await file.DeleteAsync();
    }
}


Копирование защищенного файла

Когда файл копируется методом CopyAsync или CopyAndReplaceAsync, то защита выборочной очистки для копируемого файла не применяется автоматически к новой копии файла. Это относится к файлам, которые сохраняются с новым именем с помощью команды "Сохранить как". В этом случае можно скопировать защиту выборочной очистки из исходного файла с помощью метода CopyProtectionAsync, как показано в следующем примере.


public async Task<bool> CopyFile(StorageFile file, StorageFolder newFolder) 
{
    bool result = false;

    try
    {
        var newFile = await file.CopyAsync(newFolder);
        result = await 
            Windows.Security.EnterpriseData.FileRevocationManager.
            CopyProtectionAsync(file, newFile);
        }
    catch (Exception e) 
    {
        // Handle exception. For example, copy already exists.
    }

    return result;
}


Полный пример

Связанные разделы

Пример FileRevocationManager
Windows.Security.EnterpriseData namespace
Защита приложений

 

 

Показ:
© 2014 Microsoft