Skip to main content

Tool: Audit für öffentliche Google Drive Dateien

Übersicht

Dieses Skript dient der Sicherheitsüberprüfung des eigenen Google Drive Accounts. Es durchsuchterstellt automatisch alle Dateien und Ordner, bei denen der Benutzer dereinen Eigentümerhierarchischen Bericht ist,aller undöffentlichen prüft, ob diese öffentlich zugänglich sind.Inhalte.

Was wird gefunden?Funktionen:

  • ElementeStrukturierte Ansicht: Erkennt, wenn ganze Ordner freigegeben sind, und listet die enthaltenen Dateien logisch eingerückt darunter auf.
  • Erkennung: Findet Dateien mit demStatus Status: "Jeder, der über den Link verfügt" (Anyone with link)
  • ElementeJeder mit demLink" Status:oder "Öffentlich im Web".
  • Datenschutz: (PublicListet /nur Searchable)Dateien auf, deren Eigentümer Sie sind.

Voraussetzung

Das Skript generiert einen Bericht in einer neuen Google Tabelle mit Zeitstempel.


Voraussetzung & Einrichtung

Da das Skript sehr viele Dateien schnell verarbeiten muss, nutzt es die Google Drive API v3, (Advancedum Service).große DieseMengen mussan einmaligDateien aktiviertschnell werden.zu verarbeiten und Ordnerstrukturen zu erkennen.

SchrittEinrichtung 1: Skript anlegen(Einmalig)

  1. Öffnen Sie den Skript-Editor auf script.google.com oder erstellen Sie ein neues Skript aus Google Drive heraus.
  2. Benennen Sie das Projekt (z. B. Security-Audit-Tool).

Schritt 2: Drive API aktivieren (WICHTIG!)

Damit das Skript funktioniert, muss der Drive-Dienst hinzugefügt werden:

  1. Klicken Sie im Editor links in der Leiste auf Dienste (Services) +.
  2. SuchenWählen Sie in der Liste nach Drive API. aus.
  3. WICHTIG: AchtenStellen Sie darauf,sicher, dass imVersion Dropdown-Menü "Version" zwingend v3 ausgewählt ist.
    • Das Skript ist für die API v3 geschrieben und funktioniert nicht mit v2.
  4. Klicken Sie auf Hinzufügen.
    • Der Identifier muss Drive heißen (Standard).

Schritt 3: Code einfügen

Löschen Sie allen vorhandenen Code im Editor und fügen Sie das untenstehende Skript ein.


Das Skript

/**
 * SKRIPT: Audit öffentlicher Google Drive Dateien (Hierarchisch)
 * VERSION: 2.13.0 (Mit Typ-ErkennungTree-View & Datenschutz)Parent-Detection)
 * * ZWECK:
 * DurchsuchtListet dasöffentliche gesamteDateien Googleauf Driveund desgruppiert ausführendensie Benutzerslogisch nachunter Dateien/ihren Ordnern,
 * diefalls der Ordner ebenfalls öffentlich oder per Link für "Jeden" freigegeben sind.
 * Erstellt einen Bericht in einer neuen Google Tabelle.
 *
 * VORAUSSETZUNG:
 * Der Dienst "Drive API" (zwingend Version 3) muss im Editor unter "Dienste" aktiviert sein.ist.
 */

