Configuration de l'historique des fichiers Windows 8 / 8.1 / 10 via une ligne de commande

9

tl; dr: Existe-t-il un moyen de configurer l’historique des fichiers Windows 8 via une ligne de commande sans surveillance / un script?

Longue histoire: Je configure beaucoup de PC autonomes (hors domaine) et je pense qu'une sauvegarde est préférable à l'absence de sauvegarde. Sous Windows 7, je configure même sa sauvegarde standard malgré son retard. Par défaut, l'ordinateur ralentit considérablement tous les lundis, à moins que l'utilisateur ne s'éteigne de ne pas éteindre son PC avant le week-end. Il remplit alors le support de sauvegarde et arrête la sauvegarde.

Et j’ai démissionné pour essayer d’automatiser sa configuration, mais au moins là, je peux la configurer une fois en tant qu’administrateur et elle est efficace pour tous, y compris les nouveaux utilisateurs. Et je planifie (la planification est automatisée ) un script personnalisé pour supprimer les anciennes sauvegardes lorsque le support de sauvegarde manque d’espace, de sorte qu’il ne nécessite aucune maintenance par la suite (défini une seule fois et oublié).

Depuis Windows 8, il existe ce type d’historique appelé Fichier, qui est beaucoup moins intrusif pour les utilisateurs (son impact sur les performances est à peine perceptible), et qui peut se nettoyer (gestion automatique de l’historique en fonction de l’âge ou de l’espace disponible). C'est une vraie solution de sauvegarde, pour de vrai maintenant :) Mais cela nécessite également une configuration manuelle pour chaque utilisateur. Ce qui est inacceptable, car les utilisateurs vont oublier de le configurer.

Mon plan est de le configurer par utilisateur en utilisant un script d’ouverture de session unique. Je fais déjà certaines choses via des scripts runonce-logon, donc l'installation d'un tel script ne pose pas de problème. Mais je ne sais pas comment configurer l'historique des fichiers via un script.

J'ai essayé quelques recherches, mais le seul outil officiel que j'ai trouvé (il y a des découvertes non officielles, voir les captures d'écran ci-dessous) est FhManagew.exe , qui supprime les anciennes versions des fichiers. Et je dois d'abord le configurer via l'interface graphique. Sur le lien, il y a une API complète, et apparemment, l'historique des fichiers peut être configuré via cette API. Mais je suppose que ceci est une API pour les applications .NET, elle ne peut donc pas être utilisée via une ligne de commande. Ou peut-il?

Essayé recherche dans le registre, mais l'emplacement de l'historique des fichiers ne se trouve nulle part :(

Pour plus de détails, supposons que je souhaite configurer l’historique des fichiers \\localhost\FileHistory$et conserver la version des fichiers jusqu’à ce que l’espace disponible soit suffisant (par défaut, cette information est conservée indéfiniment). Voici à quoi cela devrait ressembler:

Historique des fichiers dans le panneau de configuration classique Historique des fichiers Paramètres avancés Historique des fichiers Sélectionnez le lecteur

Pour référence: la sauvegarde sur un partage local est une solution de contournement qui permet à l’historique des fichiers de fonctionner sur un seul disque dur, sinon, il affirme qu’il est dangereux.


Voici ce que j’ai trouvé via les commentaires: la configuration est stockée dans des fichiers xml dans %LocalAppData%\Microsoft\Windows\FileHistory\Configuration. Il est référencé dans la clé de registre HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\fhsvc\Parameters\Configsavec la valeur nom = chemin du dossier de configuration (comme ci-dessus) et la valeur data = REG_DWORD:1.

Mais le simple fait d'ajouter ces fichiers et ces valeurs de registre et de démarrer le service ( il existe un script ) ne démarre pas les sauvegardes, aucune configuration n'est mise à jour dans le Panneau de configuration. Toutefois, si l'historique des fichiers est déjà configuré, les mises à jour des fichiers XML sont reflétées dans le panneau de configuration.

LogicDaemon
la source
1
Jetez un coup d'oeil à ce lien . Cela pourrait vous aider.
Smeerpijp
merci, suite à ses traces trouvé un autre . Essayer d'écrire un script d'installation en utilisant ces deux-là.
LogicDaemon
Je n'ai toujours pas de succès avec ça. Et je n'ai aucune idée de ce qui peut être faux. Je vais annexer la question initiale à mes conclusions.
LogicDaemon
1
J'ai cependant constaté qu'une fois que FileHistory est installé, je peux modifier le fichier Config1.xml et les modifications semblent prendre effet tout de suite.
Jeudi

Réponses:

5

Malheureusement, l’API n’est pas très simple à utiliser - la plupart des appels pertinents sont destinés à un objet COM qui n’est pas implémenté IDispatch. Il serait donc extrêmement difficile et fastidieux d’appeler ces fonctions à partir de PowerShell. Ce sont les appels que nous devons faire:

Pour appeler toutes ces fonctions, nous pouvons utiliser mon application open-source SprintDLL . J'ai écrit ce script pour vous, commenté avec des équivalents en faux-C ++ de chaque section:

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

J'ai obtenu les ID de champ VTable à partir des positions des fonctions dans l'interface COM de style C pour l'objet COM du gestionnaire d'historique des fichiers. Si le script réussit, il indiquera que chaque fonction renvoie zéro.

Pour utiliser le script, enregistrez-le dans un fichier, par exemple filehistory.sprint. Vous pouvez ensuite l'exécuter à partir d'un fichier de commandes comme ceci:

sprintdll run filehistory.sprint

Si vous effectuez un déploiement sur le réseau, vous voudrez peut-être inclure une commande qui copie d'abord l'utilitaire et le script sur la machine locale.

Ben N
la source
2
D'accord, non seulement cela m'a permis de gagner un temps considérable dans l'enfer de la documentation MSDN pour ce problème particulier, mais j'adore SprintDLL! Le manque de documentation est un peu nul, mais le code lui-même est assez simple, il en résulte en quelque sorte un double devoir. Bien à vous de l'avoir publiée, et vous pourriez même voir bientôt un ou deux représentants de ma part :)
Reid Rankin