Riferimento

Riferimento della riga di comando

Ogni comando, ogni opzione e ogni codice di uscita di bws, versione 0.5.0. bws --help è la fonte autorevole ed è più lunga - questa pagina è la stessa superficie, disposta per essere letta.

I comandi

Undici comandi. snapshot è un sostantivo e vuole una parola dopo di sé. Anche tool lo è, e da solo elenca gli strumenti.

bws list [--query TEXT] [--signatures] [--memory] [--required-by] [--follow-network] [--json] [--timing]
bws show NAME [--full] [--follow-network] [--json] [--timing]
bws stop|start|restart NAME [--dry-run] [--dependents] [--timeout SECONDS] [--json] [--timing]
bws kill NAME [--force] [--restart] [--dry-run] [--dependents] [--timeout SECONDS] [--json] [--timing]
bws start-type NAME automatic|delayed|manual|disabled [--stop] [--dry-run] [--json] [--timing]
bws snapshot create [FILE] [--note TEXT] [--follow-network] [--force] [--json] [--timing]
bws snapshot diff EARLIER LATER [--exit-code] [--json] [--timing]
bws snapshot diff EARLIER --live [--exit-code] [--json] [--timing]
bws history [NAME] [--json] [--timing]
bws tool
bws tool fix
bws tool fix NAME [--dry-run] [--timeout SECONDS] [--json] [--timing]
bws license [--components]
bws --help
bws --version

A un comando scritto male viene offerto quello che probabilmente voleva, e l'esecuzione termina con il codice 2 invece di fare qualcosa di simile a ciò che ha chiesto.

$ bws lst
There is no command lst. Did you mean list?

Cosa fa ogni comando

list e show

list è l'intera macchina, ristretta da --query. show è una voce con tutto ciò che se ne sa - la firma, i privilegi, il descrittore di sicurezza e la memoria, tutto letto ogni volta, perché su una sola voce costa circa sessanta millisecondi mentre sull'intera macchina costa un secondo. I campi davvero vuoti vengono omessi a meno che passi --full. Un campo che nessuno ha potuto leggere viene stampato comunque, perché ometterlo sembrerebbe una risposta.

stop, start e restart

Ciascuno costruisce un piano e lo esegue. --dry-run stampa il piano e non cambia nulla, --dependents vi inserisce come passaggi a sé i servizi che smetterebbero di funzionare, e --timeout dice quanto può durare un passaggio senza progressi. I driver vengono rifiutati anziché tentati, perché fermare un driver del kernel spesso non è reversibile senza un riavvio.

kill - per un servizio che non si ferma

Chiede al servizio di fermarsi e termina il processo che lo ospita solo se questo non funziona, così una voce che si ferma da sola non viene mai terminata. Terminare un processo porta con sé ogni altro servizio che vive in quel processo, si fosse fermato prima o no, e l'anteprima li nomina e nomina il processo con il suo numero. --force salta il passaggio cortese e l'anteprima mostra allora un passaggio invece di due. --restart rimette tutto a posto dopo.

Windows scrive questa idea in modo diverso. --force su Stop-Service significa "anche se qualcosa ne dipende", che è ciò che qui fa --dependents. Per questo è un comando a sé e non un'opzione di stop.

start-type - un'impostazione, non una mossa

Dice cosa farà il gestore con una voce al prossimo avvio, e senza --stop non muove nulla: una voce in esecuzione continua a girare, una ferma resta ferma, e il piano lo dice. disabled è quella su cui fermarsi, perché impedisce al gestore di avviare la voce del tutto, anche su richiesta per qualcos'altro che ne ha bisogno. delayed è automatico, avviato un poco dopo le altre voci automatiche - la parola su cui start:delayed interroga in una query - e Windows lo rifiuta per una voce in un gruppo di ordine di caricamento, cosa che il piano dice prima che accada qualsiasi cosa. Ciascuno dei quattro scrive se la voce parte in ritardo, come fa sc.exe. --stop, solo accanto a disabled, ferma la voce nello stesso piano una volta scritta l'impostazione.

snapshot create e snapshot diff

create legge sempre firme e hash, perché uno snapshot viene conservato e confrontato dopo, e uno senza di essi confrontato con uno che li ha sarebbe trattato come se la macchina fosse cambiata. diff dice cosa è cambiato passando dal primo file al secondo, o da un file a questa macchina con --live. La pagina degli snapshot ha il formato e il ragionamento.

history - chi l'ha cambiato, dal registro di sistema

