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.
| Opzione | Cosa fa | Dove agisce |
|---|---|---|
--query | Restringere l'elenco con il linguaggio di query. | list |
--signatures | Leggere 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 |
--memory | Leggere 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-by | Leggere 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-network | Lasciare 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 |
--force | Su 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 |
--restart | Su kill, rimettere la voce a posto una volta sparito il processo, insieme a tutto ciò che lo condivideva. | kill |
--stop | Su 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 |
--full | Su show, stampare anche i campi davvero vuoti. Un campo che nessuno ha potuto leggere viene stampato comunque. | show |
--json | Lo 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 |
--note | Per cosa è stato preso lo snapshot, conservato dentro il file. | snapshot create |
--exit-code | Terminare 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 |
--live | Confrontare il file con questa macchina com'è adesso, anziché con un secondo file. | snapshot diff |
--timing | Quanto è 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-run | Stampare 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 |
--dependents | Mettere nel piano, come passaggi a sé, i servizi che smetterebbero di funzionare. | stop, restart, kill |
--timeout | Quanto 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 |
--components | Su 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.
| Codice | Significato |
|---|---|
0 | Fatto, e tutto è arrivato dove doveva andare. |
1 | Lo strumento è fallito - non ha potuto fare ciò che gli era stato chiesto, per una ragione che riguarda lo strumento e non il piano. |
2 | La riga di comando era sbagliata. A un comando scritto male viene offerto quello che probabilmente voleva. |
3 | Il 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. |
4 | Qualcuno 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. |
5 | Un 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.