Файл: Руссинович М., Маргозис А. Утилиты Sysinternals. Справочник администратора 2012.pdf
Добавлен: 29.10.2018
Просмотров: 33019
Скачиваний: 742

Утилиты для работы с процессами и диагностики
Глава 7 257
Handle
Handle — консольная утилита, отображающая информацию об описателях
объектов, имеющихся у процессов системы. Описатели представляют от-
крытые экземпляры базовых объектов операционной системы, с которыми
взаимодействуют приложения, таких как файлы, разделы реестра, прими-
тивы синхронизации и общая память. Утилиту Handle можно использовать
для поиска программ, имеющих открытые файлы или папки, предотвращать
доступ к ним или их удаление из другой программы. Handle можно так-
же использовать для получения списка имен и типов объектов, открытых
определенной программой. Подробнее об описателях объектов см. в разделе
«Описатели» главы 2.
Поскольку основное предназначение утилиты Handle — выявление ис-
пользуемых файлов и папок, при ее запуске без параметров командной стро-
ки отображается список всех описателей файлов и именованных разделов,
занятых процессами. Параметры командной строки позволяют получать
список всех типов объектов, искать объекты по имени, показывать инфор-
мацию только о указанных процессах, отображать счетчики описателей по
типам объектов, отображать сведения об объектах-разделах, имеющих под-
держку файла подкачки, отображать имя пользователя вместе с информаци-
ей об описателях и закрывать открытые описатели (что не рекомендуется).
Заметьте, что при загрузке библиотеки DLL или проецировании файла
другого типа в адресное пространство процесса посредством API LoadLibrary
описатель не добавляется в таблицу описателей процесса. Следовательно,
такие файлы могут использоваться, и их нельзя будет удалить, несмотря на
то, что поиск описателей может ни к чему не привести. Утилита ListDLLs,
о которой говорилось ранее в этой главе, может выявлять библиотеки DLL,
загруженные как исполняемые образы. Больше возможностей предоставля-
ет функция поиска утилиты Process Explorer (гл. 3), позволяющая искать
библиотеки DLL и имена описателей в одной операции и включающая в по-
иск библиотеки DLL, загруженные как данные.
Поиск и получение списка описателей
Синтаксис командной строки для получения списка описателей объекта та-
ков:
handle [-a [-l]] [-p процесс|PID] [[-u] имя_объекта]
Если запустить утилиту без параметров командной строки, она выведет
список всех процессов и все описатели файлов и именованных разделов, за-
нятых этими процессами, разделяя данные о каждом процессе пунктирной
линией. Для каждого процесса отображается имя, PID и имя учетной запи-
си, от имени которой запущен процесс. Далее указываются описатели, при-
надлежащие этому процессу. Значения описателей показаны в шестнадцате-
ричном виде, вместе с типом объекта и именем (если таковое имеется).
SIN_ch_07.indd 257
27.12.2011 14:30:30

258 Часть
II
Работа с утилитами
Описатели файлов кроме обычных файлов могут включать папки, драй-
веры устройств и конечные точки связи. Информация об описателе файла
включает режим совместного использования, установленный при открытии
описателя. Флаги совместного использования заключаются в скобки и мо-
гут быть следующими: R, W и D. Они указывают, что другие вызывающие
стороны (включая другие потоки того же процесса) могут открывать тот же
файл для чтения, записи или удаления, соответственно. Дефис вместо бук-
вы указывает на то, что режим совместного использования не установлен.
Если не установлен ни один флаг, объект открывается для эксклюзивного
использования через его описатель.
Именованные разделы, также называемые объектами-проекциями, мо-
гут находиться в файлах на диске или в файле подкачки. Открытый опи-
сатель спроецированного файла может помешать удалению этого файла.
Именованные разделы из файла подкачки нужны для создания общих об-
ластей памяти для разных процессов.
Чтобы найти описатели объекта по имени, добавьте имя объекта в ко-
мандную строку. Handle покажет список всех описателей объектов, содер-
жащих указанное имя. Поиск выполняется без учета регистра. При поиске
объекта по имени можно добавить параметр –u, чтобы отображались также
имена учетных записей пользователей, от имени которых работают процес-
сы, владеющие перечисленными описателями.
Поиск объекта по имени изменяет формат выходных данных. Вместо
группировки описателей по процессу и использования разделителей, каж-
дая строка будет содержать имя процесса, PID, тип объекта, значение описа-
теля, имя описателя и, если указано, имя пользователя.
Например, если нужно найти процесс, использующий файл MyDataFile.
txt из папки MyDataFolder, можно выполнить следующую команду:
handle mydatafolder\mydatafile.txt
Чтобы просмотреть все типы описателей, а не только описатели файлов
и именованных разделов, добавьте параметр –a. Будет показан список всех
описателей объектов всех типов, включая объекты без имени. Можно ком-
бинировать параметры –a и –l (строчная L), чтобы получить список всех
объектов-разделов и размеров распределений файла подкачки (если тако-
вые имеются), связанных с каждым из них. Это может облегчить поиск уте-
чек памяти, вызванных проецируемыми разделами из файла подкачки.
Чтобы ограничить список процессов, включенных в выходные данные, до-
бавьте параметр –p, за которым укажите частичное или полное имя процесса или
его идентификатор. Если указано имя процесса, Handle покажет список описа-
телей процессов, чье имя образа совпадает или начинается с указанного текста.
Если указать PID, будет показан список описателей только этого процесса.
Рассмотрим примеры. Следующая команда выводит список описателей
файлов и именованных разделов, которыми владеют процессы, чье имя на-
чинается с «explore», включая все запущенные экземпляры Explorer.exe:
SIN_ch_07.indd 258
27.12.2011 14:30:30

