Comment réinitialiser les autorisations pour les documents Google Drive dans tous les sous-dossiers?

14

OK, j'ai cherché partout la réponse à cela et ne semble pas pouvoir la trouver.

Nous essayons d'organiser notre Google Drive afin que les bonnes personnes aient accès aux bonnes choses sans beaucoup de partage explicite. Nous avons un dossier de niveau supérieur appelé "Société" avec des sous-dossiers pour "Admin", "Finance", "RH", "Ingénierie" et ainsi de suite. Les sous-dossiers ont des autorisations plus restrictives que celles de niveau supérieur.

Nous avons maintenant plus ou moins tout au bon endroit, et surtout cela fonctionne. Le problème est que les fichiers ou dossiers individuels ont leurs propres autorisations - ils ne semblent alors pas hériter des autorisations de leurs dossiers. Comment réinitialiser les autorisations pour tout dans chaque partie de la hiérarchie afin qu'elles soient identiques au dossier parent?

Sur Windows Server ou Mac OS X, il existe une distinction claire entre les autorisations "héritées" et "explicites" pour un élément, et il est facile de supprimer les autorisations "explicites" pour tous les éléments d'une hiérarchie. Où est-ce pour GD?

Enchères
la source

Réponses:

3

J'ai installé le script de Vidar et fonctionne très bien pour les fichiers, mais je ne réinitialiserais pas les autorisations sur les dossiers. J'ai donc modifié un peu le code pour que les dossiers héritent également des autorisations de leur dossier supérieur.

Deux avertissements importants:

  1. Je ne sais pas si l'intention initiale était de laisser les dossiers inchangés. Ou même si cela fonctionnait bien pour tout le monde sauf moi, et que ces solutions n'étaient pas nécessaires. Ça a marché pour moi.
  2. Ceci est le premier script que je fais, il est donc très probable qu'il ne soit pas très efficace et puisse contenir des erreurs. N'hésitez pas à le corriger et à l'améliorer.

J'ai seulement changé la doResetPermissionsfonction, mais je colle tout le code pour des raisons de simplicité.

var selectedFolder;
var dialog;

function doGet() {
  var app = UiApp.createApplication();
  var heading = app.createHTML("<h1>Folders for</h1>");
  app.add(heading);
  var allFoldersIterator = DriveApp.getFolders();
  var text = app.createTextArea().setName("text").setId("output");
  app.add(text);
  var tree = app.createTree();
  var rootFolder = DriveApp.getRootFolder();
  var treeRoot = app.createTreeItem(rootFolder.getName()).setId(rootFolder.getId());
  var handler = app.createServerHandler("folderSelected");
  tree.addItem(treeRoot);
  tree.addSelectionHandler(handler);
  treeRoot.setState(true);
  createBranch(rootFolder, treeRoot, app);
  app.add(tree);
  var selectedFolderIdBox = app.createTextBox().setName("selectedFolderIdBox").setId("selectedFolderIdBox");
  app.add(selectedFolderIdBox);
  return app;
}

function createBranch(folder, branch, app) {
  var children = folder.getFolders();
  while (children.hasNext()) {
    child = children.next();
    Logger.log("Folder id: " + child.getId());
    var subBranch = app.createTreeItem(child.getName()).setId(child.getId());
    branch.addItem(subBranch);
    createBranch(child, subBranch, app);
  }
}

function folderSelected(eventInfo) {
  var app = UiApp.getActiveApplication();
  var parameter = eventInfo.parameter;
  Logger.log("Selected " + eventInfo.parameter.selected);
  selectedFolder = DriveApp.getFolderById(eventInfo.parameter.selected);
  var selectedFolderIdBox = app.getElementById("selectedFolderIdBox");
  selectedFolderIdBox.setValue(eventInfo.parameter.selected);
  var okHandler = app.createServerHandler("okResetPermissions");
  okHandler.addCallbackElement(selectedFolderIdBox);
  dialog = app.createDialogBox(true, true);
  var panel = app.createFlowPanel();
  dialog.add(panel);
  dialog.setId("confirmationDialog");
  dialog.setPopupPosition(100, 100).setSize(500, 500);
  panel.add(app.createLabel("Do you want to reset permissions for all files found in folder " + selectedFolder.getName() + " and its subfolders?\n (Click outside of the dialog box to cancel)"));
  panel.add(app.createButton("Do it!", okHandler));
  dialog.show();
  return app;
}