function generatePublicFileReport(generatePublicFileReportTree() {
  
  // --- KONFIGURATION &1. SETUP ---
  var timestamp = new Date().toLocaleString();
  var filenamespreadsheet = SpreadsheetApp.create("Sicherheitsbericht: Öffentliche DateienStruktur (" + timestamp + ")";
  
  var spreadsheet = SpreadsheetApp.create(filename));
  var sheet = spreadsheet.getActiveSheet();
  
  var outputData = [];
  
  // Kopfzeile definieren (Jetzt mit "Typ")
  outputData.push(["Dateiname", "Typ", "Link zur Datei", "Zugriffsart"]);

  Logger.log("Starte Scan-Vorgang.Scan... Daten werden gesammelt.");

  // --- HAUPTPROZESS:2. SUCHEDATEN VIA DRIVE APIABFRUFEN ---
  // Wir nutzen eine Map (Dictionary), um Dateien später ihren Eltern zuzuordnen
  var allItemsMap = {}; 
  var rootItems = []; // Dateien/Ordner, die keine öffentlichen Eltern haben (Top-Level)
  
  var pageToken;
  var count = 0;
  
  // API Abfrage: Wir brauchen zusätzlich 'id' und 'parents' für die Struktur
  do {
    // Abfrage an die Drive API v3
    // WICHTIG: Wir fragen jetzt auch 'mimeType' ab, um Ordner zu erkennen
    var result = Drive.Files.list({
      q: "'me' in owners and trashed = false", 
      pageSize: 1000, 
      pageToken: pageToken,
      fields: "nextPageToken, files(id, name, mimeType, webViewLink, parents, permissions(type, allowFileDiscovery))" 
    });

    var files = result.files;
    
    if (files && files.length > 0) {
      for (var i = 0; i < files.length; i++) {
        var file = files[i];
        
        var// permsPrüfen =ob file.permissions;öffentlich (Filterung)
        if (perms)isPublic(file.permissions)) {
          // Datei für die spätere Verarbeitung speichern
          // Wir fügen eine leere 'children'-Liste hinzu für potentielle Unterdateien
          file.children = []; 
          file.isPublicFound = true; // Markierung
          allItemsMap[file.id] = file;
          count++;
        }
      }
    }
    pageToken = result.nextPageToken; 
  } while (pageToken);

  Logger.log(count + " öffentliche Elemente gefunden. Baue Hierarchie...");

  // --- 3. HIERARCHIE BAUEN ---
  // Wir gehen alle gefundenen Dateien durch und schauen, ob ihr "Eltern-Ordner" auch in der Liste ist.
  
  for (var pid =in 0; p < perms.length; p++)allItemsMap) {
    var permitem = perms[p]allItemsMap[id];
    var parentId = (item.parents && item.parents.length > 0) ? item.parents[0] : null;
    
    // Wenn der Parent auch in unserer "öffentlichen Liste" ist, ordnen wir das Item dort unter
    if (perm.typeparentId ===&& 'anyone'allItemsMap[parentId]) {
      allItemsMap[parentId].children.push(item);
    } else {
      // Wenn der Parent NICHT öffentlich ist (oder nicht existiert), ist dieses Item ein "Root" (Startpunkt)
      rootItems.push(item);
    }
  }

  // --- 4. AUSGABE VORBEREITEN (Rekursiv) ---
  var outputRows = [];
  outputRows.push(["Dateiname (Struktur)", "Typ", "Link", "Zugriffsart"]); // Header

  // Funktion zum rekursiven Durchlaufen des Baums
  function processNode(node, depth) {
    // 1. Zugriffsart bestimmen
    var accessType = perm.allowFileDiscoverygetAccessTypeLabel(node.permissions);
    
    // 2. Einrückung für den Namen basteln (Visuelle Hierarchie)
    var indent = "";
    for (var k=0; k<depth; k++) indent += "   "; // 3 Leerzeichen pro Ebene
    var visualName = indent + (depth > 0 ? "Öffentlich└─ im Web (Suchmaschinen)" : "Jeder") mit+ Link";
              
              // Typ-Erkennung: Ist es ein Ordner?node.name;
    
    var typeLabel = (file.node.mimeType === 'application/vnd.google-apps.folder') ? "Ordner" : "Datei";

    // Daten3. zum SpeicherZeile hinzufügen
    (inkl. Typ an 2. Stelle)
              outputData.outputRows.push([file.name,visualName, typeLabel, file.node.webViewLink, accessType]);

    count++;
              break; 
            }
          }
        }
      }
    }
    
    pageToken = result.nextPageToken; 
    
  } while (pageToken);

  
  // ---4. AUSGABEKinder ---verarbeiten (falls vorhanden)
    if (outputData.node.children.length > 0) {
      // Bulk-WriteSortieren: fürOrdner 4zuerst, Spaltendann Dateien (alphabetisch)
      node.children.sort(function(a, b) {
        var aIsFolder = (a.mimeType === 'application/vnd.google-apps.folder');
        var bIsFolder = (b.mimeType === 'application/vnd.google-apps.folder');
        if (aIsFolder && !bIsFolder) return -1;
        if (!aIsFolder && bIsFolder) return 1;
        return a.name.localeCompare(b.name);
      });

      // Rekursion: Kinder mit depth + 1 aufrufen
      for (var j=0; j<node.children.length; j++) {
        processNode(node.children[j], depth + 1);
      }
    }
  }

  // Alle Root-Elemente starten
  // Auch die Roots sortieren wir (Ordner zuerst)
  rootItems.sort(function(a, b) {
     var aIsFolder = (a.mimeType === 'application/vnd.google-apps.folder');
     var bIsFolder = (b.mimeType === 'application/vnd.google-apps.folder');
     if (aIsFolder && !bIsFolder) return -1;
     if (!aIsFolder && bIsFolder) return 1;
     return a.name.localeCompare(b.name);
  });

  for (var i=0; i<rootItems.length; i++) {
    processNode(rootItems[i], 0);
  }

  // --- 5. IN TABELLE SCHREIBEN ---
  if (outputRows.length > 1) { // Mehr als nur Header
    sheet.getRange(1, 1, outputData.outputRows.length, 4).setValues(outputData)outputRows);
    sheet.getRange("A1:D1").setFontWeight("bold");
    sheet.setFrozenRows(1);
    // Spalte A etwas breiter machen für die Einrückung
    sheet.setColumnWidth(1, 400);
  }

  Logger.log("ScanFertig! beendet.Bericht " + count + " Elemente gefunden.");
  Logger.log("Link zum Bericht:erstellt: " + spreadsheet.getUrl());
}

// Hilfsfunktion: Prüft Berechtigung
function isPublic(perms) {
  if (!perms) return false;
  for (var i=0; i<perms.length; i++) {
    if (perms[i].type === 'anyone') return true;
  }
  return false;
}

// Hilfsfunktion: Text für Tabelle
function getAccessTypeLabel(perms) {
  if (!perms) return "";
  for (var i=0; i<perms.length; i++) {
    if (perms[i].type === 'anyone') {
       return perms[i].allowFileDiscovery ? "Öffentlich (Suchbar)" : "Jeder mit Link";
    }
  }
  return "Unbekannt";
}

Ausführung & Ergebnis

  1. Wählen Sie oben im Editor die Funktion generatePublicFileReportgeneratePublicFileReportTree aus.
  2. Klicken Sie auf Ausführen.
  3. ÖffnenStarten Sie das AusführungsprotokollSkript.
  4. (unten
  5. Prüfen imSie Editor)das Protokoll für den Link zur Tabelle.

Ergebnis: In der Tabelle sehen Sie nun eine Struktur wie:

  • Öffentlicher Projektordner
    • └─ Unterordner A
      • └─ Datei 1
      • └─ Datei 2
    • └─ Präsentation X
  • Einzeln freigegebene Datei Y