Comment protéger les fichiers avec la réinitialisation sélective (HTML)
[ Cet article est destiné aux développeurs de Windows 8.x et Windows Phone 8.x qui créent des applications Windows Runtime. Si vous développez une application pour Windows 10, voir la Documentation ]
Utilisez la réinitialisation sélective pour identifier les fichiers protégés de votre application qui peuvent être révoqués quand un utilisateur n’est plus autorisé à accéder aux données de votre application. Il s’agit d’un scénario courant dans les entreprises qui permettent à leurs employés d’amener leur propre appareil sur leur lieu de travail. Quand l’employé quitte définitivement l’entreprise, il est possible de supprimer les fichiers à usage professionnel stockés sur son appareil personnel.
Par exemple, un employé amène sa tablette personnelle au bureau et l’utilise pour ses e-mails professionnels. Grâce à la réinitialisation sélective, l’application de messagerie peut protéger tous les fichiers liés au stockage d’e-mails de l’entreprise sur l’ordinateur. Cette fonctionnalité associe les fichiers à l’entreprise via un identificateur d’entreprise, par exemple "sample.com". Si l’utilisateur quitte définitivement la société, la prochaine fois qu’il ouvre l’application de messagerie d’entreprise, celle-ci détermine qu’il n’est plus un employé et indique à la fonctionnalité de réinitialisation sélective de révoquer l’accès à tous les fichiers protégés d’après leur identificateur d’entreprise. Quand l’application tente d’accéder à un fichier et détermine qu’il est révoqué, elle peut supprimer le fichier.
Prérequis
L’exemple de code de cette rubrique suppose que les variables globales suivantes sont définies.
var appRootFolder = Windows.Storage.ApplicationData.current; var enterpriseIdentity = "example.com"; var accessDeniedHResult = -2147024891; // Access Denied (0x80070005)
Protéger un fichier ou un dossier à l’aide de la réinitialisation sélective
Vous pouvez utiliser la méthode protectAsync pour protéger un fichier ou un dossier à l’aide de la réinitialisation sélective. Celle-ci identifie le fichier comme étant protégé via votre identificateur d’entreprise, par exemple "example.com", comme le montre l’exemple de code précédent. Si vous protégez un dossier à l’aide de la méthode protectAsync, tous les fichiers de ce dossier héritent de la même protection.
// 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;
});
}
Révoquer l’accès aux fichiers et dossiers protégés
Quand votre application détermine qu’un utilisateur n’est plus valide, vous pouvez révoquer rapidement l’accès à tous les fichiers et dossiers protégés par une identité d’entreprise à l’aide de la méthode revoke, comme le montre l’exemple suivant. Le fichier n’est pas supprimé par la méthode revoke. La méthode revoke place le fichier dans un état où il est inaccessible. Vous pouvez ajouter du code à votre application afin de supprimer un fichier inaccessible qui a été révoqué, comme le montre l’exemple suivant.
function initializeApp(userName) {
if (getUserStatus(userName) == "Not Found") {
Windows.Security.EnterpriseData.FileRevocationManager.revoke(enterpriseIdentity);
}
}
Obtenir l’état d’un fichier
Vous pouvez utiliser la méthode getStatusAsync pour déterminer l’état de protection de la réinitialisation sélective pour un fichier ou un dossier. Cela vous indique si un fichier est protégé ou non, si un fichier est protégé par un autre utilisateur de l’ordinateur, etc. Bien souvent, la méthode getStatusAsync permet de déterminer le moment où un fichier protégé doit être supprimé. Par exemple, quand un fichier protégé est révoqué, toute tentative d’accès au contenu du fichier se traduit par une exception de type « Accès refusé ». Quand vous rencontrez ce type d’exception, utilisez la méthode getStatusAsync afin de déterminer si le fichier a été révoqué par la réinitialisation sélective. Si tel est le cas, supprimez ce fichier, comme le montre l’exemple suivant.
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();
}
});
}
Copier un fichier protégé
Quand vous copiez un fichier à l’aide des méthodes copyAsync ou copyAndReplaceAsync, la protection par réinitialisation sélective du fichier copié n’est pas appliquée automatiquement à la nouvelle copie du fichier. Elle s’applique aux fichiers que vous avez « enregistrés sous » un nouveau nom. Dans ce cas, vous pouvez copier la protection par réinitialisation sélective du fichier d’origine via la méthode copyProtectionAsync, comme le montre l’exemple suivant.
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.
});
}