function okResetPermissions(eventInfo) {
  var selectedFolderId = eventInfo.parameter.selectedFolderIdBox;
  var selectedFolder = DriveApp.getFolderById(selectedFolderId);
  Logger.log("Resetting permissions on " + selectedFolder.getName());
  var app = UiApp.getActiveApplication();
  app.getElementById("confirmationDialog").hide();
  Logger.log("Confirmation dialog hidden");
  var progressIndicator = app.createDialogBox(false, true);
  progressIndicator.setId("progressIndicator");
  progressIndicator.setPopupPosition(100, 100).setSize(500, 500);
  var label = app.createLabel("Working ...");
  progressIndicator.add(label);
  progressIndicator.show();
  doResetPermissions(selectedFolder, function() {
    var app = UiApp.getActiveApplication();
    var progressIndicator = app.getElementById("progressIndicator");
    progressIndicator.hide();
    return app;
  });
  return app;
}

function doResetPermissions(selectedFolder, callback) {
  Logger.log("Resetting permissions on folder " + selectedFolder.getName());

  var sharingAccess = selectedFolder.getSharingAccess();
  var sharingPermission = selectedFolder.getSharingPermission();

  var viewersfolder = selectedFolder.getViewers();
  Logger.log("Number of Viewers in folder: " + selectedFolder.getName() + " = " + viewersfolder.length);
  for (var i = 0; i < viewersfolder.length; i++) {
    Logger.log("      Removing viewer " + viewersfolder[i].getEmail());
    selectedFolder.removeViewer(viewersfolder[i]);
  }

  var editorsfolder = selectedFolder.getEditors();

  Logger.log("Number of Editors in folder: " + selectedFolder.getName() + " = " + editorsfolder.length);

  for (var i = 0; i < editorsfolder.length; i++) {
    Logger.log("      Removing editor " + editorsfolder[i].getEmail());
    selectedFolder.removeEditor(editorsfolder[i]);
  }

  var files = selectedFolder.getFiles();
  while (files.hasNext()) {
    var file = files.next();
    Logger.log("   Resetting permissions on file " + file.getName());
    file.setSharing(sharingAccess, sharingPermission);

    var viewers = file.getViewers();
    Logger.log("Number of Viewers in file: " + file.getName() + " = " + viewers.length);
    for (var i = 0; i < viewers.length; i++) {
      Logger.log("      Removing viewer " + viewers[i].getEmail());
      file.removeViewer(viewers[i]);
    }

    var editors = file.getEditors();

    Logger.log("Number of editors in file: " + file.getName() + " = " + editors.length);

    for (var i = 0; i < editors.length; i++) {
      Logger.log("      Removing editor " + editors[i].getEmail());
      file.removeEditor(editors[i]);
    }
  }

  var children = selectedFolder.getFolders();
  while (children.hasNext()) {
    var child = children.next();
    doResetPermissions(child);
  }

  if (callback) {
    callback();
  }
}
Antonio
la source
1
C'est bien, sauf qu'il supprime les fichiers non google (comme les fichiers PDF et DOCX téléchargés).
user683
Eh bien, cela ne fonctionnera tout simplement pas pour moi, alors @ user683. Où dans le script "supprime-t-il" les fichiers? C'est tellement dangereux! Ce script est censé définir des autorisations, pas supprimer des fichiers!
Arvo Bowen
3

Si je dois réinitialiser les autorisations de dossier, je renomme le dossier ( Finance → Finance_1 ), crée un nouveau dossier avec l'ancien nom ( Finance ) et "déplace" tous les sous-dossiers vers le nouveau dossier.

Avec ce mouvement, vous réinitialisez toutes les autorisations pour les sous-dossiers.

