CryptoLocker - 使用 Google Apps 脚本恢复云端硬盘文件版本
Posted
技术标签:
【中文标题】CryptoLocker - 使用 Google Apps 脚本恢复云端硬盘文件版本【英文标题】:CryptoLocker - restore Drive file version with Google Apps Scripts 【发布时间】:2017-07-13 03:57:24 【问题描述】:长话短说,我感染了 CryptoLocker 病毒。我的“正常”本地文件不是问题,因为我备份了这些文件。但我使用的是 Google Drive Sync 客户端,我所有的 Drive 文件都被加密了。我没有备份它们,因为我认为 Google 云端硬盘已保存并且我的数据存储在世界各地(我知道是我的错)。
现在我可以看到 Google Drive 提供了版本控制。这意味着我的旧上传仍在服务器上。我可以逐个文件恢复以前的版本,但要恢复几千个文件,祝你好运。 我联系了 Google G Suite 支持团队(我正在为我的业务使用 Google G Suite)并询问他们是否可以通过一次批量操作恢复最新版本。答案是“不,你必须逐个文件”。因此,我在互联网上查找脚本、工具等。
我在 Google 云端硬盘帮助论坛“https://productforums.google.com/forum/#!topic/drive/p08UBFYgFs0https://productforums.google.com/forum/#!topic/drive/p08UBFYgFs0”中找到了一个 Google Apps 脚本。
1) 我将“Google Apps 脚本”应用添加到我的驱动器中。
2) 我创建了一个新应用并通过了脚本:
function testSmallFolder()
var smallFolder = DriveApp.getFolderById('FOLDER_ID_HERE');
var files = smallFolder.getFiles();
while (files.hasNext())
file = files.next();
deleteRevisions(file);
var childFolders = smallFolder.getFolders();
while(childFolders.hasNext())
var childFolder = childFolders.next();
Logger.log(childFolder.getName());
var files = childFolder.getFiles();
while (files.hasNext())
file = files.next();
deleteRevisions(file);
getSubFoldersAndDelete(childFolder);
function deleteRevisions(file)
var fileId = file.getId();
var revisions = Drive.Revisions.list(fileId);
if (revisions.items && revisions.items.length > 1)
for (var i = 0; i < revisions.items.length; i++)
var revision = revisions.items[i];
var date = new Date(revision.modifiedDate);
var startDate = new Date();
var endDate = new Date(revision.modifiedDate);
var fileName = Drive.Files.get(fileId);
if(revision.modifiedDate > "2017-02-16T10:00:00" && revision.modifiedDate < "2017-02-18T10:00:00" && revision.lastModifyingUserName == "ENTER_MODIFIED_USERNAME_HERE]]" && file.getName() !== "HELP_DECRYPT.URL" && file.getName() !== "HELP_DECRYPT.PNG" && file.getName() !== "HELP_DECRYPT.html")
Logger.log(' %s, Date: %s, File size (bytes): %s',file.getName(),
date.toLocaleString(),
revision.fileSize);
return Drive.Revisions.remove( fileId, revision.id);
else
Logger.log('No revisions found.');
function getSubFoldersAndDelete(parent)
parent = parent.getId();
var childFolders = DriveApp.getFolderById(parent).getFolders();
while(childFolders.hasNext())
var childFolder = childFolders.next();
var files = childFolder.getFiles();
while (files.hasNext())
file = files.next();
deleteRevisions(file);
getSubFoldersAndDelete(childFolder);
return;
3) 该脚本提供了 3 个函数“testSmallFolder”/“deleteRevisions”/“getSubFoldersAndDelete”。看起来功能“festSmallFolder”只能在某个文件夹上工作。第 2 行:FOLDER_ID_HERE
4) 我创建了一个文件夹并将我的文件移动到该文件夹中。之后我得到了文件夹 ID(URL)并将其添加到脚本中。
5) 在第 37 行,您可以添加修改的开始和结束日期。我还在同一行中调整了用户名。
6) 我保存了脚本并运行了“testSmallFolder”函数。
7) 我收到一条错误消息:“ReferenceError: "Drive" is not defined。 (第 27 行,文件“代码”)“。 第 27 行如下所示:“var revisions = Drive.Revisions.list(fileId);”。
我再次联系了 Google G Suite 支持人员,并就此错误向他们寻求帮助。他们的回答是“抱歉,我们不支持脚本。”
现在我在这里向你们寻求帮助。也许我们可以让这个脚本运行,这样我就可以恢复我的文件的最新工作版本。
非常感谢您提供的任何帮助。
【问题讨论】:
【参考方案1】:看看https://gitlab.com/strider/delockyfier 。这是 javascript 中的单页应用程序,您可以按原样运行,或者如果您希望从那里运行它,也可以轻松转换为 Apps 脚本。
【讨论】:
【参考方案2】:您首先必须确保启用 Advance Drive Service,如下所述: https://developers.google.com/apps-script/advanced/drive 进入你的脚本页面,点击 Resources --> 然后点击 Google Advances Services,然后启用(必须是绿色的!)Drive API。 也许警报会为您打开一个页面,您必须在该页面上启用脚本以访问您的驱动器和文件夹(我认为只是第一次)。 之后,如果您在脚本的第 2 行设置断点并在 istruction 之后运行调试器 istruction,则通过第 27 行没有任何问题,您可以在变量 stack 中看到第一个文件的所有字符串,然后对于第二个等等...... 然后停止并这次正常运行,一切都会好的。 祝你晚安。
【讨论】:
非常感谢!它现在正在工作。就多了一个问题。现在我只能在一个文件夹(ID)上应用脚本,子文件夹中的文件不会被恢复。你知道是否也有一种简单的方法可以恢复子文件夹中的文件?以上是关于CryptoLocker - 使用 Google Apps 脚本恢复云端硬盘文件版本的主要内容,如果未能解决你的问题,请参考以下文章
使用 Google Data API 使用 C# 访问 Google 电子表格