Configurando o histórico de arquivos do Windows 8 / 8.1 / 10 via linha de comando

7

tl; dr: Existe uma maneira de configurar o histórico de arquivos do Windows 8 via linha de comando autônoma / algum script?

longa história: Estou configurando muitos PCs autônomos (sem domínio) e acho que algum backup é melhor que nenhum backup. No Windows 7, eu mesmo configurei seu backup padrão, apesar de ser retardado - por padrão, ele diminui significativamente o computador toda segunda-feira, a menos que o usuário não desligue o PC antes do final de semana, e ele preenche o backup médio e pára de fazer o backup.

E pedi demissão para tentar automatizar sua configuração, mas pelo menos lá posso configurá-lo uma vez como administrador, e é efetivo para todos, incluindo novos usuários. E eu sou agendamento (agendamento é automatizado ) script personalizado para remover backups antigos quando a mídia de backup estiver com pouco espaço, s o não requer manutenção depois (ajuste uma vez e esqueça).

Desde o Windows 8, há essa coisa chamada Histórico de Arquivos, que é muito menos invasiva para os usuários (o impacto sobre o desempenho é quase imperceptível) e pode ser limpa por si mesma (gerenciamento automático de histórico baseado em idade ou espaço livre) . É uma verdadeira solução de backup, de verdade agora :) Mas também requer configuração manual para cada usuário. O que não é aceitável, pois os usuários irão esquecer de configurá-lo.

Meu plano é configurá-lo por usuário usando algum script de logon runonce. Eu já estou fazendo algumas coisas através de scripts de logon runonce, portanto, instalar um script desse tipo não é um problema. Mas eu não sei como configurar o histórico de arquivos por meio de um script.

Eu tentei algumas pesquisas, mas o único oficial (existem algumas descobertas não oficiais, veja abaixo capturas de tela) ferramenta relacionada que encontrei é FhManagew.exe , que remove as versões antigas dos arquivos. E eu preciso configurá-lo via GUI primeiro. No link, há API completa e, aparentemente, o histórico de arquivos pode ser configurado por meio dessa API. Mas eu suponho que isso é API para aplicativos .net, por isso não pode ser usado via linha de comando. Ou pode?

Tentou pesquisar no registro, mas a localização do histórico de arquivos não foi encontrada em lugar algum: (

Para detalhes, digamos que eu queira configurar o histórico do arquivo para \localhost\FileHistory$ e manter a versão do arquivo até que o espaço livre seja necessário (por padrão, isso é mantido para sempre). Veja como deve ficar:

Parareferência:obackupparacompartilhamentolocaléumasoluçãoalternativaparafazercomqueohistóricodearquivosfuncioneemumúnicoHDD;casocontrário,eleafirmaserinseguro.

Aquiestáoqueeuencontreiviacomentários:aconfiguraçãoéarmazenadaemarquivosxmlem%LocalAppData%\Microsoft\Windows\FileHistory\Configuration.EleéreferenciadonachavederegistroHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\fhsvc\Parameters\Configscomnomedovalor=caminhoparaapastadeconfiguração(comoacima)edadosdevalor=REG_DWORD:1.

Masbastaadicionaressesarquivosevaloresderegistroeiniciaroserviço( há script para isso ) não inicia os backups, nem a configuração é atualizada no Painel de Controle. No entanto, se o histórico de arquivos já estiver configurado, as atualizações para os arquivos xml serão refletidas no painel de controle.

    
por LogicDaemon 22.02.2016 / 16:37

1 resposta

4

Infelizmente, a API não é muito simples de usar. A maioria das chamadas relevantes é para um objeto COM que não implementa IDispatch . Portanto, seria extremamente difícil e confuso chamar essas funções do PowerShell. Estas são as chamadas que precisamos fazer:

Para chamar todas essas funções, podemos usar meu aplicativo de código aberto SprintDLL . Eu escrevi esse script para você, comentado com equivalentes de faux-C ++ de cada seção:

// 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)

Eu obtive os IDs dos campos VTable das posições das funções em a interface COM do tipo C para o objeto COM do gerenciador do Histórico de Arquivos. Se o script for bem-sucedido, ele dirá que todas as funções retornaram zero.

Para usar o script, salve-o em um arquivo, por exemplo %código%. Você pode então executá-lo a partir de um arquivo em lote como este:

sprintdll run filehistory.sprint

Se estiver implantando na rede, talvez você queira incluir um comando que copie o utilitário e o script na máquina local primeiro.

    
por 27.01.2018 / 03:39