Denis
la source
2

J'ai créé une application Web Google Apps Scripts qui devrait être proche de ce que vous voulez.

IMPORTANT! Avant d'exécuter cela sur l'un de vos dossiers, assurez-vous de le tester sur un autre compte. Bien que le script semble fonctionner comme prévu, je ne peux garantir qu'il ne gâchera pas vos autorisations. Parcourez donc attentivement le script, consultez la documentation des scripts Google Apps et testez-le soigneusement avant de lancer des données de production.

L'interface utilisateur du script est très rudimentaire, alors n'ayez rien d'extraordinaire.

var selectedFolder;
var dialog;

function doGet() {
  var app = UiApp.createApplication();
  var heading = app.createHTML("<h1>Folders for</h1>");
  app.add(heading);
  var allFoldersIterator = DriveApp.getFolders();
  var text = app.createTextArea().setName("text").setId("output");
  app.add(text);
  var tree = app.createTree();
  var rootFolder = DriveApp.getRootFolder();
  var treeRoot = app.createTreeItem(rootFolder.getName()).setId(rootFolder.getId());
  var handler = app.createServerHandler("folderSelected");
  tree.addItem(treeRoot);
  tree.addSelectionHandler(handler);
  treeRoot.setState(true);
  createBranch(rootFolder, treeRoot, app);
  app.add(tree);
  var selectedFolderIdBox = app.createTextBox().setName("selectedFolderIdBox").setId("selectedFolderIdBox");
  app.add(selectedFolderIdBox);
  return app;
}

function createBranch(folder, branch, app) {
  var children = folder.getFolders();
  while (children.hasNext()) {
    child = children.next();
    Logger.log("Folder id: " + child.getId());
    var subBranch = app.createTreeItem(child.getName()).setId(child.getId());
    branch.addItem(subBranch);
    createBranch(child, subBranch, app);
  }
}

function folderSelected(eventInfo) {
  var app = UiApp.getActiveApplication();
  var parameter = eventInfo.parameter;
  Logger.log("Selected " + eventInfo.parameter.selected);
  selectedFolder = DriveApp.getFolderById(eventInfo.parameter.selected);
  var selectedFolderIdBox = app.getElementById("selectedFolderIdBox");
  selectedFolderIdBox.setValue(eventInfo.parameter.selected);
  var okHandler = app.createServerHandler("okResetPermissions");
  okHandler.addCallbackElement(selectedFolderIdBox);
  dialog = app.createDialogBox(true, true);
  var panel = app.createFlowPanel();
  dialog.add(panel);
  dialog.setId("confirmationDialog");
  dialog.setPopupPosition(100, 100).setSize(500, 500);
  panel.add(app.createLabel("Do you want to reset permissions for all files found in folder " + selectedFolder.getName() + " and its subfolders?\n (Click outside of the dialog box to cancel)"));
  panel.add(app.createButton("Do it!", okHandler));
  dialog.show();
  return app;
}

function okResetPermissions(eventInfo) {
  var selectedFolderId = eventInfo.parameter.selectedFolderIdBox;
  var selectedFolder = DriveApp.getFolderById(selectedFolderId);
  Logger.log("Resetting permissions on " + selectedFolder.getName());
  var app = UiApp.getActiveApplication();
  app.getElementById("confirmationDialog").hide();
  Logger.log("Confirmation dialog hidden");
  var progressIndicator = app.createDialogBox(false, true);
  progressIndicator.setId("progressIndicator");
  progressIndicator.setPopupPosition(100, 100).setSize(500, 500);
  var label = app.createLabel("Working ...");
  progressIndicator.add(label);
  progressIndicator.show();
  doResetPermissions(selectedFolder, function() {
    var app = UiApp.getActiveApplication();
    var progressIndicator = app.getElementById("progressIndicator");
    progressIndicator.hide();
    return app;
  });
  return app;
}

