Reference příkazového řádku
Každý příkaz, každý přepínač a každý návratový kód bws, verze 0.5.0. Směrodatná je bws --help a ta je delší - tato stránka je tentýž povrch, rozložený tak, aby se dal číst.
Příkazy
Jedenáct příkazů. snapshot je podstatné jméno a za sebou bere slovo. tool je také podstatné jméno a samotné vypíše nástroje.
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
Špatně napsaný příkaz dostane nabídku toho, který jste pravděpodobně měli na mysli, a běh skončí kódem 2, místo aby udělal něco blízkého tomu, co jste chtěli.
$ bws lst
There is no command lst. Did you mean list?
Co dělá který příkaz
list a show
list je celý stroj, zúžený pomocí --query. show je jedna položka se vším, co je o ní známo - podpis, privilegia, popisovač zabezpečení a paměť, vše čtené pokaždé, protože u jedné položky to stojí asi šedesát milisekund, zatímco u celého stroje vteřinu. Pole, která jsou opravdu prázdná, se vynechají, pokud nezadáte --full. Pole, které nikdo nemohl přečíst, se vypíše vždy, protože jeho vynechání by vypadalo jako odpověď.
stop, start a restart
Každý sestaví plán a provede ho. --dry-run vypíše plán a nic nezmění, --dependents do něj zařadí služby, které by se rozbily, jako samostatné kroky a --timeout říká, jak dlouho smí jeden krok zůstat bez pokroku. Ovladače se odmítají, ne zkoušejí, protože zastavení ovladače jádra často nelze vrátit bez restartu.
kill - pro službu, která se nechce zastavit
Požádá službu o zastavení a proces za ní ukončí, jen když to nezabere, takže položka, která se zastaví sama, se nikdy neukončí. Ukončení procesu vezme s sebou každou další službu žijící v tomto procesu, ať se předtím zastavila, nebo ne, a náhled je pojmenuje a pojmenuje proces číslem. --force přeskočí zdvořilý krok a náhled pak ukazuje jeden krok místo dvou. --restart potom všechno vrátí.
Windows tuto myšlenku píše jinak. --force u Stop-Service znamená "i když na tom něco závisí", což je to, co zde dělá --dependents. Proto je tohle samostatný příkaz, a ne přepínač u stop.
start-type - nastavení, ne pohyb
Říká, co správce udělá s položkou při příštím startu, a bez --stop nic nepřesouvá: běžící položka běží dál, zastavená zůstane zastavená a plán to říká. disabled je ten, u kterého se vyplatí zastavit, protože správci zabrání položku vůbec spustit, včetně spuštění na vyžádání kvůli něčemu jinému, co ji potřebuje. delayed je automatické, spuštěné o něco později než ostatní automatické položky - slovo, na které se v dotazu ptá start:delayed - a Windows je odmítne u položky ve skupině pořadí načítání, což plán řekne dřív, než se cokoli stane. Každý ze čtyř zapíše, zda položka startuje pozdě, stejně jako sc.exe. --stop, jen vedle disabled, zastaví položku ve stejném plánu, jakmile je nastavení zapsáno.
snapshot create a snapshot diff
create vždy čte podpisy a hashe, protože snímek se uchovává a porovnává později a snímek bez nich by se při porovnání se snímkem s nimi tvářil, jako by se stroj změnil. diff říká, co se změnilo od prvního souboru ke druhému, nebo od souboru k tomuto stroji s --live. Stránka o snímcích má formát a úvahy za ním.
history - kdo to změnil, ze systémového protokolu
Změny typu spouštění a instalace ze systémového protokolu, nejnovější první, s účtem, který Windows zaznamenal. První řádek říká, jak daleko protokol sahá a zda byl vymazán, protože historie je tak dlouhá jako protokol. S názvem jde o změny typu spouštění dané služby - instalace se vypisují jen bez názvu, protože Windows zaznamenává instalaci pod zobrazovaným názvem a nikdy pod názvem služby. Účet se jmenuje tam, kde ho tento stroj umí pojmenovat sám, a jinak se ukáže jako jeho SID, a typy spouštění přicházejí slovy, jak je Windows zapsal.
tool - hotové odpovědi na běžné problémy
Tytéž nástroje, které okno ukazuje na kartě Tools. bws tool je vypíše a bws tool fix vypíše rychlé opravy: printer, sound, indexing a search, každá je restart jedné služby Windows spolu s tím, co na ní závisí, zvolená proto, že ji navrhují vlastní stránky Microsoftu k řešení potíží. bws tool fix printer je přesně bws restart Spooler --dependents - týž plán, týž výstup a tytéž návratové kódy - a jako každý zdejší příkaz, který něco mění, se předem neptá, takže --dry-run je způsob, jak se podívat, než se spustí.
license - co je uvnitř staženého souboru
Nečte vůbec nic - žádného správce služeb, žádný disk, žádnou síť - a odpovídá z registru zkompilovaného do spustitelného souboru. --components změní upozornění na každou součást s její verzí, licencí a původem. Stejná sada, jakou nese soupis součástí zveřejněný vedle stažení, protože oba vznikají z jednoho registru, a důvod, proč za to stojí: program je jeden samostatný soubor, takže vedle něj není nic, co by mohl skener číst.
Příklady
Níže uvedené plány byly ověřeny pomocí --dry-run proti programu, který tato stránka popisuje. Příkaz, který něco mění, se předem neptá, takže --dry-run je způsob, jak se podívat, než se spustí. Spooler zastupuje libovolnou službu - dosaďte název té své.
Najít a přečíst
bws list každá služba a ovladač na tomto stroji
bws list --query "start:auto !status:running" co by mělo běžet a neběží
bws list --query "status:running" --memory co používá proces každé běžící položky
bws show Spooler všechno, co je o jedné položce známo
bws show Spooler --full i pole, která jsou opravdu prázdná
Nejdřív se podívat, potom změnit
bws restart Spooler --dry-run plán a nic jiného
bws restart Spooler --dependents restartovat spolu s tím, co na ní závisí
bws stop Spooler --dependents --timeout 120 povolit dvě minuty na krok bez pokroku
bws start-type WSearch delayed --dry-run spustit o něco později než ostatní automatické položky
bws start-type Spooler disabled --stop zakázat a zastavit v jednom plánu
Služba, která se nechce zastavit
bws kill Spooler --dry-run proces a každá služba, která v něm žije
bws kill Spooler --restart ukončit proces, jen když zastavení selže, potom vše vrátit
bws kill Spooler --force --dry-run jeden krok místo dvou: proces ukončen hned
Snímky a drift
bws snapshot create before.json --note "before the patch" zmrazit stroj s poznámkou uloženou uvnitř
bws snapshot diff before.json after.json dva soubory - dva dny, nebo dva stroje
bws snapshot diff before.json --live soubor proti tomuto stroji, jaký je teď
bws snapshot diff before.json --live --exit-code totéž, skončí kódem 5, pokud se konfigurace odchýlila
Kdo to změnil
bws history každá změna typu spouštění a instalace, kterou systémový protokol obsahuje
bws history Spooler změny typu spouštění jedné služby
bws history --json totéž jako dokument, s protokolem a změnami
Rychlé opravy
bws tool nástroje, které existují
bws tool fix rychlé opravy a služba za každou z nich
bws tool fix sound --dry-run plán restartu dvou zvukových služeb
bws tool fix printer restartovat Print Spooler s tím, co na něm závisí
Co je uvnitř souboru
bws license --components každá součást, její verze, licence a původ
bws --version verze tohoto spustitelného souboru
Ve skriptu PowerShellu
# položky, které by měly běžet a neběží, jako objekty
bws list --query "start:auto !status:running" --json | ConvertFrom-Json | Select-Object serviceName, displayName, status
# nepodepsané soubory do tabulky
bws list --query "signed:no" --json | ConvertFrom-Json | Select-Object serviceName, binaryPath | Export-Csv unsigned.csv -NoTypeInformation
# co jedna služba potřebuje
(bws show Spooler --json | ConvertFrom-Json).dependsOn
# noční kontrola, která větví podle návratového kódu
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" }
}
V cmd a dávkovém souboru
rem druhý příkaz jen když první neskončil čistě
bws restart Spooler || echo the restart did not end cleanly
rem v dávkovém souboru se zapnutým zpožděným rozvinutím potřebuje ! stříšku
bws list --query "start:auto ^!status:running"
Přepínače
18 jich je. Třetí sloupec jsou příkazy, ke kterým každý patří - přepínač předaný příkazu, který pro něj nemá využití, je chyba s tímto seznamem uvnitř, a ne tiše ignorovaný příznak.
| Přepínač | Co dělá | Kde funguje |
|---|---|---|
--query | Zúží výpis pomocí dotazovacího jazyka. | list |
--signatures | Přečte, kdo podepsal každý spustitelný soubor a jestli mu Windows důvěřuje. Na celém stroji několik sekund, takže je vypnuto, pokud se o to nepožádá - a dotaz na podpisy to zapne sám. | list |
--memory | Přečte, co používá proces každé běžící položky. Ve výchozím stavu vypnuto, protože jde o měření, ne o nastavení: o vteřinu později je jiné. | list |
--required-by | Přečte, které položky se rozbijí, když se jedna zastaví, zeptáním přímo Windows, a ne odvozením z toho, co všechno deklaruje. Jedno volání na položku, takže vypnuto, pokud se o to nepožádá. show a snapshot create to čtou pokaždé. | list |
--follow-network | Nechá nástroj vůbec sáhnout mimo tento stroj - cesta ke spuštění ležící na cizí sdílené složce a certifikát, který tento stroj ještě nemá. Ve výchozím stavu vypnuto z bezpečnostních důvodů: jedna nedostupná sdílená složka stojí jedenadvacet sekund a ověřuje se jako ten, kdo nástroj spustil, a stažení certifikátu je spojení s třetí stranou uprostřed běžného výpisu. Bez tohoto přepínače se podpis kontroluje proti tomu, co je zde, a výsledek, který mohlo způsobit nehledání, se hlásí jako nepřečtený, a ne jako verdikt. | list, show, snapshot create |
--force | U kill ukončí proces hned, bez zdvořilého ptaní - náhled pak ukazuje jeden krok místo dvou. U snapshot create nahradí již existující snímek - soubor, který snímkem není, se nikdy nenahradí. | snapshot create, kill |
--restart | U kill vrátí položku zpět, jakmile je proces pryč, spolu se vším, co ho sdílelo. | kill |
--stop | U start-type a jen vedle disabled zastaví položku ve stejném plánu, jakmile je nastavení zapsáno. Typ spouštění mění příští start a nic teď, takže bez tohoto přepínače běžící položka nastavená na disabled běží dál. | start-type |
--full | U show vypíše i pole, která jsou opravdu prázdná. Pole, které nikdo nemohl přečíst, se vypíše vždy. | show |
--json | Stejný dokument, strojově čitelný, na standardním výstupu. | list, show, stop, start, restart, start-type, snapshot create, snapshot diff, kill, history, tool fix NAME |
--note | K čemu byl snímek pořízen, uloženo uvnitř souboru. | snapshot create |
--exit-code | Skončí kódem 5, když se konfigurace liší - položka přidána nebo odebrána, nebo nastavená jinak. Samotný stav běhu se nepočítá. Ve výchozím stavu vypnuto, aby skript, který chce jen vypsat rozdíly, nezakopl o to, že nějaké našel. | snapshot diff |
--live | Porovná soubor s tímto strojem, jaký je teď, místo s druhým souborem. | snapshot diff |
--timing | Jak dlouho trvala každá část čtení, na standardním chybovém výstupu. | list, show, stop, start, restart, start-type, snapshot create, snapshot diff, kill, history, tool fix NAME |
--dry-run | Vypíše plán a nic nezmění. Je to týž plán, který provedení spustí - pro skutečné provedení neexistuje druhá cesta v kódu. | stop, start, restart, start-type, kill, tool fix NAME |
--dependents | Zařadí do plánu služby, které by se rozbily, jako samostatné kroky. | stop, restart, kill |
--timeout | Jak dlouho smí jeden krok zůstat bez pokroku, než se vzdá, počítáno znovu při každém hlášení pokroku služby. Šedesát sekund, pokud neřeknete jinak. Služba, která pokrok neustále hlásí, je sledována, jak dlouho je potřeba. Vypršení je konec sledování, ne selhání, a hlášení říká, kde položka zůstala. | stop, start, restart, kill, tool fix NAME |
--components | U license změní upozornění na každou součást uvnitř tohoto spustitelného souboru s její verzí, licencí a původem. Stejná sada, jakou nese soupis součástí zveřejněný vedle stažení, protože oba vznikají z jednoho registru. | license |
Návratové kódy
6 konců a každý je pro skript jiná věc, kterou udělat. Data jdou na standardní výstup a všechno ostatní na standardní chybový výstup, takže bws list --json | jq funguje a varování nikdy nepřistane ve vašem JSONu.
Každý dokument JSON je čisté ASCII: písmeno mimo něj se zapíše jako šestiznakový escape, který každý čtecí program JSON převede zpět na písmeno, takže bws list --json > file.json je platné UTF-8 a | ConvertFrom-Json to přečte správně, ať je konzole nastavena na jakoukoli kódovou stránku. V textu, který čte člověk, se znak, který by terminál posunul, místo aby se vytiskl - tabulátor, zalomení řádku, escape sekvence, přepsání směru - ukáže jako svůj kódový bod, <U+001B>.
-- ukončuje přepínače, takže službu, jejíž název začíná pomlčkou, lze přesto pojmenovat: bws show -- -odd. Příkazové řádky, které vám nástroj dává, jsou psané pro PowerShell: název s mezerou jde do dvojitých uvozovek, což cmd čte stejně, a název, který by PowerShell uvnitř nich rozvinul, například MSSQL$SQLEXPRESS, jde do jednoduchých uvozovek.
| Kód | Význam |
|---|---|
0 | Hotovo a všechno dorazilo tam, kam mělo. |
1 | Nástroj selhal - nemohl udělat, co se po něm chtělo, z důvodu, který se týká nástroje, a ne plánu. |
2 | Příkazový řádek byl chybný. Při překlepu v příkazu se nabídne ten, který jste pravděpodobně měli na mysli. |
3 | Plán byl dobrý, proběhl a něco v něm nedorazilo tam, kam mělo - správce odmítl, nebo relace na to neměla práva. |
4 | Někdo běh zastavil ručně. Nenulový, i když každý krok ještě dorazil, aby obalový skript nepovažoval přerušený běh za čistý. |
5 | Porovnání proběhlo a zjistilo, že se konfigurace odchýlila - položka přidána nebo odebrána, nebo nastavená jinak. Samotný stav běhu drift není. Jen s --exit-code, protože drift je to, co tento nástroj má nacházet, a jeho nalezení není selhání. |
Ctrl+C má tři úrovně, každá říká, co stojí ta další. První přestane postupovat vpřed a stále vrátí, co bylo odebráno, druhá nechá věci tak, jak jsou, a stále vytiskne zprávu, třetí proces ukončí. Běh zastavený ručně končí kódem 4, i když každý krok ještě dorazil.
Zavření okna konzole se počítá jako první Ctrl+C. Windows pak programu dává pět sekund a v nich tento přestane postupovat vpřed a vrátí, co shodil. Odhlášení a vypnutí ho ukončí bez jakéhokoli varování, na které by mohl reagovat, a přerušená vzdálená relace možná také.
V naplánované úloze
Tvar, pro který byl tento nástroj vytvořen: zmrazit stroj, když je prokazatelně v pořádku, a pak se každou noc ptát, zda stále je.
# den, kdy stroj jde do provozu
bws snapshot create C:\baselines\web01.json --note "after the build"
# každou noc z naplánované úlohy
bws snapshot diff C:\baselines\web01.json --live --exit-code --json > C:\logs\drift.json
# 0 - žádný drift konfigurace
# 5 - konfigurace se odchýlila a drift.json říká co
# 3 - proběhlo to a nešlo přečíst všechno, takže odpověď je částečná
Okno je druhá polovina téhož jádra: BetterWindowsServices-win-x64.zip ho obsahuje a stránka ke stažení říká, co který archiv je.
Argument okna
BetterWindowsServices.exe bere jeden argument určený člověku: --catalogue otevře vývojářský list zobrazující každou součást okna v každém stavu a nic nečte z vašeho stroje. Druhý, --carry, je způsob, jak okno předá to, co zobrazovalo, vlastní kopii, kterou restartuje jako správce. Nikdo ho nepíše a cokoli v něm, co by toto okno nemohlo napsat, se odmítne.