Мова запитів

Поставте машині запитання

Одна мова, у полі пошуку вікна й у bws list --query. Просте слово шукає в імені, відображуваному імені, обліковому записі та шляху запуску. Поле звужує пошук. Полів: 21, і той самий текст означає те саме в обох половинах інструмента.

Шість, що відповідають на справжнє запитання

Що має працювати й не працює

start:auto !status:running

Перший запит, який пише більшість людей, і той, на який services.msc не відповідає взагалі.

Служби, чий файл зник

file:missing

Запис, що вказує на виконуваний файл, якого немає на диску. Зазвичай це видалення, що залишило реєстрацію.

Непідписані, без шуму сеансів

signed:no peruser:no

Сімейства для кожного користувача створюють копію на сеанс і заповнюють список майже однаковими записами. Цей запит питає про решту.

Працює, хоча вимкнено

mismatch:running

Конфігурація й стан, що розходяться: запис, який диспетчер налаштовано ніколи не запускати, а він усе одно працює.

Усе, що просить права налагодження

privilege:SeDebugPrivilege

Привілей, що дозволяє процесу відкрити будь-який інший. Варто знати, які служби його просять.

Що інструмент не зміг прочитати

account:?

Записи, де цей сеанс не зміг прочитати обліковий запис. Запитання, якого services.msc навіть не вміє поставити.

Як пишеться запит

Терміни

  • Терміни розділяються пробілами, і всі вони мають збігатися - ключового слова and немає, бо нічого іншого воно не могло б означати.
  • Те саме поле, написане двічі, - єдиний виняток: status:running status:stopped означає будь-яке з двох, бо саме це записує позначення двох фільтрів. Дві межі числа все одно звужують - pid:>1000 pid:<2000 це діапазон між ними.
  • ! перед терміном заперечує його: !status:running. У пакетному файлі з setlocal EnableDelayedExpansion cmd без жодного слова з'їдає цей !, і запит мовчки означає щось інше - пишіть там ^! усередині лапок.
  • Кома всередині поля означає або: start:manual,disabled.
  • Лапки захищають усе з пробілами чи двокрапками: account:"NT SERVICE\McmSvc".
  • Шлях, вставлений як є, - C:\Windows\System32\svchost.exe - шукається, а не читається як поле з назвою C.

Як зіставляється текст

  • name:spool збігається з усім, що це містить - це типова поведінка, бо саме цього люди чекають від поля пошуку.
  • name:=spooler - точний збіг.
  • name:spool* приймає шаблони, * і ?.
  • name:/^Sql.*/ - регулярний вираз, і всередині скісних рисок він пишеться так, як пишуться регулярні вирази: \?, \\ і кома означають те, що означають там. Скісна риска, що ніколи не закривається, - помилка: щоб шукати саму скісну риску, пишіть \/ або беріть лапки.
  • Регістр ігнорується, зокрема й поза ASCII - відображуване ім'я польською чи грецькою збігається, як би його не набрали.

Три слова, які приймає кожне поле

  • any - значення є, яким би воно не було
  • none - значення справді немає - у запису його немає
  • ? - інструмент не зміг прочитати це поле або не читав його, а це запитання, яке services.msc навіть не може поставити

Помилково набране значення - це помилка, а не порожній результат. status:runing відповідає Did you mean running? і завершується кодом 2. Порожній список виглядав би як відповідь, а різниця між «нічого не збігається» й «ви набрали неправильно» - це різниця між чистою машиною та аудитом, що нічого не довів. Запит, який нічого б не звузив, відхиляється і в командному рядку, тож скрипт не діє на всю машину через одруківку.

Більше прикладів

Кожен працює однаково в полі пошуку вікна й після bws list --query, і кожен був запущений на справжній Windows, перш ніж його тут записали. Що він знаходить, залежить від машини - а для запитання про неприємності порожня відповідь якраз та, якої ви хочете.

Стан і тип запуску

ЗапитЩо він знаходить
status:stopPending,startPendingЗастрягли на зупинці чи запуску - очікування, яке показує оснастка й яке ніколи не закінчується.
start:auto status:stopped trigger:noneНалаштовано на автозапуск, зупинено й не чекає тригера - короткий список, який варто прочитати після перезавантаження.
start:delayedАвтоматичний, запускається трохи пізніше за інші автоматичні записи.
start:manual,disabled status:runningПрацює, хоча його ніщо не запускає під час завантаження - його попросило щось, запустив тригер або хтось.

Облікові записи

ЗапитЩо він знаходить
account:localsystem !publisher:microsoftПрацює від LocalSystem, найпотужнішого облікового запису, з файлу, який Microsoft не підписала. Запит про видавця сам читає підписи, тож це займає кілька секунд.
!account:localsystem,localservice,networkservice type:ownProcess,sharedProcessСлужби, що працюють від будь-якого іншого облікового запису - віртуального, керованого або власного облікового запису людини.
account:"NT SERVICE"Власний віртуальний обліковий запис служби. Лапки тримають слова разом через пробіл.

Файли й підписи

ЗапитЩо він знаходить
signed:notSigned,untrustedRoot,tamperedБез підпису, ланцюжок, якому Windows не довіряє, або файл, змінений після підписання.
signed:trusted !publisher:microsoftПідписано, довірено й не Microsoft - програмне забезпечення, яке на цю машину поставили інші компанії.
type:driver start:boot,system !signed:trustedДрайвери, що завантажуються під час запуску Windows, підпису яких Windows не довіряє. На здоровій машині - жодного.
!path:C:\Windows type:ownProcessСлужба з власним процесом, чий файл лежить поза текою Windows.
path:\AppData\Запущено зсередини чийогось профілю - останнє місце, де чекаєш службу.
path:\System32\\ type:ownProcessЗворотна скісна риска перед пробілом робить пробіл частиною слова, тому шлях, що закінчується зворотною скісною рискою, пишеться з двома, коли після нього йде інший термін. У кінці запиту досить однієї.

