Search your Windows services, preview every change, and see what drifted since yesterday

Better Windows Services is services.msc rebuilt for people who administer Windows machines - a window and a command line over one engine. Ask the machine a question instead of scrolling eight hundred rows. See what a change will do before you press anything. And the part services.msc never had: freeze every service into a file, and a week later ask what changed.

  • Free and open source, GPL-3.0
  • One file, no installer
  • No administrator rights to look
  • Never talks to the internet
A query in the search box, a plan shown before anything happens, and the bws line that asks for exactly the same thing.
Why this exists

services.msc has barely changed since Windows 2000

Administrators spend hours a week in it hitting the same walls.

  • No search. The only navigation is jumping to the first letter of a display name.
  • No filtering. There is no way to ask show me what is set to start automatically and is not running.
  • One row at a time. Restarting twelve services is twelve right-clicks and twelve waits.
  • "Stopping..." forever, with no way out except Task Manager and guessing the process.
  • No history. Nobody knows who set that start type to Disabled, or when.
  • Hidden data. The process, the triggers, the privileges, the security descriptor, who signed the binary - all of it needs sc.exe from memory, or the registry.
  • No command line parity. sc.exe has a syntax from the nineties, and Get-Service does not show the account a service runs as, let alone its description.

The other tools each fix part of it

Process Hacker and System Informer show a rich list and can force a kill, and have no audit and no command line. sc.exe and PsService can do everything and tell you nothing. PowerShell's *-Service cmdlets are scriptable and shallow.

Nobody combines a searchable list, a preview before every change, and a record of what changed over time - and the record is the reason to keep this on a machine after the first afternoon.

The full comparison
What it does

A window and a command line over one engine

Ask, instead of scroll

start:auto !status:running is what should be up and is not. One language, in the search box and in bws list --query, with the fields offered as you type.

Show the plan before anything happens

Every stop, start, restart and start type change is previewed with the services it takes down with it, and the preview is what runs.

Tell you what drifted

bws snapshot create freezes the machine into a file, and bws snapshot diff says what changed since, configuration apart from what merely started or stopped.

Stop a service that will not stop

It asks politely first and ends the process only if that fails, naming every other service that lives in it.

Show what services.msc hides

Who signed the binary and whether Windows trusts it, triggers, privileges, the security descriptor, the process and its memory. As columns, and as things to search on.

Say when it could not read something

A field it could not read is reported as not read, never shown as empty. A snapshot taken without administrator rights says so inside the file.

Fit into scripts

--json on every command, an exit code for every ending, and 5 when a diff finds drift.

Run from one file, offline

No installer, no .NET to install, and it never talks to the internet. Reading needs no administrator rights. GPL-3.0.

The part services.msc never did

What changed since yesterday

A snapshot is the whole machine at one moment - every service and driver, with its start type, account, launch path, the hash and the signer of its file, its dependencies, triggers, privileges and security descriptor. It is JSON with one field per line, so it goes into a repository and git diff reads it.

$ 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.
  • Configuration and running state are reported apart. Two snapshots taken a day apart differ in what happens to be running and almost none of it is drift - the start type that changed is the line to read.
  • What could not be compared is listed, not hidden. A field one snapshot never read comes out as not compared, so a diff that says nothing changed means nothing changed in what both sides could see.
  • --exit-code ends with 5 when anything differs, so a scheduled task can take a snapshot at deployment and page somebody the first night the machine drifts.
  • Two machines, two files. Take a snapshot on staging and one on production, and diff them anywhere.
How snapshots and drift work
Nothing happens without a plan

The preview is the execution

Every operation that writes builds a plan first, and the same plan is the preview, the cascade of dependent services, the refusal before you press anything, the command line that asks for the same thing, and the way back afterwards.

$ 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.
  • Run it without --dry-run and those are the steps, in that order, with the same reasons beside them. There is no second code path for the real thing.
  • What comes down with it is in the plan. The services that would break are steps of their own, and a plan that would take down something the machine needs says so in its warnings.
  • A refusal comes before the button. A driver, a service the manager will not accept a stop for, a process the system protects - refused when the plan is built, with the reason. The window greys the button and says why beside it.
  • Force stop is two steps, and the second is conditional. bws kill asks the service to stop and ends its process only if that does not work, naming every other service living in it.
When a service will not stop
Two minutes with it

From the command line

The same engine as the window, for scripts, scheduled tasks and CI. Data goes to standard output and everything else to standard error, so bws list --json | jq works and a warning never lands in your JSON.

bws list --query "start:auto !status:running"     what should be up and is not
bws list --query "file:missing"                   services whose binary is gone
bws list --query "signed:no peruser:no"           unsigned, without the per-session copies
bws show Spooler                                  everything known about one entry
bws stop Winmgmt --dry-run --dependents           what stopping it would take down
bws kill Spooler --dry-run                        what ending its process would take with it
bws start-type Spooler manual --dry-run           what taking it off automatic would do
bws snapshot create before.json                   freeze the machine before a change
bws snapshot diff before.json --live --exit-code  what has changed since, 5 if anything has
Every command, switch and exit code
Honest limits

What is not there yet

A tool that quietly fails to cover something is worse than one that says what it cannot do. This is an early release - both halves do everything on this page, and an automated suite runs on every commit. The second half of the audit story is still to come.

Snapshots are on the command line only

The window shows, searches and changes, and it does not take or compare snapshots. Use bws snapshot beside it.

No stock Windows baseline

The opening screen has a place for how many of these are not from a clean install and says it is not counted yet rather than showing a number it cannot stand behind.

No change journal, no restore

Who changed a start type, and when, is not read from the event log yet. A diff tells you what drifted, and putting it back is by hand or by script from the commands the diff shows you.

Local machine only

Remote management is not in this version. To compare two machines, take a snapshot on each and diff the two files. Windows only, 64-bit only.

The rest of the limits, and the questions people ask
Get it

Unzip anywhere and run

Windows 10 1809 or Windows Server 2019 and later, 64-bit. No installer, nothing written to the registry, and no administrator rights needed to look. Changing anything needs an elevated session, and both halves say so instead of failing quietly - the window offers Restart as admin.

FileWhat it is
BetterWindowsServices-win-x64.zipThe window, one self-contained executable - no .NET to install
bws-cli-win-x64.zipThe command line, one self-contained executable, for scripts and CI

The executables carry an Authenticode signature, so Windows names the publisher instead of warning about an unknown one.