Referința liniei de comandă
Fiecare comandă, fiecare opțiune și fiecare cod de ieșire al lui bws, versiunea 0.5.0. Autoritar este bws --help, care este mai lung - această pagină este aceeași suprafață, aranjată pentru a fi citită.
Comenzile
Unsprezece comenzi. snapshot este un substantiv și primește un cuvânt după el. tool este tot un substantiv, iar singur listează instrumentele.
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
O comandă scrisă greșit primește oferta celei pe care probabil ați vrut-o, iar rularea se încheie cu codul 2, în loc să facă ceva apropiat de ce ați cerut.
$ bws lst
There is no command lst. Did you mean list?
Ce face fiecare comandă
list și show
list este toată mașina, restrânsă cu --query. show este o singură intrare cu tot ce se știe despre ea - semnătura, privilegiile, descriptorul de securitate și memoria, toate citite de fiecare dată, pentru că peste o singură intrare asta costă cam șaizeci de milisecunde, în timp ce peste toată mașina costă o secundă. Câmpurile cu adevărat goale sunt omise dacă nu dați --full. Un câmp pe care nimeni nu l-a putut citi este tipărit oricum, pentru că omiterea lui ar arăta ca un răspuns.
stop, start și restart
Fiecare construiește un plan și îl execută. --dry-run tipărește planul și nu schimbă nimic, --dependents pune în el, ca pași de sine stătători, serviciile care s-ar defecta, iar --timeout spune cât timp poate merge un pas fără progres. Driverele sunt refuzate, nu încercate, pentru că oprirea unui driver de nucleu adesea nu se poate anula fără repornire.
kill - pentru un serviciu care nu vrea să se oprească
Cere serviciului să se oprească și încheie procesul din spatele lui doar dacă asta nu funcționează, așa că o intrare care se oprește singură nu este niciodată încheiată. Încheierea unui proces ia cu sine fiecare alt serviciu care trăiește în acel proces, indiferent dacă s-a oprit mai întâi sau nu, iar previzualizarea le numește și numește procesul prin număr. --force sare peste pasul politicos, iar previzualizarea arată atunci un pas în loc de doi. --restart readuce totul după aceea.
Windows scrie această idee altfel. --force la Stop-Service înseamnă "chiar dacă ceva depinde de el", ceea ce face aici --dependents. De aceea aceasta este o comandă proprie și nu o opțiune a lui stop.
start-type - o setare, nu o mișcare
Spune ce va face managerul cu o intrare la următoarea pornire și, fără --stop, nu mută nimic: o intrare care rulează continuă să ruleze, una oprită rămâne oprită, iar planul spune asta. disabled este cea la care merită să vă opriți, pentru că împiedică managerul să pornească intrarea deloc, inclusiv la cerere pentru altceva care are nevoie de ea. delayed este automat, pornit puțin după celelalte intrări automate - cuvântul despre care întreabă start:delayed într-o interogare - iar Windows îl refuză pentru o intrare dintr-un grup de ordine de încărcare, lucru pe care planul îl spune înainte să se întâmple ceva. Fiecare dintre cele patru scrie dacă intrarea pornește târziu, așa cum face sc.exe. --stop, doar alături de disabled, oprește intrarea în același plan după ce setarea este scrisă.
snapshot create și snapshot diff
create citește întotdeauna semnăturile și hash-urile, pentru că un instantaneu este păstrat și comparat mai târziu, iar unul fără ele, comparat cu unul cu ele, ar face să pară că mașina s-a schimbat. diff spune ce s-a schimbat de la primul fișier la al doilea sau de la un fișier la această mașină cu --live. Pagina despre instantanee are formatul și raționamentul.
history - cine a schimbat, din jurnalul System
Schimbările de tip de pornire și instalările din jurnalul System, cele mai noi primele, cu contul pe care Windows l-a înregistrat. Prima linie spune cât de departe ajunge jurnalul și dacă a fost șters, pentru că un istoric este doar cât este de lung jurnalul. Cu un nume, sunt schimbările de tip de pornire ale acelui serviciu - instalările sunt listate doar fără nume, pentru că Windows înregistrează o instalare sub numele afișat și niciodată sub numele serviciului. Un cont este numit acolo unde această mașină îl poate numi singură și arătat ca SID în caz contrar, iar tipurile de pornire vin în cuvintele pe care le-a scris Windows.
tool - răspunsuri gata făcute la probleme frecvente
Aceleași instrumente pe care fereastra le arată în fila Tools. bws tool le listează, iar bws tool fix listează remedierile rapide: printer, sound, indexing și search, fiecare o repornire a unui serviciu Windows împreună cu ce depinde de el, alese pentru că paginile de depanare ale Microsoft însuși o sugerează. bws tool fix printer este exact bws restart Spooler --dependents - același plan, aceeași ieșire și aceleași coduri de ieșire - și, ca orice comandă de aici care schimbă ceva, nu întreabă mai întâi, deci --dry-run este calea de a privi înainte să ruleze.
license - ce se află în fișierul descărcat
Nu citește absolut nimic - niciun manager de servicii, niciun disc, nicio rețea - și răspunde dintr-un registru compilat în executabil. --components transformă mențiunea în fiecare componentă cu versiunea, licența și proveniența ei. Același set pe care îl poartă lista de materiale publicată lângă descărcare, pentru că ambele sunt generate dintr-un singur registru, și motivul pentru care merită: programul este un singur fișier independent, deci nu este nimic lângă el pe care un scaner să-l citească.
Exemple
Planurile de mai jos au fost verificate cu --dry-run pe programul pe care îl descrie această pagină. O comandă care schimbă ceva nu întreabă mai întâi, deci --dry-run este calea de a privi înainte să ruleze. Spooler stă pentru orice serviciu - puneți în loc numele serviciului dumneavoastră.
Găsire și citire
bws list fiecare serviciu și driver de pe această mașină
bws list --query "start:auto !status:running" ce ar trebui să fie pornit și nu este
bws list --query "status:running" --memory ce folosește procesul fiecărei intrări care rulează
bws show Spooler tot ce se știe despre o intrare
bws show Spooler --full și câmpurile care sunt cu adevărat goale
Mai întâi priviți, apoi schimbați
bws restart Spooler --dry-run planul și nimic altceva
bws restart Spooler --dependents repornește-l împreună cu ce depinde de el
bws stop Spooler --dependents --timeout 120 permite două minute pe pas fără progres
bws start-type WSearch delayed --dry-run pornește-l puțin după celelalte intrări automate
bws start-type Spooler disabled --stop dezactivează-l și oprește-l într-un singur plan
Un serviciu care nu vrea să se oprească
bws kill Spooler --dry-run procesul și fiecare serviciu care trăiește în el
bws kill Spooler --restart încheie procesul doar dacă o oprire eșuează, apoi readu totul
bws kill Spooler --force --dry-run un pas în loc de doi: procesul încheiat imediat
Instantanee și derivă
bws snapshot create before.json --note "before the patch" îngheață mașina, cu o notă păstrată în interior
bws snapshot diff before.json after.json două fișiere - două zile sau două mașini
bws snapshot diff before.json --live fișierul față de această mașină așa cum este acum
bws snapshot diff before.json --live --exit-code la fel, încheindu-se cu 5 dacă configurația a derivat
Cine a schimbat
bws history fiecare schimbare de tip de pornire și instalare pe care o conține jurnalul System
bws history Spooler schimbările de tip de pornire ale unui serviciu
bws history --json la fel ca document, cu jurnal și schimbări
Remedieri rapide
bws tool instrumentele care există
bws tool fix remedierile rapide și serviciul din spatele fiecăreia
bws tool fix sound --dry-run planul pentru repornirea celor două servicii audio
bws tool fix printer repornește Print Spooler cu ce depinde de el
Ce se află în fișier
bws license --components fiecare componentă, versiunea, licența și proveniența ei
bws --version versiunea acestui executabil
Într-un script PowerShell
# intrările care ar trebui să fie pornite și nu sunt, ca obiecte
bws list --query "start:auto !status:running" --json | ConvertFrom-Json | Select-Object serviceName, displayName, status
# fișierele nesemnate, într-o foaie de calcul
bws list --query "signed:no" --json | ConvertFrom-Json | Select-Object serviceName, binaryPath | Export-Csv unsigned.csv -NoTypeInformation
# de ce are nevoie un serviciu
(bws show Spooler --json | ConvertFrom-Json).dependsOn
# o verificare nocturnă care ramifică după codul de ieșire
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" }
}
În cmd și într-un fișier batch
rem o a doua comandă doar când prima nu s-a încheiat curat
bws restart Spooler || echo the restart did not end cleanly
rem într-un fișier batch cu expandare întârziată activată, ! are nevoie de semnul ^
bws list --query "start:auto ^!status:running"
Opțiuni
18 la număr. A treia coloană sunt comenzile cărora le aparține fiecare - o opțiune dată unei comenzi care nu are ce face cu ea este o eroare cu acea listă în ea, nu un indicator ignorat în tăcere.
| Opțiune | Ce face | Unde funcționează |
|---|---|---|
--query | Restrânge lista cu limbajul de interogare. | list |
--signatures | Citește cine a semnat fiecare executabil și dacă Windows are încredere în el. Câteva secunde pe o mașină întreagă, deci este dezactivat dacă nu se cere - iar o interogare despre semnături îl pornește singură. | list |
--memory | Citește ce folosește procesul fiecărei intrări care rulează. Dezactivat implicit pentru că este o măsurătoare și nu o setare: o secundă mai târziu este altceva. | list |
--required-by | Citește care intrări se defectează dacă una este oprită, întrebat direct Windows și nu dedus din ce declară toate. Un apel pe intrare, deci dezactivat dacă nu se cere. show și snapshot create îl citesc de fiecare dată. | list |
--follow-network | Lasă instrumentul să iasă deloc în afara acestei mașini - o cale de lansare aflată pe share-ul altcuiva și un certificat pe care această mașină nu îl are deja. Dezactivat implicit pentru siguranță: un share inaccesibil costă douăzeci și una de secunde și se autentifică drept cel care a rulat instrumentul, iar preluarea unui certificat este o conexiune cu o terță parte în mijlocul unei liste obișnuite. Fără el, o semnătură este verificată față de ce este aici, iar un rezultat care ar fi putut fi cauzat de faptul că nu s-a căutat este raportat ca necitit și nu ca verdict. | list, show, snapshot create |
--force | La kill, încheie procesul imediat fără a cere politicos - previzualizarea arată atunci un pas în loc de doi. La snapshot create, înlocuiește un instantaneu care există deja - un fișier care nu este instantaneu nu este înlocuit niciodată. | snapshot create, kill |
--restart | La kill, readuce intrarea după ce procesul a dispărut, împreună cu tot ce l-a împărțit. | kill |
--stop | La start-type, și doar alături de disabled, oprește intrarea în același plan după ce setarea este scrisă. Un tip de pornire schimbă următoarea pornire și nimic acum, deci fără el o intrare care rulează, setată pe disabled, continuă să ruleze. | start-type |
--full | La show, tipărește și câmpurile care sunt cu adevărat goale. Un câmp pe care nimeni nu l-a putut citi este tipărit oricum. | show |
--json | Același document, citibil de mașină, la ieșirea standard. | list, show, stop, start, restart, start-type, snapshot create, snapshot diff, kill, history, tool fix NAME |
--note | Pentru ce a fost făcut instantaneul, păstrat în interiorul fișierului. | snapshot create |
--exit-code | Se încheie cu codul 5 când configurația diferă - o intrare adăugată sau eliminată ori una configurată altfel. Starea de rulare singură nu contează. Dezactivat implicit, ca un script care vrea doar diferențele tipărite să nu fie dat peste cap de faptul că a găsit unele. | snapshot diff |
--live | Compară fișierul cu această mașină așa cum este acum, nu cu un al doilea fișier. | snapshot diff |
--timing | Cât a durat fiecare parte a citirii, la eroarea standard. | list, show, stop, start, restart, start-type, snapshot create, snapshot diff, kill, history, tool fix NAME |
--dry-run | Tipărește planul și nu schimbă nimic. Este același plan pe care îl rulează o execuție - nu există o a doua cale de cod pentru execuția reală. | stop, start, restart, start-type, kill, tool fix NAME |
--dependents | Pune în plan, ca pași de sine stătători, serviciile care s-ar defecta. | stop, restart, kill |
--timeout | Cât timp poate merge un pas fără progres înainte de a fi abandonat, numărat din nou de fiecare dată când serviciul raportează progres. Șaizeci de secunde dacă nu spuneți altfel. Un serviciu care continuă să raporteze progres este urmărit cât este nevoie. Expirarea este sfârșitul urmăririi, nu un eșec, iar raportul spune unde a fost lăsată intrarea. | stop, start, restart, kill, tool fix NAME |
--components | La license, transformă mențiunea în fiecare componentă din acest executabil cu versiunea, licența și proveniența ei. Același set pe care îl poartă lista de materiale publicată lângă descărcare, pentru că ambele sunt generate dintr-un singur registru. | license |
Coduri de ieșire
6 sfârșituri, iar fiecare este un lucru diferit de făcut pentru un script. Datele merg la ieșirea standard și tot restul la eroarea standard, deci bws list --json | jq funcționează, iar un avertisment nu ajunge niciodată în JSON-ul dumneavoastră.
Fiecare document JSON este ASCII simplu: o literă din afara lui este scrisă ca un escape de șase caractere pe care orice cititor JSON îl transformă înapoi în literă, deci bws list --json > file.json este UTF-8 valid, iar | ConvertFrom-Json îl citește corect indiferent de pagina de cod a consolei. În textul pe care îl citește o persoană, un caracter care ar muta terminalul în loc să se tipărească - un tab, o întrerupere de linie, o secvență escape, o suprascriere a direcției - este arătat ca punctul său de cod, <U+001B>.
-- încheie opțiunile, așa că un serviciu al cărui nume începe cu o liniuță poate fi totuși numit: bws show -- -odd. Liniile de comandă pe care vi le dă instrumentul sunt scrise pentru PowerShell: un nume cu spațiu merge între ghilimele duble, pe care cmd le citește la fel, iar un nume pe care PowerShell l-ar expanda înăuntrul lor, precum MSSQL$SQLEXPRESS, merge între ghilimele simple.
| Cod | Semnificație |
|---|---|
0 | Terminat și totul a ajuns unde trebuia. |
1 | Instrumentul a eșuat - nu a putut face ce i s-a cerut, dintr-un motiv care ține de instrument și nu de plan. |
2 | Linia de comandă era greșită. O comandă scrisă greșit primește oferta celei pe care probabil ați vrut-o. |
3 | Planul era bun, a rulat și ceva din el nu a ajuns unde trebuia - managerul a refuzat sau sesiunea nu avea drepturi asupra lui. |
4 | Cineva a oprit rularea cu mâna. Diferit de zero chiar dacă fiecare pas a ajuns, ca un script învelitor să nu trateze o rulare întreruptă drept curată. |
5 | O comparație a rulat și a constatat că configurația a derivat - o intrare adăugată sau eliminată ori una configurată altfel. Starea de rulare singură nu este derivă. Doar cu --exit-code, pentru că deriva este ceea ce acest instrument există să găsească, iar găsirea ei nu este un eșec. |
Ctrl+C are trei niveluri, fiecare spunând ce costă următorul. Primul încetează să meargă înainte și tot pune la loc ce a fost luat, al doilea lasă lucrurile cum sunt și tot tipărește raportul, al treilea încheie procesul. O rulare oprită cu mâna se încheie cu 4 chiar dacă fiecare pas a ajuns.
Închiderea ferestrei consolei contează ca primul Ctrl+C. Windows dă apoi unui program cinci secunde, iar în ele acesta încetează să meargă înainte și pune la loc ce a doborât. Deconectarea și oprirea îl încheie fără niciun avertisment la care ar putea reacționa, iar o sesiune la distanță căzută poate la fel.
Într-o sarcină programată
Forma pentru care a fost construit acest instrument: înghețați mașina când se știe că este bună, apoi întrebați în fiecare noapte dacă încă este.
# ziua în care mașina intră în serviciu
bws snapshot create C:\baselines\web01.json --note "after the build"
# în fiecare noapte, dintr-o sarcină programată
bws snapshot diff C:\baselines\web01.json --live --exit-code --json > C:\logs\drift.json
# 0 - nicio derivă de configurație
# 5 - configurația a derivat, iar drift.json spune ce
# 3 - a rulat și n-a putut citi totul, deci răspunsul este parțial
Fereastra este cealaltă jumătate a aceluiași motor: BetterWindowsServices-win-x64.zip o conține, iar pagina de descărcare spune ce este fiecare arhivă.
Argumentul ferestrei
BetterWindowsServices.exe primește un argument destinat unei persoane: --catalogue deschide o foaie pentru dezvoltatori care arată fiecare componentă a ferestrei în fiecare stare și nu citește nimic de pe mașina dumneavoastră. Un al doilea, --carry, este modul în care o fereastră predă ce afișa copiei sale pe care o repornește ca administrator. Nimeni nu îl tastează, iar orice din el pe care acea fereastră n-ar fi putut să-l scrie este refuzat.