如何保护群晖NAS中的AutoHotkey自动化热键脚本程序源代码 2023年4月8日

发布时间 2023-04-08 21:27:02作者: QQ595076941

 

    如何保护群晖NAS中的AutoHotkey自动化热键脚本程序源代码 2023年4月8日

        通过RaiDrive_v1.5.3.1或者Mount Duck或者WebDrive或者NetDrive2或者Synology Drive Client异地远程连接群晖NAS的SFTP或者WebDAV文件服务并映射网络驱动器之后(公网IP地址、DDNS动态域名解析、端口转发)我们可以在网络驱动器中直接运行AutoHotkey自动化热键脚本程序并自动静默智能安装应用程序软件,执行预设程序,实现一系列功能,完成一系列任务,达到一系列目的。

        受小偷偷盗、硬盘损坏、服务器设备损毁、停电、宕机、网络故障、用户误操作、非法入侵、自然灾害、战争等因素的影响,我们有可能会无法访问存放在群晖NAS中的AutoHotkey自动化热键脚本,并丢失AutoHotkey自动化热键脚本。

      通过定制304不锈钢厚钢板NAS保护配电箱、Cloud Sync自动实时单向同步、Hyper Backup和Snapshot Replication定时单向多版本复制备份、UPS不断电系统、线径1.5的减振降噪弹簧垫子等各种措施可以有效的防止丢失存放在群晖NAS中的AutoHotkey自动化热键脚本,保持存放在群晖NAS中的AutoHotkey自动化热键脚本长期可用。

    考虑到资金、必要性和脚本重要程度等因素,我暂时不打算使用Synology High Availability 高可用集群。

 

rem E:\Build\Autorun-Hotkey-Lnk\一键打包成单文件程序\一键打包成单文件程序.bat
rem Prog-SS-中的SS 是 Silent Setup  的简写,表示静默全自动安装                                                                                                       

if exist "C:\Program Files (x86)\WinRAR\WinRAR.exe" (
"C:\Program Files (x86)\WinRAR\WinRAR.exe" a -ag__YYYY.MM.DD_HH-MM-SS -iiconico.ico -m5 -r -sfx -z%~dp0自解压脚本命令.txt %~dp0Prog-SS-.exe %~dp0..\*.*
)else (
"C:\Program Files\WinRAR\WinRAR.exe" a -ag__YYYY.MM.DD_HH-MM-SS -iiconico.ico -m5 -r -sfx -z%~dp0自解压脚本命令.txt %~dp0Prog-SS-.exe %~dp0..\*.*)
exit

 

; E:\Build\Autorun-Hotkey-Lnk\一键打包成单文件便携可执行程序\自解压脚本命令.txt
;下面的注释包含自解压脚本命令
;Path=解压缩路径
;Presetup=解压缩前运行
;Setup=解压缩后运行,可以输入多行Setup=一起执行
;Silent=静默方式:1-隐藏全部      2-隐藏启动对话框      空着不设置-显示全部
;Overwrite=覆盖方式:1-覆盖全部文件      2-跳过已存在的文件      空着不设置-覆盖前询问
;请选择正确的图标并保存正确的配置文件

Path=C:\Prog\LockNote
Setup=C:\Prog\LockNote\AutoCloseLock-Note.exe
Setup=C:\Prog\LockNote\AutoCloseLock-Note-2.exe
Silent=2
Overwrite=2

 

;当此脚本已经运行时自动替换旧实例再次运行。
#SingleInstance,force
;让脚本持久运行(即直到用户关闭或遇到 ExitApp)。
#Persistent
;用强制的方法激活窗口。阻止任务栏按钮的闪烁.
#WinActivateForce
;不显示托盘图标。
; #NoTrayIcon
;不检查空变量是否为环境变量(建议所有新脚本使用)。
#NoEnv
SetTimer,AutoCloseLockNote,500
Run,%A_ScriptDir%\LockNote.exe,%A_ScriptDir%
return
AutoCloseLockNote()
{
	;超时毫秒数,55秒*1000毫秒/秒=50000毫秒,  1秒 = 1000毫秒
	;A_TimeIdlePhysical表示从系统最后一次接收到键盘,
	;鼠标或其他输入后所经过的毫秒数. 这可以用来判断用户是否离开.
	if(A_TimeIdlePhysical>55000)
	{
		loop,50
		{
			;等待指定标题窗口出现
			; WinWait, LockNote - Steganos LockNote ahk_class ATL:0044B1A0 ahk_exe LockNote.exe
			;设置脚本可以“看见”隐藏的窗口。
			DetectHiddenWindows,On
			;窗口标题匹配模式改成某个位置必须包含WinTitle。
			SetTitleMatchMode,2
			WinClose, LockNote
			WinClose, ahk_exe LockNote.exe
			WinKill, LockNote
			WinKill, ahk_exe LockNote.exe
			Process,Close,LockNote.exe
		}
		SetTimer,AutoCloseLockNote,Delete
		ExitApp
	}
}

 