Тригери й залежності

ЗапитЩо він знаходить
trigger:device status:stoppedЧекає на появу пристрою, тож зупинена не без причини.
trigger:networkЗапускається, коли запит надходить до мережевої кінцевої точки - порту, іменованого каналу чи інтерфейсу RPC.
trigger:stopЗаписи, які тригер може й зупинити, не лише запустити.
dependson:WinmgmtЗаписи, яким для роботи потрібен WMI.
requiredby:SpoolerУсе, що потрібне Print Spooler для роботи, і те, що потрібне цим у свою чергу.

Привілеї й процеси

ЗапитЩо він знаходить
privilege:SeTcbPrivilegeПросить права діяти як частина операційної системи.
privilege:SeImpersonatePrivilege !account:localsystemМоже діяти від імені клієнта, працюючи від облікового запису, відмінного від LocalSystem.
sidtype:unrestrictedНесе власний SID служби у своєму процесі, тож дозволи можуть називати саме її. sidtype:restricted питає про ті, чий процес ще й обмежений на запис.
type:sharedProcess status:runningПрацює всередині спільного svchost разом з іншими.
memory:>200MBПроцес, що використовує понад 200 МБ. Пам'ять читається сама, коли запит про неї питає.
pid:1000-2000У процесі, чий ідентифікатор між 1000 і 2000.

Імена й текст

ЗапитЩо він знаходить
spoolПросте слово, що шукається в імені, відображуваному імені, обліковому записі та шляху запуску.
name:=wuauservРівно це ім'я, і нічого, що лише його містить.
name:win*Імена, що починаються на win, записані із шаблоном.
name:/svc$/Імена, що закінчуються на svc, записані як регулярний вираз.
description:noneЗовсім без опису, а це більшість драйверів.
description:?Опис, який Windows не зміг передати, зазвичай тому, що він вказує на файл мови, якого немає.
peruser:templateШаблони для кожного користувача, які Windows копіює для кожного сеансу ввійшовшого користувача.

Кожне поле

Побудовано з самої програми, тож ця таблиця не може розійтися з тим, що приймає інструмент. Поле без списку значень приймає текст, число або розмір - третій стовпець каже, що саме.

ПолеПро що питаєЗначення
nameім'я служби, за яким її розпізнає Windowsтекст
displayвідображуване ім'я, як його пише ця Windowsтекст
descriptionщо запис каже про себетекст
typeщо це за записdriver, kernelDriver, fileSystemDriver, ownProcess, sharedProcess, unknown
peruserчи входить вона до одного з сімейств для кожного користувача, копію яких Windows створює на кожен сеансyes, no, template, instance
statusщо вона робить просто заразrunning, stopped, paused, pending, startPending, stopPending, pausePending, continuePending, unknown
startщо диспетчер робить із нею під час наступного завантаженняautomatic, auto, delayed, manual, disabled, boot, system, unknown
accountобліковий запис, від якого вона працює, як його пише диспетчертекст, напр. localsystem
pidпроцес, у якому вона працюєчисло: 1234, >1000, 100-200
triggerумова, що запускає або зупиняє їїdevice, ip, domain, firewall, policy, network, custom, state, aggregate, unknown, start, stop
pathкомандний рядок, який запускає диспетчертекст
fileчи є файл, який вона запускає, на дискуpresent, missing
signedщо Windows думає про підпис файлу, без перевірки відкликанняyes, no, trusted, notSigned, untrustedRoot, expired, revoked, tampered, unknown
publisherхто підписав файл - підтверджено лише довіреним підписомтекст
privilegeпривілей, який просить запистекст, напр. SeDebugPrivilege
dependsonщо потрібно цьому записуім'я служби
requiredbyщо зламається, якщо цей зупинитьсяім'я служби
sidtypeтип SID службиunrestricted, restricted, unknown
sddlдескриптор безпеки у вигляді текстутекст
memoryщо використовує її процесрозмір з одиницею виміру: 500MB, >1GB, 100MB-1GB
mismatchконфігурація і стан, що розходятьсяstopped, running

Дві речі, які варто знати

Деякі поля дорогі, і запит про них вмикає читання

Підписи на всій машині займають кілька секунд, а пам'ять - це вимірювання, а не налаштування, тож жодне з них не читається для списку, поки не попросять. Запит, що згадує одне з них, сам вмикає це читання - вам не треба пам'ятати --signatures на додачу до signed:no. У вікні запит про підписи каже, що відповідь неповна, доки вони не надійдуть, а не показує коротший список, ніби це і є відповідь.

Результат, оцінений за нечитабельним, каже про це

Якщо записи оцінювалися за полем, яке цей сеанс не зміг прочитати, результат несе рядок із кількістю таких - бо в такому результаті можуть бракувати записів або бути зайві. Це те саме правило, якого дотримується весь інструмент: невдале читання видно у відповіді, воно ніколи не проковтується. Видавець отримує те саме поводження, коли його заявляє лише сертифікат: поруч із будь-яким вердиктом, крім trusted, ім'я показується як not verified, а publisher: зараховує запис як непевний в окремому рядку - тож !publisher:microsoft зберігає файл Microsoft, який хтось змінив після підписання.

Довідник командного рядка