function doResetPermissions(selectedFolder, callback) {
  Logger.log("Resetting permissions on folder " + selectedFolder.getName());
  var sharingAccess = selectedFolder.getSharingAccess();
  var sharingPermission = selectedFolder.getSharingPermission();
  var files = selectedFolder.getFiles();
  while (files.hasNext()) {
    var file = files.next();
    Logger.log("   Resetting permissions on file " + file.getName());
    file.setSharing(sharingAccess, sharingPermission);
    var viewers = file.getViewers();
    for (var i = 0; i < viewers.length; i++) {
      Logger.log("      Removing viewer " + viewers[i].getEmail());
      file.removeViewer(viewers[i]);
    }
    var editors = file.getEditors();
    for (var i = 0; i < editors.length; i++) {
      Logger.log("      Removing editor " + editors[i].getEmail());
      file.removeEditor(editors[i]);
    }
  }
  var children = selectedFolder.getFolders();
  while (children.hasNext()) {
    var child = children.next();
    doResetPermissions(child);
  }
  if (callback) {
    callback();
  }
}

Pour installer ce script, accédez à votre Google Drive et cliquez sur Nouveau → Script Google Apps . Collez le code et Publier → Distribuer en tant qu'application Web .
Définissez le script sur Exécuter en tant qu'utilisateur connecté (ou similaire, mon Google Drive n'est pas en anglais) .

Lors de l'appel de l'application, la hiérarchie des dossiers de votre Google Drive s'affichera. Cliquez sur un dossier pour afficher une fenêtre contextuelle moche, où vous pouvez choisir d'exécuter un script de réinitialisation des autorisations pour le dossier et ses sous-dossiers (la fonction doResetPermissionsdans le code).
Cette fonction parcourt le dossier et ses sous-dossiers. Pour chaque fichier qu'il trouve, il s'exécute file.setSharingavec les valeurs du dossier parent. Il appelle également file.removeViewertous les téléspectateurs enregistrés et file.removeEditortous les éditeurs enregistrés.

Consultez la documentation de removeViewer et removeEditor pour vous assurer qu'ils font ce que vous voulez.

Notez que l'exécution du script peut prendre un certain temps (selon la taille de la structure de votre dossier), et aucun retour n'est donné pendant qu'il fonctionne, sauf dans les journaux du programme d'exécution de script ( Affichage → Journaux ).

Vidar S. Ramdal
la source
CreateBrance est utilisé dans createBrance? Est-ce que ça marche?
Jacob Jan Tuinstra
1
Oui, cela devrait bien fonctionner. C'est une fonction récursive.
Vidar S. Ramdal du
0

J'ai découvert que la meilleure façon était de rclone copyrecréer le dossier parent avec tous ses fichiers, tout en changeant les autorisations dans les paramètres de partage par défaut que vous avez choisis.

Donc, si vous en avez, disons un disque d'équipe avec un tas de répertoires, déplacez tout simplement dans un nouveau dossier tel que bad_permissions. Créez ensuite une nouvelle télécommande dans rclone pour ce lecteur et utilisez-la rclone copy gdrive:bad_permissions gdrive:fixed_permissions. Comme la copie a lieu côté serveur, vous évitez d'avoir à télécharger / télécharger.

AVERTISSEMENT : J'ai vérifié le dossier copié avec un outil de comparaison de fichiers par la suite pour m'assurer que tout avait été transféré correctement et que rclone avait en fait manqué une grande quantité de fichiers sans afficher aucune erreur.

melvin
la source
-1

http://gappstips.com/docs-tips/view/98/protect-your-google-drive-folders-by-setting-permissions

selon ce lien, il semble que vous devez vous assurer que les fichiers sont définis sur les autorisations par défaut, puis ils devraient hériter du dossier.

modifier: ctrl + a sélectionne tous les fichiers du dossier, puis vous pouvez changer avec qui ils sont partagés en même temps.

Bill Kinzie
la source
1
Je pense que l'OP veut savoir comment vous pouvez réinitialiser les autorisations par défaut pour tous les documents à la fois .
Vidar S. Ramdal
1
Nous avons de nombreux dossiers. Comment faire cela récursivement pour TOUS les fichiers qu'ils contiennent?
Kromster dit soutenir Monica