Утилиты для работы с процессами и диагностики
Глава 7 259
handle -p explore
Часть выходных данных этой команды показана на рис. 7-19.
Рис. 7-19. Часть выходных данных команды handle -p explore
В отличие от предыдущей, следующая команда показывает список опи-
сателей объектов всех типов и для всех процессов, где имя объекта содержит
слово «explore».
handle -a explore
На рис. 7-20 показана часть выходных данных этого поиска по имени объ-
екта, включающих процессы, имеющие описатели файлов, разделов реестра,
процессов и потоков с текстом «explore» в имени.
Рис. 7-20. Часть выходных данных команды handle -a explore
В следующем примере продемонстрирован поиск имени объекта, со-
держащего пробел, с включением имени пользователя в выходные данные.
Отображаются объекты всех типов, содержащие искомое имя, включая раз-
делы реестра, имя которых начинается с буквы «с»:
handle -a -p c -u «session manager»
Выходные данные этой команды показаны на рис. 7-21.
Для запуска Handle требуются администраторские права. Так как некото-
рые объекты предоставляют полный доступ только системе, но не админи-
страторам, обычно можно получить более полные данные, запустив Handle
от имени системы, используя PsExe (см. главу 6). Если Handle.exe и PsExec
SIN_ch_07.indd 259
27.12.2011 14:30:30

260 Часть
II
Работа с утилитами
находятся в папках, включенных в системную переменную PATH, можно ис-
пользовать следующую команду:
psexec -s handle -accepteula -a
Рис. 7-21. Выходные данные команды handle -a -p c -u «session manager»
Счетчики описателей
Чтобы посмотреть, сколько объектов каждого типа открыто, используйте па-
раметр –s. Будет показан список объектов всех типов, для которых в системе
имеются любые открытые описатели, и число описателей каждого объекта.
В конце списка будет показано общее число описателей.
Чтобы получить информацию только для определенных процессов, до-
бавьте параметр –p, за которым укажите полное или частичное имя процесса
или идентификатор:
handle -s [-p процесс|PID]
Используя алгоритм сопоставления имен процессов, описанного в раз-
деле «Поиск и получение списка описателей», Handle показывает число
описателей объектов, имеющихся у указанного процесса или процессов и у
объектов определенного типа, а в конце подсчитывает общее число описате-
лей. Следующая команда отображает список счетчиков описателей для всех
процессов Explorer в системе:
handle -s -p explorer
Выходные данные будут следующими:
Handle type summary:
ALPC Port : 44
Desktop : 5
Directory : 5
EtwRegistration : 371
Event : 570
File : 213
IoCompletion : 4
Key : 217
KeyedEvent : 4
SIN_ch_07.indd 260
27.12.2011 14:30:31

Утилиты для работы с процессами и диагностики
Глава 7 261
Mutant : 84
Section : 45
Semaphore : 173
Thread : 84
Timer : 7
TpWorkerFactory : 8
UserApcReserve : 1
WindowStation : 4
WmiGuid : 1
Total handles: 1840
Закрытие описателей
Как говорилось ранее, процесс может освободить описатель на объект, когда
этот объект больше не нужен ему, а оставшиеся описатели будут закрыты,
когда процесс завершится. При помощи Handle можно закрывать описате-
ли, открытые процессом, не завершая этот процесс. Обычно это рискованно.
Поскольку процесс, владеющий описателем, не знает о том, что этот опи-
сатель закрыт, использование этой функции может привести к поврежде-
нию данных или сбою в приложении; закрытие описателя в системном про-
цессе или критически важном процессе пользовательского режима, таком
как Csrss, может привести к сбою в системе. Кроме того, при последующем
распределении ресурсов тем же процессом может быть получено старое зна-
чение описателя, так как оно больше не используется. Если программа по-
пытается обратиться к уже закрытому объекту, она может получить не тот
объект, который ожидает.
Помните об этом, когда решите закрыть описатель. Синтаксис команд-
ной строки для закрытия описателя следующий:
handle -c значение_описателя -p PID [-y]
Значение описателя интерпретируется как шестнадцатеричное число, а
владеющий процесс должен быть задан по PID. Прежде чем закрыть опи-
сатель, Handle показывает информацию о нем, включая его тип и имя, и за-
прашивает подтверждение. Подтверждение можно пропустить, добавив в
командную строку параметр –y.
Windows защищает некоторые описатели объектов, так что их нельзя за-
крыть, за исключением случаев с принудительным завершением процесса.
Попытки закрытия таких описателей заканчиваются неудачей без каких-
либо уведомлений, и Handle сообщает, что описатель закрыт, хотя на самом
деле это не так.
SIN_ch_07.indd 261
27.12.2011 14:30:31