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
demStatusStatus:"Jeder, der über den Link verfügt"(Anyone with link) ElementeJeder mitdemLink"Status:oder "Öffentlich im Web".- Datenschutz:
(PublicListet/nurSearchable)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)
- Öffnen Sie den Skript-Editor auf script.google.com
oder erstellen Sie ein neues Skript aus Google Drive heraus. 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:
- Klicken Sie
im Editorlinksin der Leisteauf Dienste (Services)+. SuchenWählen Siein der Liste nachDrive API.aus.- WICHTIG:
AchtenStellen Siedarauf,sicher, dassimVersionDropdown-Menü "Version" zwingendv3 ausgewählt ist.Das Skript ist für die API v3 geschrieben und funktioniert nicht mit v2.
- Klicken Sie auf Hinzufügen.
Der Identifier mussDriveheiß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
- Wählen Sie oben
im Editordie FunktiongeneratePublicFileReportgeneratePublicFileReportTreeaus. Klicken Sie aufAusführen.ÖffnenStarten Sie dasAusführungsprotokollSkript.- Prüfen
imSieEditor)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