Cherchez vos services Windows, voyez chaque changement avant son exécution et découvrez ce qui a dérivé depuis hier

Better Windows Services est services.msc reconstruit pour celles et ceux qui administrent des machines Windows - une fenêtre et une ligne de commande sur un seul moteur. Posez une question à la machine au lieu de faire défiler huit cents lignes. Voyez ce qu'un changement va faire avant de valider quoi que ce soit. Et ce que services.msc n'a jamais eu : figer chaque service dans un fichier, et demander une semaine plus tard ce qui a changé.

  • Libre et gratuit, GPL-3.0
  • Un seul fichier, ou un installeur
  • Aucun droit d'administrateur pour consulter
  • Ne contacte jamais Internet
La fenêtre avec cinq entrées sélectionnées et le plan de leur démarrage affiché au-dessus de la liste : cinq étapes, une remarque indiquant que deux d'entre elles sont déjà dans cet état, une ligne bws start pour chaque entrée et le bouton Start 5 entries.
Des entrées sélectionnées, un plan affiché avant que quoi que ce soit n'arrive, et la ligne bws qui demande exactement la même chose. Le programme parle anglais - la fenêtre lit un fichier de langue placé à côté d'elle, une traduction est donc possible sans recompilation.
Une demi-minute avec l'outil

À quoi ça ressemble à l'usage

Une vraie session, sur un Windows installé en polonais - les noms affichés viennent de Windows, ils sont donc dans sa langue. La fenêtre elle-même parle anglais.

Quatre entrées sélectionnées et le plan de leur démarrage, un redémarrage forcé du Local Session Manager dont le plan avertit que la machine ne fonctionne pas sans lui et demande son nom avant que le bouton agisse, les questions de départ sous le champ de recherche vide, et le spouleur d'impression trouvé en tapant une partie de son nom, puis démarré.
Quatre entrées sélectionnées et le plan de leur démarrage, un redémarrage forcé qui demande le nom d'un service dont la machine a besoin, les questions sous un champ de recherche vide, et le spouleur d'impression trouvé en tapant puis démarré.
L'écran d'accueil : trois cartes de chiffres sur cette machine - les services en cours d'exécution, les services à démarrage automatique qui ne se sont pas lancés, et les services à démarrage automatique dont le fichier a disparu - et un bouton Show the list.
Elle s'ouvre sur quelques chiffres concernant cette machine. Chacun est une question - cliquez dessus et la question va dans le champ de recherche.
La liste des services avec les trois listes au-dessus du champ de recherche, un champ de recherche vide, les boutons de filtre ouverts en lignes pour l'état, le type de démarrage, la signature, les désaccords et les déclencheurs, et la liste en dessous.
Les boutons de filtre écrivent dans le champ de recherche, de sorte que ce sur quoi vous avez cliqué est une requête que vous pouvez lire et modifier.
Pourquoi cet outil existe

services.msc a à peine changé depuis Windows 2000

Les administrateurs y passent des heures chaque semaine à se heurter aux mêmes murs.

  • Pas de recherche. Le seul moyen de naviguer est de sauter à la première lettre d'un nom affiché.
  • Pas de filtrage. Impossible de demander montre-moi ce qui est réglé pour démarrer automatiquement et ne tourne pas.
  • Une ligne à la fois. Redémarrer douze services, c'est douze clics droits et douze attentes.
  • « Arrêt en cours... » pour toujours, sans autre issue que le Gestionnaire des tâches et une devinette sur le processus.
  • Pas d'historique. Personne ne sait qui a réglé ce type de démarrage sur Désactivé, ni quand.
  • Des données cachées. Le processus, les déclencheurs, les privilèges, le descripteur de sécurité, qui a signé l'exécutable - tout cela demande sc.exe de mémoire, ou le Registre.
  • Pas d'équivalent en ligne de commande. sc.exe a une syntaxe des années quatre-vingt-dix, et le Get-Service fourni avec Windows, dans Windows PowerShell 5.1, n'affiche pas le compte sous lequel un service s'exécute, encore moins sa description. PowerShell 7 affiche les deux et s'installe séparément.

