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

ВУЗ: Не указан

Категория: Книга

Дисциплина: Операционные системы

Добавлен: 29.10.2018

Просмотров: 33019

Скачиваний: 742

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Утилиты для работы с процессами и диагностики 

Глава 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


background image

258  Часть 

II   

Работа с утилитами

Описатели файлов кроме обычных файлов могут включать папки, драй-

веры устройств и конечные точки связи. Информация об описателе файла 
включает режим совместного использования, установленный при открытии 
описателя. Флаги совместного использования заключаются в скобки и мо-
гут быть следующими: RW и 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


background image

Утилиты для работы с процессами и диагностики 

Глава 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


background image

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


background image

Утилиты для работы с процессами и диагностики 

Глава 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