病毒最近加密了我的所有文件,不幸的是,谷歌备份和同步立即将文件的新版本(加密)上传到我的驱动器。 我知道我可以将单个文件恢复到以前的版本,但我的驱动器上大约有 30,000 个文件 - 这意味着我无法手动恢复所有这些文件... 我尝试使用 Apps 脚本,但我找不到真正解决它的方法。
在 Ruben 的帮助下,我使用了 CryptoLocker - 使用 Google Apps 脚本恢复云端硬盘文件版本 中建议的代码(细微更改 - 我的代码运行文件夹中的所有文件,包括子文件夹)来删除我创建的文件的所有版本在病毒袭击的当天。现在每个文件的版本都是病毒攻击之前的版本。
/** A function that delete all version of files in folder and subfolders that were made at the day of the virus attack and afterwards*/
function fixAllFilesInFolder(){
var sh = SpreadsheetApp.getActiveSheet();
var folderId = #enter folder Id here
var folder = DriveApp.getFolderById(folderId); // I change the folder ID here
handleFolder(folder, 0)
}
/** A recursive function - delete all 'bad' versions of files in folder and calls itself with each of the subfolders to do the same*/
function handleFolder(folder, treeRank){
Logger.log(String(treeRank) + ': ' + folder.getName());
fixFolderFiles(folder)
var subFolders = folder.getFolders();
while (subFolders.hasNext()){
subFolder = subFolders.next();
handleFolder(subFolder, treeRank + 1)
}
}
/** Delete all 'bad' versions of files in folder*/
function fixFolderFiles(folder){
var files = folder.getFiles();
while (files.hasNext()){
file = files.next();
deleteRevisions(file)
}
}
/** Delete 'bad' version of a file*/
function deleteRevisions(file){
var fileId = file.getId();
var revisions = Drive.Revisions.list(fileId);
var virusDate = new Date(2021, 3, 30) /** Put your attack date here!*/
if (revisions.items && revisions.items.length > 1)
{
for (var i = 0; i < revisions.items.length; i++)
{
if (i > 0){
var revision = revisions.items[i];
var date = new Date(revision.modifiedDate);
if(date.getTime() > virusDate.getTime()){
return Drive.Revisions.remove(fileId, revision.id);
}
}
}
}
}
两个注意事项:
from os import rename, listdir, walk
from os.path import join, isfile
ENCRYPTION = 'wrui' #Here should be the encryption format
#A function to rename a file without the encryption format - it makes sure that no file is named with the same name exactly. In that case, it adds '2' to the files name
def renameFile(address, origin_name, new_name):
final_name = new_name
if isfile(join(address, new_name)):
name_list = new_name.split('.')
name_list[-2] += '2'
final_name = '.'.join(name_list)
rename(join(address, origin_name), join(address, final_name))
#A function to rename all files in a specific folder
def purifyFolderFiles(folder_address):
for file in listdir(folder_address):
f_list = file.split('.')
if len(f_list) > 1:
if f_list[-1] == ENCRYPTION:
renameFile(folder_address, file, '.'.join(f_list[:-1]))
elif f_list[-2] == ENCRYPTION:
if f_list[-3] == f_list[-1]:
renameFile(folder_address, file, '.'.join(f_list[:-2]))
else:
del f_list[-2]
renameFile(folder_address, file, '.'.join(f_list))
#This next few lines iterate through all the subfolders of the specific folder you put and use purifyFolderFiles to rename every file there
folder = #enter you folder address here
for path, subdirs, files in walk(folder):
for name in subdirs:
subdir_address = join(path, name)
purifyFolderFiles(subdir_address)
添加此作为答案,因为我无法发表评论。
我在尝试接受的答案时学到了一些东西。
这就是我需要做的一切才能让它发挥作用。 如果您希望程序告诉您正在更改哪些文件,请使用以下代码替换 deleteRevisions 函数:
/** Delete 'bad' version of a file*/
function deleteRevisions(file){
var fileId = file.getId();
var revisions = Drive.Revisions.list(fileId);
var virusDate = new Date(2021, 09, 05) /** Put your attack date here! Year, Month (0-11), Day*/
if (revisions.items && revisions.items.length > 1)
{
Logger.log(file);
for (var i = 0; i < revisions.items.length; i++)
{
if (i > 0){
var revision = revisions.items[i];
var date = new Date(revision.modifiedDate);
if(date.getTime() > virusDate.getTime()){
return Drive.Revisions.remove(fileId, revision.id);
}
}
}
}
}
我做了一些细微的更改,以修复原始文件名和修改时间,以便恢复文件保持感染前的状态。
/** Delete 'bad' version of a file*/
function deleteRevisions(file) {
Logger.log(file);
var fileId = file.getId();
var revisions = Drive.Revisions.list(fileId);
var virusDate = new Date("2022-08-03"); /** Date in "YYYY-MM-DD" format*/
if (revisions.items && revisions.items.length > 1) {
for (var i = 0; i < revisions.items.length; i++) {
if (i > 0) { // rev[0] (v1) is original file version
var revision = revisions.items[i];
var revDate = new Date(revision.modifiedDate);
if (revDate.getTime() > virusDate.getTime()) {
Logger.log("Gonna delete " + file + " v." + i + "-" + revDate.toISOString());
//return Drive.Revisions.remove(fileId, revision.id);
Drive.Revisions.remove(fileId, revision.id);
fixFileNameAndModifiedDate(file);
}
}
}
} else {
fixFileNameAndModifiedDate(file);
}
}
/** Fix 'correct' File Name & Last modified Date */
function fixFileNameAndModifiedDate(file) {
var fileId = file.getId();
var revisions = Drive.Revisions.list(fileId);
var lastFileVNr = revisions.items.length - 1; // Last File Version Number
var lastFileVIt = revisions.items[lastFileVNr]; // Last File Version Item
var lastFileVDt = new Date(lastFileVIt.modifiedDate); //Last File Version Date
var lastFileVNm = lastFileVIt.originalFilename; //Last File Version Name
var currFileMDt = file.getLastUpdated(); // Current File Modified Date
var currFileMNm = file.getName(); // Current File Name .getName()
// Different Modified Dates
if (lastFileVDt.getTime() !== currFileMDt.getTime()) {
Logger.log("Gonna change modif date: " + lastFileVDt.toISOString())
Drive.Files.patch({ modifiedDate: lastFileVDt.toISOString() },
fileId,
{ modifiedDateBehavior: "fromBody", supportsAllDrives: true });
}
// Different File Name
if (lastFileVNm !== currFileMNm) {
Logger.log("Gonna change file name: " + lastFileVNm)
Drive.Files.patch({ title: lastFileVNm },
fileId,
{ supportsAllDrives: true });
}
return
}
这是另一个解决方案单击此处从github检查。 我的问题是所有文件都已加密,而 Google Drive 还保留了加密版本和以前的版本。我必须紧急转换一些文件,任何运行的脚本都会对恢复的文件产生问题。所以我检查了文档并与理解的人讨论。我什至搜索并询问了人工智能工具。有一次我想出了如何解决这个问题,并在 github 上分享给任何想要更新、使用甚至更改代码的人。