Modifiche del tipo di avvio e installazioni dal registro di sistema, le più recenti per prime, con l'account che Windows ha registrato. La prima riga dice fin dove arriva il registro e se è stato cancellato, perché una cronologia è lunga quanto il registro. Con un nome sono le modifiche del tipo di avvio di quel servizio - le installazioni sono elencate solo senza nome, perché Windows registra un'installazione sotto il nome visualizzato e mai sotto il nome del servizio. Un account è nominato dove questa macchina sa nominarlo da sola e mostrato come SID altrimenti, e i tipi di avvio arrivano con le parole che Windows ha scritto.

tool - risposte pronte a problemi comuni

Gli stessi strumenti che la finestra mostra nella sua scheda Tools. bws tool li elenca e bws tool fix elenca le correzioni rapide: printer, sound, indexing e search, ciascuna il riavvio di un servizio Windows insieme a ciò che ne dipende, scelte perché le stesse pagine di risoluzione dei problemi di Microsoft lo suggeriscono. bws tool fix printer è esattamente bws restart Spooler --dependents - lo stesso piano, lo stesso output e gli stessi codici di uscita - e come ogni comando qui che cambia qualcosa non chiede prima, quindi --dry-run è il modo di guardare prima che venga eseguito.

license - cosa c'è dentro il file scaricato

Non legge nulla - né gestore dei servizi, né disco, né rete - e risponde da un registro compilato nell'eseguibile. --components trasforma l'avviso in ogni componente con la sua versione, la sua licenza e la sua provenienza. Lo stesso insieme che porta la distinta dei materiali pubblicata accanto al download, perché entrambe sono prodotte da un unico registro, e il motivo per cui ne vale la pena: il programma è un file autonomo, quindi accanto non c'è nulla che uno scanner possa leggere.

Esempi

I piani qui sotto sono stati verificati con --dry-run sul programma che questa pagina descrive. Un comando che cambia qualcosa non chiede prima, quindi --dry-run è il modo di guardare prima che venga eseguito. Spooler sta per qualsiasi servizio - metta al suo posto il nome del suo.

Trovare e leggere

bws list                                       ogni servizio e driver di questa macchina
bws list --query "start:auto !status:running"  ciò che dovrebbe essere attivo e non lo è
bws list --query "status:running" --memory     cosa usa il processo di ogni voce in esecuzione
bws show Spooler                               tutto ciò che si sa di una voce
bws show Spooler --full                        anche i campi davvero vuoti

Guardare prima, cambiare dopo

bws restart Spooler --dry-run                il piano, e nient'altro
bws restart Spooler --dependents             riavviarlo insieme a ciò che ne dipende
bws stop Spooler --dependents --timeout 120  consentire due minuti per passaggio senza progressi
bws start-type WSearch delayed --dry-run     avviarlo un poco dopo le altre voci automatiche
bws start-type Spooler disabled --stop       disabilitarlo e fermarlo in un unico piano

Un servizio che non si ferma

bws kill Spooler --dry-run          il processo, e ogni servizio che vive al suo interno
bws kill Spooler --restart          terminare il processo solo se un arresto fallisce, poi rimettere tutto a posto
bws kill Spooler --force --dry-run  un passaggio invece di due: il processo terminato subito

Snapshot e deriva

bws snapshot create before.json --note "before the patch"  congelare la macchina, con una nota conservata dentro
bws snapshot diff before.json after.json                   due file - due giorni, o due macchine
bws snapshot diff before.json --live                       il file contro questa macchina com'è adesso
bws snapshot diff before.json --live --exit-code           lo stesso, terminando con 5 se la configurazione è andata alla deriva

Chi l'ha cambiato

bws history          ogni modifica del tipo di avvio e installazione che il registro di sistema contiene
bws history Spooler  le modifiche del tipo di avvio di un servizio
bws history --json   lo stesso come documento, con registro e modifiche

Correzioni rapide

bws tool                      gli strumenti che ci sono
bws tool fix                  le correzioni rapide, e il servizio dietro ciascuna
bws tool fix sound --dry-run  il piano per riavviare i due servizi audio
bws tool fix printer          riavviare lo Spooler di stampa con ciò che ne dipende

Cosa c'è dentro il file

bws license --components  ogni componente, la sua versione, la sua licenza e la sua provenienza
bws --version             la versione di questo eseguibile

In uno script PowerShell

# le voci che dovrebbero essere attive e non lo sono, come oggetti
bws list --query "start:auto !status:running" --json | ConvertFrom-Json | Select-Object serviceName, displayName, status

# i file non firmati, in un foglio di calcolo
bws list --query "signed:no" --json | ConvertFrom-Json | Select-Object serviceName, binaryPath | Export-Csv unsigned.csv -NoTypeInformation

