Язык запросов

Задайте машине вопрос

Один язык, в поле поиска окна и в 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, который кто-то изменил после подписания.

Справочник командной строки