;当此脚本已经运行时自动替换旧实例再次运行。
#SingleInstance,force
;让脚本持久运行(即直到用户关闭或遇到 ExitApp)。
#Persistent
;用强制的方法激活窗口。阻止任务栏按钮的闪烁.
#WinActivateForce
;不显示托盘图标。
; #NoTrayIcon
;不检查空变量是否为环境变量(建议所有新脚本使用)。
#NoEnv
SetTimer,AutoCloseLockNote2,600
; Run,%A_ScriptDir%\LockNote.exe,%A_ScriptDir%
return
AutoCloseLockNote2()
{
	;超时毫秒数,50秒*1000毫秒/秒=50000毫秒,  1秒 = 1000毫秒
	;A_TimeIdlePhysical表示从系统最后一次接收到键盘,
	;鼠标或其他输入后所经过的毫秒数. 这可以用来判断用户是否离开.
	if(A_TimeIdlePhysical>50000)
	{
		loop,60
		{
			;等待指定标题窗口出现
			; WinWait, LockNote - Steganos LockNote ahk_class ATL:0044B1A0 ahk_exe LockNote.exe
			;设置脚本可以“看见”隐藏的窗口。
			DetectHiddenWindows,On
			;窗口标题匹配模式改成某个位置必须包含WinTitle。
			SetTitleMatchMode,2
			WinClose, LockNote
			WinClose, ahk_exe LockNote.exe
			WinKill, LockNote
			WinKill, ahk_exe LockNote.exe
			Process,Close,LockNote.exe
		}
		SetTimer,AutoCloseLockNote2,Delete
		ExitApp
	}
}

 

program LoginSyno;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

 

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellAPI, ExtCtrls;

type
  TForm1 = class(TForm)
    edtPwd: TEdit;
    tmr1: TTimer;
    procedure tmr1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.tmr1Timer(Sender: TObject);
begin
  if edtPwd.Text = 'xuxl6188' then
  begin
    ShellExecute(handle, 'open', 'C:\Prog\WinSCP\WinSCP.exe', 'smb-sftp-usr-2-A_N.9_H.4-end:s_m_b_s_f_t_p-p_w_d_-.g2-66-n-end@abcde.myds.me:49826 /Desktop /UploadIfAny', 'C:\Prog\WinSCP', SW_SHOWNORMAL);
    Application.Terminate;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.Position := poScreenCenter;
end;

end.

 

; ====== 脚本设置开始 =====
; 不检查空变量是否为环境变量(推荐所有新脚本使用).
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; 启用或禁用可能产生错误的特定状况时的警告, 例如书写错误或缺少全局声明.
; #Warn  ; Enable warnings to assist with detecting common errors.
; 让 Send, SendRaw, Click 和 MouseMove/Click/Drag 切换到 SendInput 方法.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
; 改变脚本的当前工作目录. 当前脚本所在目录的绝对路径. 不包含最后的反斜杠(根目录同样如此).
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
; 不显示托盘图标.
#NoTrayIcon
; 决定当脚本已经运行时是否允许它再次运行.Ignore: 跳过对话框并让旧实例继续运行. 换句话说, 试图启动已经运行的脚本会被忽略.
#SingleInstance Ignore
; 设置脚本可以 "看见" 隐藏的窗口.
DetectHiddenWindows,On
; 设置在类似 WinWait 命令中 WinTitle 参数的匹配模式.•2 = 窗口标题的任意位置包含 WinTitle 才能匹配.
SetTitleMatchMode,2
; 让脚本持续运行(即直到用户关闭或遇到 ExitApp).
#Persistent
; ====== 脚本设置结束 =====
SetTimer,WinHideTimer,1000
Hotkey,^!F9,ShowWinSCP
return
WinHideTimer()
{
	;超时毫秒数,1分钟*60秒/分钟*1000毫秒/秒=60000毫秒,  1秒 = 1000毫秒
	;A_TimeIdlePhysical表示从系统最后一次接收到键盘,
	;鼠标或其他输入后所经过的毫秒数. 这可以用来判断用户是否离开.
	if(A_TimeIdlePhysical>60000)
	{
		WinHide,WinSCP
		WinHide,ahk_class TScpCommanderForm
		WinHide,ahk_exe WinSCP.exe
		SetTimer,WinHideTimer,Delete
	}
}
;
ShowWinSCP()
{
	WinShow,WinSCP
	WinShow,ahk_class TScpCommanderForm
	WinShow,ahk_exe WinSCP.exe
	WinActivate,WinSCP
	WinActivate,ahk_class TScpCommanderForm
	WinActivate,ahk_exe WinSCP.exe
	SetTimer,WinHideTimer,1000
}

 

请支付1积分,以便查看下面的隐藏内容。下面的隐藏内容是 Synology 群晖 NAS 的部署示意图,也是本文的精华所在。

[content_hide]

 

[/content_hide]

问:为何不使用 RAID 1 镜像存储池(有数据保护)来复制备份AutoHotkey脚本?

答:因为 RAID 1 镜像存储池(有数据保护)出现故障并恢复存储池后有极小概率会出现误恢复数据(在使用一段时间后存储池修复,其中某块硬盘中的老数据覆盖到最近一段时间产生的新数据上,形成数据覆盖,破坏最新数据。  产生数据A,RAID 1 降级后产生数据B,修复存储池后产生数据C,极小概率出现数据A覆盖数据B和数据C造成数据丢失)。

问:为何不使用 RAID 5 或者 RAID 6 存储池(有数据保护)来复制备份AutoHotkey脚本?

答:因为RAID 5 在修复存储池时有极小概率会出现存储池损毁,RAID 6 存储池的性能比较差并且有点复杂。

我比较喜欢使用简单易用的 Basic 存储池,1块硬盘对应1个存储池,互不影响,实时单向同步后即使硬盘损坏也不会丢失数据,注意:Cloud Sync实时单向同步时的服务器地址应当填写 https://localhost:49826 表示连接群晖NAS的WebDAV Server服务器本地文件服务,实时单向同步文件到本地硬盘中。对硬盘容量没有要求,对硬盘插入顺序没有要求,硬盘挂载到Windows或者Linux系统中数据恢复数据提取相对简单(无RAID、无校验冗余数据、无互相依赖关系,简简单单,明明白白,干干净净)。