# di cosa ha bisogno un servizio
(bws show Spooler --json | ConvertFrom-Json).dependsOn

# un controllo notturno che si ramifica sul codice di uscita
bws snapshot diff C:\baselines\web01.json --live --exit-code > $null
switch ($LASTEXITCODE) {
  0 { 'no configuration drift' }
  5 { 'the configuration drifted' }
  default { "no clean answer, exit code $LASTEXITCODE" }
}

In cmd e in un file batch

rem un secondo comando solo quando il primo non è terminato in modo pulito
bws restart Spooler || echo the restart did not end cleanly

rem in un file batch con l'espansione ritardata attiva, il ! ha bisogno di un accento circonflesso
bws list --query "start:auto ^!status:running"

Opzioni

18 in tutto. La terza colonna indica i comandi a cui appartiene ciascuna - un'opzione passata a un comando che non sa che farsene è un errore con quell'elenco dentro, anziché un flag ignorato in silenzio.

OpzioneCosa faDove agisce
--queryRestringere l'elenco con il linguaggio di query.list
--signaturesLeggere chi ha firmato ogni eseguibile e se Windows si fida. Parecchi secondi su un'intera macchina, quindi è disattivato se non richiesto - e una query sulle firme lo attiva da sola.list
--memoryLeggere cosa usa il processo di ogni voce in esecuzione. Disattivato per impostazione predefinita perché è una misurazione e non un'impostazione: un secondo dopo è diversa.list
--required-byLeggere quali voci smettono di funzionare se una viene fermata, chiesto direttamente a Windows anziché dedotto da ciò che ognuna dichiara. Una chiamata per voce, quindi disattivato se non richiesto. show e snapshot create lo leggono ogni volta.list
--follow-networkLasciare che lo strumento esca da questa macchina, in qualsiasi modo - un percorso di avvio che vive sulla condivisione di qualcun altro, e un certificato che questa macchina non ha già. Disattivato per impostazione predefinita per sicurezza: una condivisione irraggiungibile costa ventuno secondi e si autentica come chi l'ha eseguito, e recuperare un certificato è una connessione a una terza parte nel mezzo di un normale elenco. Senza di esso una firma viene controllata contro ciò che c'è qui, e un risultato che potrebbe essere causato dal non aver guardato viene segnalato come non letto e non come un verdetto.list, show, snapshot create
--forceSu kill, terminare subito il processo senza chiedere con garbo - l'anteprima mostra allora un passaggio invece di due. Su snapshot create, sostituire uno snapshot già presente - un file che non è uno snapshot non viene mai sostituito.snapshot create, kill
--restartSu kill, rimettere la voce a posto una volta sparito il processo, insieme a tutto ciò che lo condivideva.kill
--stopSu start-type, e solo accanto a disabled, fermare la voce nello stesso piano una volta scritta l'impostazione. Un tipo di avvio cambia il prossimo avvio e nulla adesso, quindi senza di esso una voce in esecuzione impostata su disabilitato continua a girare.start-type
--fullSu show, stampare anche i campi davvero vuoti. Un campo che nessuno ha potuto leggere viene stampato comunque.show
--jsonLo stesso documento, leggibile da una macchina, sullo standard output.list, show, stop, start, restart, start-type, snapshot create, snapshot diff, kill, history, tool fix NAME
--notePer cosa è stato preso lo snapshot, conservato dentro il file.snapshot create
--exit-codeTerminare con il codice 5 quando la configurazione differisce - una voce aggiunta o rimossa, o una impostata diversamente. Lo stato di esecuzione da solo non conta. Disattivato per impostazione predefinita, così uno script che vuole solo le differenze stampate non inciampa nel trovarne.snapshot diff
--liveConfrontare il file con questa macchina com'è adesso, anziché con un secondo file.snapshot diff
--timingQuanto è durata ogni parte della lettura, sullo standard error.list, show, stop, start, restart, start-type, snapshot create, snapshot diff, kill, history, tool fix NAME
--dry-runStampare il piano e non cambiare nulla. È lo stesso piano che esegue un'esecuzione - non esiste un secondo percorso di codice per l'esecuzione vera.stop, start, restart, start-type, kill, tool fix NAME
--dependentsMettere nel piano, come passaggi a sé, i servizi che smetterebbero di funzionare.stop, restart, kill
--timeoutQuanto può durare un passaggio senza progressi prima che venga abbandonato, contato di nuovo ogni volta che il servizio segnala un progresso. Sessanta secondi a meno che si dica altro. Un servizio che continua a segnalare progressi viene osservato per tutto il tempo necessario. Scadere è la fine dell'osservazione e non un fallimento, e il rapporto dice dove è stata lasciata la voce.stop, start, restart, kill, tool fix NAME
--componentsSu license, trasformare l'avviso in ogni componente di questo eseguibile con la sua versione, la sua licenza e la sua provenienza. Lo stesso insieme che porta la distinta dei materiali pubblicata accanto al download, perché entrambe sono prodotte da un unico registro.license

