Files
BakNRet/BackupConfig.psd1
T
Shuery 520257b5e5 fix: 口令文件默认值回到仓库根(按你的决定),并让相对路径与工作目录无关
你的决定:口令文件继续放在仓库根,靠 .gitignore 的 *.key 兜住"不被提交"。我把出厂默认值改回 baknret.key,并把配置注释从"必须放在仓库之外"改成如实说明这是一次取舍:省事 vs 「不提交」依赖一个规则文件(git add -f、或整目录复制到别处再初始化仓库时,口令会跟着走)。

顺手修掉一个潜在陷阱:口令文件写相对路径时,原先的 Test-Path 是按**当前工作目录**找的。计划任务的工作目录通常是 C:\Windows\System32,在那里 Test-Path baknret.key 为假,加密条目就会以"拿不到口令"失败 —— 而配置看上去毫无问题。现在相对路径按仓库根解析(复用上一轮抽出来的 Resolve-BakNRetRootedPath)。

证据:把工作目录切到 C:\Windows\System32 再跑真实清单只读冒烟,仍然 4/4 通过(那份真实配置里有 5 个加密条目、口令文件就是仓库根的 baknret.key)。

验收:test.ps1 9/9 全绿(7 与 5.1)。
2026-09-27 11:21:43 +08:00

100 lines
4.8 KiB
PowerShell
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<#
BakNRet 配置文件。
优先级:命令行参数 > 本文件 > 代码内置默认值。
本文件缺失或某键缺失都直接用默认值,不会报错。
#>
@{
# 归档存放目录(相对路径按脚本所在目录解析)
BackupDir = 'Backups'
# 每次运行的日志目录(backup-<时间戳>.log / restore-<时间戳>.log)
LogDir = 'logs'
# 使用 -Snapshot 时留存带时间戳的副本
SnapshotDir = 'Backups\snapshots'
# 软件名录("软件名 -> 目录"映射表)。相对路径按本配置所在目录解析。
# BackupList.txt 里写软件名时靠它换成真实目录,归档名也取软件名。
SoftwareCatalog = 'SoftwareCatalog.psd1'
# 低于这个剩余空间(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 指向的文件首行 (首行即口令)
#
# 出厂默认值就是仓库根的 baknret.key,靠 .gitignore 的 *.key 兜住「不被提交」。
# 这是**取舍**而非疏忽:留在仓库根最省事(口令与配置在一起,搬家不容易丢),代价是
# 「不提交」这件事依赖一个规则文件 —— 谁写了 git add -f、或把整个目录复制到别处再
# 初始化仓库,口令就会跟着走。要更稳就把文件放到仓库外,用下面的 B 或 A。
# 4. 交互式询问(仅交互式会话;计划任务里不会停下来等输入)
# 全都拿不到时该条目明确失败,绝不退化成明文归档。
#
# 注意 7z 只接受命令行口令,口令在本机进程列表里短暂可见,这是 7z 本身的限制。
Encryption = @{
Enabled = $false
PasswordFile = 'baknret.key'
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'
)
}