Задайте машине вопрос
Один язык, в поле поиска окна и в 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 EnableDelayedExpansioncmd молча съедает этот!, и запрос тихо начинает значить другое - напишите там^!внутри кавычек.- Запятая внутри поля значит или:
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, | Застрявшие при остановке или запуске - ожидание, которое показывает оснастка и которое никогда не заканчивается. |
start:auto status:stopped trigger:none | Настроены на автозапуск, остановлены и не ждут триггера - короткий список, который стоит прочитать после перезагрузки. |
start:delayed | Автоматические, запускаемые чуть позже остальных автоматических записей. |
start:manual, | Работают, хотя при загрузке их ничто не запускает: их запросили, их запустил триггер или кто-то. |
Учётные записи
| Запрос | Что находит |
|---|---|
account:localsystem !publisher:microsoft | Работает как LocalSystem, самая сильная учётная запись, из файла, который Microsoft не подписывала. Запрос об издателе сам читает подписи, поэтому занимает несколько секунд. |
!account:localsystem, | Службы, работающие под любой другой учётной записью: виртуальной, управляемой или чьей-то личной. |
account:"NT SERVICE" | Собственная виртуальная учётная запись службы. Кавычки удерживают слова вместе из-за пробела. |
Файлы и подписи
| Запрос | Что находит |
|---|---|
signed:notSigned, | Нет подписи, цепочка, которой Windows не доверяет, или файл, изменённый после подписания. |
signed:trusted !publisher:microsoft | Подписаны, доверенные и не от Microsoft - программы, которые другие компании поставили на эту машину. |
type:driver start:boot, | Драйверы, загружаемые при старте 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, который кто-то изменил после подписания.