<# BakNRet 配置文件。 优先级:命令行参数 > 本文件 > 代码内置默认值。 本文件缺失或某键缺失都直接用默认值,不会报错。 #> @{ # 归档存放目录(相对路径按脚本所在目录解析) BackupDir = 'Backups' # 每次运行的日志目录(backup-<时间戳>.log / restore-<时间戳>.log) LogDir = 'logs' # 使用 -Snapshot 时留存带时间戳的副本 SnapshotDir = 'Backups\snapshots' # 软件名录("软件名 -> 目录"映射表)。相对路径按本配置所在目录解析。 # BackupList.txt 里写软件名时靠它换成真实目录,归档名也取软件名。 SoftwareCatalog = 'SoftwareCatalog.psd1' # 名录里写的目录不存在时,按 "<名>_*" / "<名>-*" 向下找几层做前缀补全 # (应对 legendary -> legendary_2.0.4 这类带后缀的目录) CatalogMaxDepth = 5 # 低于这个剩余空间(GB)就告警;真正放不下某个条目时会直接跳过该条目 MinFreeSpaceGB = 5 # 归档写完后用 `7z t` 校验内容 CRC,失败则丢弃临时文件 VerifyArchive = $true # 是否默认给所有归档计算 SHA256(大归档会明显变慢) ComputeHash = $false # 7z 压缩级别 0-9 CompressionLevel = 9 # 压缩工具的实时输出:live = 直接显示(默认);quiet = 抑制,只留日志与 manifest ToolOutput = 'live' # 是否默认给所有条目留存快照 Snapshot = @{ Enabled = $false KeepCount = 3 KeepDays = 30 } # 加密。默认关闭:一旦开启而口令丢失,备份就再也解不开。 # # **本仓库不存放任何口令**,这里只记"去哪儿找": # Encryption.Enabled = $true -> 所有条目都加密 # SoftwareCatalog.psd1 的 Slot 写 Encrypt = $true(如 OpenSSH) # 或 BackupList.txt 里给单个条目加 :encrypt(如 Edge :encrypt) # # 口令本身按以下优先级获取(见 README「加密」): # 1. -Password 命令行参数 # 2. $env:BAKNRET_PASSWORD # 3. PasswordFile 指向的文件首行 —— 必须指向仓库**之外**的文件; # 出厂默认值留空:默认值指向仓库里的某个文件,等于鼓励把口令放进版本库 # 4. 交互式询问(仅交互式会话;计划任务里不会停下来等输入) # 全都拿不到时该条目明确失败,绝不退化成明文归档。 # # 注意 7z 只接受命令行口令,口令在本机进程列表里短暂可见,这是 7z 本身的限制。 Encryption = @{ Enabled = $false PasswordFile = '' EncryptHeaders = $true } # 安全描述符(NTFS 属主 / ACL)。 # # 归档格式装不下它:7-Zip 的 -sni 官方说明是"当前版本只能写进 WIM 归档", # .7z 里一个字节的 ACL 都没有。所以每个归档旁边多一个 <归档名>.acl.json, # 恢复时按它把属主 + 属组 + DACL 回放回去。 # # 为什么非要不可:C:\ProgramData 的 ACL 里有 (A;OICIIO;GA;;;CO) —— CREATOR OWNER # 不是账户,是访问检查时才替换的占位符,替换成"被检查对象的属主"。只回放 ACE 文本、 # 不恢复属主,等于把"谁创建的东西谁有全权"里的"谁"换成跑恢复脚本的那个账户, # 原程序(服务账户 / 专用用户)反而没了读写权限。 # # Mode Off —— 完全不采集:恢复出来的属主/ACL 是新建对象的默认值 # Full —— 每个对象都存(默认;正确性优先,几万文件的树 sidecar 几 MB) # Smart —— 只存"继承复现不出来"的对象(体积优化,判据见代码,终究是启发式) # Roots —— 只存每个归档项的根(最省,适合权限只在根上的场景) # IncludeSacl 是否连审计规则(SACL)一起存取;读/写它需要 SeSecurityPrivilege # SidMap 跨机恢复时的 SID 映射,例如: # @{ 'S-1-5-21-1-2-3-1001' = 'S-1-5-21-9-8-7-1001' } # FailOnError 安全描述符写盘失败时,是否把该条目算作失败(默认只告警并记进 manifest) Security = @{ Mode = 'Full' IncludeSacl = $false SidMap = @{} FailOnError = $false } # 所有条目都生效的排除模式,语法同 BackupList.txt(! 开头 = 任意层级匹配组件名) DefaultExcludes = @( '!Thumbs.db' '!desktop.ini' ) }