通过命令行配置Windows 8 / 8.1 / 10文件历史记录


7

tl; dr:有没有办法通过无人参与的命令行/某些脚本配置Windows 8文件历史记录?

很长的故事: 我正在配置很多独立(非域)PC,我认为一些备份比没有备份更好。在Windows 7上,我甚至配置了它的标准备份,尽管它被延迟了 - 默认情况下它会在每个星期一显着减慢计算机速度,除非有一些模糊的原因用户在周末之前没有关闭它的PC,它会填充备份介质并停止备份。

我辞职试图自动化其配置,但至少在那里我可以设置一次作为管理员,它对包括新用户在内的所有人都有效。我是 调度 (安排是 自动化 自定义脚本 在备份媒体空间不足时删除旧备份,因此之后不需要维护(设置一次并忘记)。

从Windows 8开始,有一个名为文件历史记录的东西,它对用户的侵扰性很小(它的性能影响几乎不可察觉),它可以自行清理(基于年龄或自由空间的自动历史管理)。它是真正的备份解决方案,现在真实:) 但它还需要为每个用户手动配置。作为用户,这是不可接受的 忘了配置它。

我的计划是使用一些runonce登录脚本为每个用户配置它。我已经通过runonce-logon脚本做了一些事情,所以安装这样的脚本不是问题。但我不知道如何通过脚本配置文件历史记录。

我尝试了一些研究,但唯一的官员 (有一些非官方的调查结果,见下面的截图) 我找到的相关工具是 FhManagew.exe ,删除旧文件版本。我需要先通过GUI进行设置。在链接上,有完整的API,似乎可以通过该API配置文件历史记录。但我认为这是.NET应用程序的API,因此无法通过命令行使用它。或者可以吗?

尝试注册表搜索,但在任何地方都找不到文件历史记录位置:(

具体来说,假设我要设置文件历史记录 \\localhost\FileHistory$ 并保持文件版本,直到需要空闲空间(默认情况下,它永远保留)。这是它应该看起来的样子:

File History in classic Control Panel File History Advanced Settings File History Select Drive

供参考:备份到本地共享是解决方法,使文件历史记录在单个HDD上工作,否则它声称它不安全。


以下是我通过注释找到的内容:配置存储在xml文件中 %LocalAppData%\Microsoft\Windows\FileHistory\Configuration。它在注册表项中引用 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\fhsvc\Parameters\Configs 使用值name =配置文件夹的路径(如上所述)和值data = REG_DWORD:1

但只需添加这些文件和注册表值并启动服务( 有它的脚本 )无法启动备份,配置在控制面板中也不会更新。但是,如果已经配置了文件历史记录,则xml文件的更新将反映在控制面板中。


1
看看这个 链接 。这可能会帮助你。
Smeerpijp

谢谢,发现它的痕迹 另一个 。尝试使用这两个编写安装脚本。
LogicDaemon

我仍然没有成功。我不知道什么是错的。将根据我的发现附加初步问题。
LogicDaemon

1
我发现虽然设置了FileHistory后,我可以修改Config1.xml文件,这些更改似乎立即生效。
joeking

Answers:


4

不幸的是,API使用起来并不是很简单 - 大多数相关的调用都是 一个COM对象 没有实现 IDispatch。因此,从PowerShell调用这些函数将非常困难和麻烦。这些是我们需要进行的调用:

要调用所有这些函数,我们可以使用我的开源应用程序 SprintDLL 。我为你编写了这个脚本,并用每个部分的faux-C ++等价物进行了评论:

// CoCreateInstance(CLSID_FhConfigMgr, NULL, CLSCTX_INPROC_SERVER, IID_IFhConfigMgr, &fh)
newslot native fhPtr
call ole32.dll!CoCreateInstance /return uint (blockptr(guid {ED43BB3C-09E9-498a-9DF6-2177244C6DB4}), nullptr, int 1, blockptr(guid {6A5FEA5B-BF8F-4EE5-B8C3-44D8A0D7331C}), slotptr fhPtr)
newslot native fh
copyslot fh = fhPtr dereferenced
newslot block vtbl = nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr
copyslot vtbl = fh dereferenced

// fh->CreateDefaultConfiguration(TRUE)
newslot native createDefaultConfiguration
copyslot createDefaultConfiguration = vtbl field 4
call funcat createDefaultConfiguration /call thiscall /return uint (slotdata fhPtr, int 1)

// fh->ProvisionAndSetNewTarget("\\localhost\FileHistory$\", "Local Disk")
newslot native provisionAndSetNewTarget
copyslot provisionAndSetNewTarget = vtbl field 14
call funcat provisionAndSetNewTarget /call thiscall /return uint (slotdata fhPtr, bstr "\\\\localhost\\FileHistory$\\", bstr "Local Disk")

// fh->SetLocalPolicy(FH_RETENTION_TYPE, FH_RETENTION_UNLIMITED)
newslot native setLocalPolicy
copyslot setLocalPolicy = vtbl field 9
call funcat setLocalPolicy /call thiscall /return uint (slotdata fhPtr, int 1, int 1)

// fh->SetBackupStatus(FH_STATUS_ENABLED)
newslot native setBackupStatus
copyslot setBackupStatus = vtbl field 11
call funcat setBackupStatus /call thiscall /return uint (slotdata fhPtr, int 2)

// fh->SaveConfiguration()
newslot native saveConfiguration
copyslot saveConfiguration = vtbl field 5
call funcat saveConfiguration /call thiscall /return uint (slotdata fhPtr)

// FhServiceOpenPipe(TRUE, &fhPipe)
newslot native fhPipe
call fhsvcctl.dll!FhServiceOpenPipe /return int (int 1, slotptr fhPipe)

// FhServiceReloadConfiguration(fhPipe)
call fhsvcctl.dll!FhServiceReloadConfiguration /return int (slotdata fhPipe)

// FhServiceClosePipe(fhPipe)
call fhsvcctl.dll!FhServiceClosePipe /return int (slotdata fhPipe)

我从函数的位置获得了VTable字段ID C风格的COM接口 用于文件历史记录管理器COM对象。如果脚本成功,则会说每个函数都返回零。

要使用该脚本,请将其保存到文件中,例如 filehistory.sprint。然后,您可以从批处理文件中运行它,如下所示:

sprintdll run filehistory.sprint

如果通过网络进行部署,您可能希望包含一个命令,该命令首先将实用程序和脚本复制到本地计算机上。


2
好吧,所以这不仅为我在这个特定问题的MSDN文档地狱中节省了大量时间,而且我喜欢SprintDLL!缺乏文档有点糟糕,但代码本身很简单,它有点牵强。很高兴你把它放在那里,你甚至可能很快就会看到一两个PR或者:)
Reid Rankin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.