如何通过选择性擦除保护文件 (HTML)

[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]

你可以使用选择性擦除,在你的应用中识别那些在某应用用户不再有权访问你的应用数据时将被吊销的受保护文件。这是一种适用于各类企业的常见方案,它允许员工把他们自己的设备带到公司来工作。当员工离开公司后,他们个人设备上的公司文件就会被删除。

例如,某员工将他的个人平板电脑带到办公室来,并使用它收发公司电子邮件。电子邮件应用即可使用选择性擦除,保护用于在计算机上本地存储公司电子邮件的所有文件。它使用一个企业标识符(如 "sample.com")将这些文件与公司关联起来。如果用户不再是公司的员工,那么当他下次打开公司电子邮件应用时,此应用可确定该用户不再是公司的员工,并进而指示选择性擦除功能撤消该用户对与其企业标识符对应的所有受保护文件的访问权限。如果应用在尝试访问某文件时确定对该文件的访问权限已被撤消,此应用随后即可删除该文件。

先决条件

  • 本主题中的示例代码假定已设置以下全局变量。

    var appRootFolder = Windows.Storage.ApplicationData.current;
    var enterpriseIdentity = "example.com";
    var accessDeniedHResult = -2147024891;  // Access Denied (0x80070005)
    

使用选择性擦除保护文件或文件夹

你可以使用 protectAsync 方法来通过选择性擦除保护文件或文件夹。它可以将文件识别为与你的企业标识符(例如 "example.com")对应的受保护文件,如前述代码示例所示。如果你使用 protectAsync 方法保护文件夹,此文件夹中的所有文件均会继承相同的保护。

// Add a folder and protect it using Selective Wipe.
function addFolder(folderName) {
    appRootFolder.localFolder.createFolderAsync(folderName).then(
        function (newFolder) {
            protectItem(newFolder);
        });
}

// Add a file and protect it using Selective Wipe.
function addFile(fileName, folder) {
    folder.createFileAsync(fileName).then(
        function (newFile) {
            Windows.Security.EnterpriseData.
                FileRevocationManager.getStatusAsync(newFile).then(
                    function (status) {
                        if (status != Windows.Security.EnterpriseData.
                                FileProtectionStatus.Protected) {
                            protectItem(newFile, enterpriseIdentity);
                        }
                    });
        },
        function (err) {
            // Handle error. For example, file already exists.
        });
}

function protectItem(item, enterpriseIdentity) {
    Windows.Security.EnterpriseData.FileRevocationManager.
        protectAsync(item, enterpriseIdentity).then(
            function (status) {
                return status;
            });
}

撤消受保护文件和文件夹的访问权限

你的应用确定某用户不再有效时,你可以使用 revoke 方法快速撤消对与企业标识符对应的所有受保护文件和文件夹的访问权限,如以下示例所示。revoke 方法不会删除文件。revoke 方法会使文件进入无法访问的状态。你可以在应用中添加代码,使其删除无法访问且已撤消访问权限的文件,如下方示例所示。

function initializeApp(userName) {
    if (getUserStatus(userName) == "Not Found") {
        Windows.Security.EnterpriseData.FileRevocationManager.revoke(enterpriseIdentity);
    }
}

获取文件的状态

你可以使用 getStatusAsync 方法确定文件或文件夹的选择性擦除保护状态。通过该方法,你可以了解到某文件是否受到保护,某文件是否受到计算机上其他用户的保护,等等信息。getStatusAsync 方法常常用于确定应在何时删除受保护的文件。例如,撤消某个受保护文件的访问权限后,在尝试访问该文件的内容时,将出现“访问被拒绝”异常。如果遇到这种异常,你可以使用 getStatusAsync 方法来确定文件的访问权限是否已由选择性擦除撤消,如果是,则删除该文件,如以下示例所示。

function getFileContents(filePath) {
    var stream;
    var file;

    Windows.Storage.StorageFile.getFileFromPathAsync(filePath).then(
        function (f) {
            file = f;
            file.openReadAsync().then(
                function (s) {
                    stream = s;
                    return stream;
                },
                function (err) {
                    if (err.number == accessDeniedHResult) {
                        // Delete file if it has been revoked.
                        selectiveWipeCleanup(file);
                    }
                });
        });

    return null;
}

// Delete items revoked by Selective Wipe.
function selectiveWipeCleanup(file) {
    Windows.Security.EnterpriseData.FileRevocationManager.
        getStatusAsync(file).then(
            function (status) {
                if (status == 
                    Windows.Security.EnterpriseData.FileProtectionStatus.revoked) {
                        file.deleteAsync();
                }
        });

}

复制受保护的文件

在使用 copyAsynccopyAndReplaceAsync 方法复制文件时,被复制文件中的选择性擦除保护不会自动应用于新复制的文件。对于“另存为”新文件的文件,同样如此。在这种情况下,你可以使用 copyProtectionAsync 方法复制原文件中的选择性擦除保护,如以下示例所示。

function copyFile(file, newFolder) {
    file.copyAsync(newFolder).then(
        function (newFile) {
            Windows.Security.EnterpriseData.FileRevocationManager.
                copyProtectionAsync(file, newFile);
        },
        function (err) {
            // Handle error. For example, copy already exists.
        });
}

完整示例

相关主题

FileRevocationManager 示例

Windows.Security.EnterpriseData namespace

保护应用