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:
-
CoCreateInstance
para obter o objetoFhConfigMgr
-
IFhConfigMgr::CreateDefaultConfiguration
para criar a configuração ou substituir uma antiga -
IFhConfigMgr::ProvisionAndSetNewTarget
para definir a pasta de destino de backup -
IFhConfigMgr::SetLocalPolicy
para definir a política para excluir apenas quando for necessário espaço -
IFhConfigMgr::SetBackupStatus
para ativar o histórico de arquivos -
IFhConfigMgr::SaveConfiguration
para confirmar as alterações -
FhServiceOpenPipe
para obter uma alça para o serviço Histórico de Arquivos -
FhServiceReloadConfiguration
para informar ao serviço para recarregar suas configurações -
FhServiceClosePipe
para fechar o identificador para o serviço
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.