選択的なワイプを使ってファイルを保護する方法 (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();
                }
        });

}

保護されたファイルのコピー

copyAsync メソッドまたは copyAndReplaceAsync メソッドを使ってファイルをコピーした場合、コピー元のファイルに対する選択的なワイプの保護がファイルの新しいコピーに自動的に適用されることはありません。"名前を付けて保存" した新しいファイルには適用されます。この場合、次の例に示すように、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

アプリのセキュリティ保護