Codici di uscita

6 conclusioni, e ognuna è una cosa diversa che uno script deve fare. I dati vanno sullo standard output e tutto il resto sullo standard error, così bws list --json | jq funziona e un avviso non finisce mai nel suo JSON.

Ogni documento JSON è ASCII puro: una lettera fuori da esso viene scritta come una sequenza di escape di sei caratteri che ogni lettore JSON riconverte nella lettera, così bws list --json > file.json è UTF-8 valido e | ConvertFrom-Json lo legge correttamente qualunque sia la tabella codici della console. Nel testo che una persona legge, un carattere che sposterebbe il terminale invece di stamparsi - una tabulazione, un'interruzione di riga, una sequenza di escape, una sovrascrittura di direzione - viene mostrato come il suo punto di codice, <U+001B>.

-- termina le opzioni, così un servizio il cui nome inizia con un trattino può comunque essere nominato: bws show -- -odd. Le righe di comando che lo strumento Le consegna sono scritte per PowerShell: un nome con uno spazio va tra virgolette doppie, che cmd legge allo stesso modo, e un nome che PowerShell espanderebbe al loro interno, come MSSQL$SQLEXPRESS, va tra virgolette singole.

CodiceSignificato
0Fatto, e tutto è arrivato dove doveva andare.
1Lo strumento è fallito - non ha potuto fare ciò che gli era stato chiesto, per una ragione che riguarda lo strumento e non il piano.
2La riga di comando era sbagliata. A un comando scritto male viene offerto quello che probabilmente voleva.
3Il piano era buono, è stato eseguito, e qualcosa al suo interno non è arrivato dove doveva andare - il gestore ha rifiutato, o la sessione non aveva diritti su di esso.
4Qualcuno ha fermato l'esecuzione a mano. Diverso da zero anche se ogni passaggio era arrivato, così uno script che lo avvolge non tratta un'esecuzione interrotta come pulita.
5Un confronto è stato eseguito e ha trovato la configurazione alla deriva - una voce aggiunta o rimossa, o una impostata diversamente. Lo stato di esecuzione da solo non è deriva. Solo con --exit-code, perché trovare la deriva è ciò per cui serve questo strumento, e trovarla non è un fallimento.

Ctrl+C ha tre livelli, e ciascuno dice quanto costa il successivo. Il primo smette di andare avanti e rimette comunque a posto ciò che era stato preso, il secondo lascia le cose come stanno e stampa comunque il rapporto, il terzo termina il processo. Un'esecuzione fermata a mano termina con 4 anche se ogni passaggio era arrivato.

Chiudere la finestra della console conta come il primo Ctrl+C. Windows dà cinque secondi a un programma dopo di che, e in quelli questo smette di andare avanti e rimette a posto ciò che aveva fermato. Disconnettersi e spegnere lo terminano senza alcun avviso a cui potrebbe reagire, e una sessione remota caduta può fare lo stesso.

In un'attività pianificata

La forma per cui questo strumento è stato costruito: congelare la macchina quando è nota come buona, poi chiedere ogni notte se lo è ancora.

# il giorno in cui la macchina entra in servizio
bws snapshot create C:\baselines\web01.json --note "after the build"

# ogni notte, da un'attività pianificata
bws snapshot diff C:\baselines\web01.json --live --exit-code --json > C:\logs\drift.json
#   0 - nessuna deriva di configurazione
#   5 - la configurazione è andata alla deriva, e drift.json dice come
#   3 - è girato e non ha potuto leggere tutto, quindi la risposta è parziale

La finestra è l'altra metà dello stesso motore: BetterWindowsServices-win-x64.zip la contiene, e la pagina di download dice cos'è ciascun archivio.

L'argomento della finestra

BetterWindowsServices.exe accetta un argomento pensato per una persona: --catalogue apre un foglio per sviluppatori che mostra ogni componente della finestra in ogni stato e non legge nulla dalla sua macchina. Un secondo, --carry, è il modo in cui una finestra passa ciò che mostrava alla copia di sé che riavvia come amministratore. Nessuno lo digita, e tutto ciò che contiene che quella finestra non avrebbe potuto scrivere viene rifiutato.