Les autres outils n'en règlent chacun qu'une partie

Process Hacker et System Informer affichent une liste riche et peuvent tuer un processus de force, mais n'ont ni audit ni ligne de commande. sc.exe et PsService peuvent tout faire et ne vous disent rien. Les cmdlets *-Service de PowerShell sont scriptables et superficielles.

Personne ne combine une liste où l'on peut chercher, un aperçu avant chaque changement et une trace de ce qui a changé au fil du temps - et cette trace est la raison de garder cet outil sur une machine après le premier après-midi.

La comparaison complète
Ce qu'il fait

Une fenêtre et une ligne de commande sur un seul moteur

Demander, au lieu de faire défiler

start:auto !status:running veut dire ce qui devrait tourner et ne tourne pas. Un seul langage, dans le champ de recherche et dans bws list --query, avec les champs proposés pendant la saisie.

Montrer le plan avant que quoi que ce soit n'arrive

Chaque arrêt, démarrage, redémarrage et changement de type de démarrage est prévisualisé avec les services qu'il entraîne dans sa chute, et l'aperçu est ce qui s'exécute.

Dire ce qui a dérivé, et qui l'a changé

bws snapshot create fige la machine dans un fichier, et bws snapshot diff dit ce qui a changé depuis, la configuration à part de ce qui a simplement démarré ou s'est arrêté. bws history dit, d'après le journal Système, qui a changé un type de démarrage et qui a installé un service. La fenêtre fait les trois sous Audit....

Réparer un problème courant en un clic

L'onglet Tools et bws tool fix redémarrent le service derrière une imprimante qui n'imprime pas, un son disparu ou une recherche bloquée, avec ce qui en dépend, par le même plan que tout le reste.

Arrêter un service qui ne s'arrête pas

Il demande poliment d'abord et ne termine le processus que si cela échoue, en nommant chaque autre service qui y vit.

Montrer ce que services.msc cache

Qui a signé l'exécutable et si Windows lui fait confiance, les déclencheurs, les privilèges, le descripteur de sécurité, le processus et sa mémoire. En colonnes, et comme critères de recherche.

Dire quand il n'a pas pu lire quelque chose

Un champ qu'il n'a pas pu lire est signalé comme non lu, jamais affiché comme vide. Un instantané pris sans droits d'administrateur le dit dans le fichier lui-même.

S'intégrer aux scripts

--json sur chaque commande, un code de sortie pour chaque fin, et 5 quand une comparaison trouve une dérive.

Tourner depuis un seul fichier, hors ligne

Décompressez et lancez, ou installez-le pour toute la machine. Aucun .NET à installer, et il ne contacte jamais Internet. Consulter ne demande aucun droit d'administrateur. GPL-3.0.

Ce que services.msc n'a jamais fait

Ce qui a changé depuis hier

Un instantané est la machine entière à un moment donné - chaque service et chaque pilote, avec son type de démarrage, son compte, son chemin de lancement, le hachage et le signataire de son fichier, ses dépendances, ses déclencheurs, ses privilèges et son descripteur de sécurité. C'est du JSON avec un champ par ligne, il entre donc dans un dépôt et git diff le lit.

$ 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 - le type de démarrage qui a changé est la ligne à lire.
  • Ce qui n'a pas pu être comparé est listé, pas caché. Un champ qu'un instantané n'a jamais lu ressort comme not compared, de sorte qu'une comparaison qui dit rien n'a changé signifie que rien n'a changé dans ce que les deux côtés pouvaient voir.
  • --exit-code se termine par 5 quand la configuration diffère, de sorte qu'une tâche planifiée peut prendre un instantané au déploiement et alerter quelqu'un la première nuit où la machine dérive.
  • Deux machines, deux fichiers. Prenez un instantané en préproduction et un en production, et comparez-les n'importe où.
