Instantanés et dérive
Tous les autres outils vous disent à quoi ressemble une machine maintenant. La question qu'un administrateur se pose vraiment est qu'est-ce qui est différent de l'époque où ça marchait - et aucun Windows standard n'y répond.
Ce que contient un instantané
La machine entière à un moment donné : chaque service et chaque pilote, avec son type de démarrage, son compte, son chemin de lancement et ses arguments, le hachage et le signataire du fichier qu'il exécute, ses dépendances et ce qui en dépend, ses déclencheurs, ses privilèges requis, son type de SID et son descripteur de sécurité - plus le nom de la machine, le compte qui l'a pris et si ce compte était un administrateur.
bws snapshot create before.json --note "before the patch"
C'est du JSON avec un champ par ligne. C'est voulu : un instantané entre ainsi dans un dépôt et git diff le lit, de sorte que la comparaison propre à l'outil n'est pas la seule façon d'en regarder un.
Rangez-le pour ce qu'il est. Un instantané décrit la machine entière, jusqu'à chaque chemin de lancement et chaque descripteur de sécurité. Il est écrit avec les autorisations que son répertoire a déjà, et l'outil ne restreint rien - un répertoire que d'autres personnes peuvent lire est donc un répertoire où elles peuvent lire tout cela.
Puis demander ce qui est différent
$ bws snapshot diff before.json --live --exit-code
Changed (2):
Spooler Print Spooler
startType: Manual -> Automatic
status: Stopped -> Running (running state, not configuration)
wlidsvc Microsoft Account Sign-in Assistant
status: Stopped -> Running (running state, not configuration)
Added 0, removed 0, changed 2. Fields differing: 1 in configuration, 2 in running state.
- La configuration et l'état d'exécution sont signalés séparément. Deux instantanés pris à un jour d'intervalle diffèrent par ce qui se trouve tourner, et presque rien de cela n'est une dérive. Mélangée, la seule ligne qui compte - un type de démarrage que quelqu'un a changé - est enterrée sous quarante qui ne comptent pas.
- Ce qui n'a pas pu être comparé est listé, pas caché. Un champ que l'un des deux instantanés n'a jamais lu, parce que cette session n'y avait pas droit, ressort comme not compared sous son entrée, et le résumé compte ces entrées. Une comparaison qui dit rien n'a changé signifie donc que rien n'a changé dans ce que les deux côtés pouvaient voir.
- Un instantané avec élévation comparé à un autre sans élévation mentirait, en signalant comme supprimées des entrées que personne n'a supprimées. Chaque fichier enregistre si le compte qui l'a pris était un administrateur, et la comparaison le dit.
- Deux fichiers, pas seulement un fichier et cette machine. Prenez-en un en préproduction et un en production et comparez-les n'importe où - la réponse à pourquoi la préproduction diffère-t-elle n'a besoin d'aucune des deux machines.
La fenêtre fait la même chose sous Audit.... Take snapshot... écrit le même fichier, avec une note si vous en tapez une, et Compare with this machine... ou Compare two snapshots... montre ce qui a changé à la place de la liste, une ligne par champ, tout ce qui rend la comparaison moins qu'exacte étant dit au-dessus du tableau. Show la restreint aux différences ou à un champ, et Export... l'écrit dans un fichier CSV.
Le code de sortie est le point essentiel
--exit-code se termine par 5 quand la configuration diffère - une entrée ajoutée ou supprimée, ou une entrée configurée autrement. Un service qui s'est seulement arrêté ou démarré de lui-même est signalé et ne compte pas, pas plus que les copies par utilisateur que Windows fait pour chaque session ouverte, qui sont écartées et comptées. Ce n'est pas un échec - trouver une dérive est ce pour quoi cet outil existe, et la trouver n'est pas un échec - ce qui explique qu'il ait un numéro à lui plutôt que d'emprunter celui qui signifie que quelque chose s'est mal passé.
# le jour où la machine entre en service
bws snapshot create C:\baselines\web01.json --note "after the build"
# chaque nuit, depuis une tâche planifiée
bws snapshot diff C:\baselines\web01.json --live --exit-code --json > C:\logs\drift.json
# 0 - aucune dérive de configuration
# 5 - la configuration a dérivé, et drift.json dit en quoi
# 3 - elle a tourné et n'a pas pu tout lire, la réponse est donc partielle
C'est tout le mécanisme : une référence prise quand la machine était réputée saine, et une question posée chaque nuit. Si la première nuit répond 5, quelqu'un l'apprend la première nuit plutôt que le matin où quelque chose casse.