Comment fonctionnent les instantanés et la dérive
Rien n'arrive sans plan

L'aperçu est l'exécution

Toute opération qui écrit construit d'abord un plan, et ce même plan est l'aperçu, la cascade des services dépendants, le refus avant que vous validiez quoi que ce soit, la ligne de commande qui demande la même chose, et le chemin du retour ensuite.

$ bws stop Winmgmt --dry-run --dependents
Plan: stop Winmgmt  (2 steps)
  1. stop  vmms      (would break otherwise)
  2. stop  Winmgmt   (asked for)

Warnings:
  - Stopping Winmgmt also stops one other entry: vmms
  - Winmgmt starts automatically, so it will be back after the next restart.
  • Lancez-le sans --dry-run et ce sont ces étapes, dans cet ordre, avec les mêmes raisons à côté. Il n'y a pas de second chemin de code pour la vraie exécution.
  • Ce qui tombe avec lui est dans le plan. Les services qui cesseraient de fonctionner sont des étapes à part entière, et un plan qui arrêterait quelque chose dont la machine a besoin le dit dans ses avertissements.
  • Un refus vient avant le bouton. Un pilote, un service pour lequel le gestionnaire n'accepte pas d'arrêt, un processus que le système protège - refusés à la construction du plan, avec la raison. La fenêtre grise le bouton et dit pourquoi à côté.
  • L'arrêt forcé se fait en deux étapes, et la seconde est conditionnelle. bws kill demande au service de s'arrêter et ne termine son processus que si cela ne marche pas, en nommant chaque autre service qui y vit.
Quand un service ne s'arrête pas
Deux minutes avec l'outil

Depuis la ligne de commande

Le même moteur que la fenêtre, pour les scripts, les tâches planifiées et la CI. Les données vont sur la sortie standard et tout le reste sur l'erreur standard, de sorte que bws list --json | jq fonctionne et qu'un avertissement n'atterrit jamais dans votre JSON.

bws list --query "start:auto !status:running"     ce qui devrait tourner et ne tourne pas
bws list --query "file:missing"                   les services dont l'exécutable a disparu
bws list --query "signed:no peruser:no"           non signés, sans les copies par session
bws show Spooler                                  tout ce qu'on sait d'une entrée
bws stop Winmgmt --dry-run --dependents           ce que son arrêt entraînerait
bws kill Spooler --dry-run                        ce que la fin de son processus emporterait
bws start-type Spooler manual --dry-run           ce que ferait le retrait du démarrage automatique
bws snapshot create before.json                   figer la machine avant un changement
bws snapshot diff before.json --live --exit-code  ce qui a changé depuis, 5 si la configuration a changé
bws history Spooler                               qui a changé son type de démarrage, et quand
bws tool fix printer --dry-run                    ce que ferait la réparation rapide d'une imprimante bloquée
Chaque commande, option et code de sortie
Se le procurer

Décompresser et lancer, ou installer

Windows 10 1809 ou Windows Server 2019 et ultérieurs, 64 bits. Les archives n'ont pas besoin d'installeur et n'écrivent rien dans le Registre, et consulter ne demande aucun droit d'administrateur. Modifier quoi que ce soit demande une session avec élévation, et les deux moitiés le disent au lieu d'échouer en silence - la fenêtre propose Restart as admin.

FichierCe que c'est
BetterWindowsServices-win-x64.zipLa fenêtre, un exécutable autonome - aucun .NET à installer
bws-cli-win-x64.zipLa ligne de commande, un exécutable autonome, pour les scripts et la CI
BetterWindowsServices-win-x64.msiL'installeur : les deux programmes pour chaque compte de la machine, la fenêtre dans le menu Démarrer et bws dans le PATH

Les exécutables portent une signature Authenticode, de sorte que Windows nomme l'éditeur au lieu d'avertir d'un éditeur inconnu.